【DATASETS & DATALOADERS】不同文件夹生成dataloader/数据集的制作

文章介绍了如何使用Python的PyTorch库处理图像数据,通过自定义`MyDataSet`类遍历文件夹中的图片,调整尺寸并转换为Tensor,然后利用`ImageFolder`功能简化数据组织,最后将数据划分为训练集和测试集,生成DataLoader用于模型训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  for 循环遍历每个文件夹

import os
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
from PIL import Image 

class MyDataSet(Dataset): # 定义 class MyDataSet
    def __init__(self,datapath):
        super(MyDataSet, self).__init__()
        imgs = []
        i = 0 # 分类label
        for path in datapath:
            for file in os.listdir(path):
                if file == 'desktop.ini': # 遇到隐藏文件直接跳过
                    continue
                #print(file)
                img = Image.open(path+"\\"+file) # 遍历文件夹内的图片
                img = img.resize((32,32),Image.ANTIALIAS) # 将所有图片转化为相同大小(32,32)
                img =  transforms.ToTensor()(img) # 将img 转化为tensor 方便使用pytorch框架
                imgs.append((img,i)) # 生成(img,label) 的字典列表
            i += 1 #用作标签label
        self.imgs = imgs
    def __len__(self):
        return len(self.imgs)
    def __getitem__(self, index):
        return self.imgs[index] 

# 定义data path 列表
data_path = ["C:\\Users\\KilLogic\\summer-2023\\HW3\\data\\车辆分类数据集\\bus",
"C:\\Users\\KilLogic\\summer-2023\\HW3\\data\\车辆分类数据集\\car",
"C:\\Users\\KilLogic\\summer-2023\\HW3\\data\\车辆分类数据集\\truck"]

data = MyDataSet(data_path)

train_size = 800 # 1567 张图片 800 作为train 剩下的作为test
test_size = len(data)-train_size
# 将data 随机分开作为训练集 和测试集
train_dataset, test_dataset = torch.utils.data.random_split(data, [train_size, test_size])

train_loader = DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=0)
test_loader = DataLoader(test_dataset,batch_size=batch_size,shuffle=True,num_workers=0)

2.  使用dataset.ImageFolder

 使用该函数之后能直接生成一个字典表。

  •  遍历key,value,将key复制到img
  •  将img resize(将所有图片大小统一)
  •  将img 转化为Tensor
  • 将处理过的数据组成imgs字典(img,value)
  • 之后生成data_loader,每个data_loader 即为 imgs 字典的迭代器
from torchvision import datasets

data = datasets.ImageFolder(root = "C:\\Users\\KilLogic\\summer-2023\\HW3\\data\\车辆分类数据集")
for i in range(len(data)):
    print(i,data[i])
output
0 (<PIL.Image.Image image mode=RGB size=85x120 at 0x14703C438B0>, 0)
1 (<PIL.Image.Image image mode=RGB size=140x195 at 0x14703C43A00>, 0)
2 (<PIL.Image.Image image mode=RGB size=86x93 at 0x14703C43A30>, 0)
3 (<PIL.Image.Image image mode=RGB size=152x205 at 0x14703C439A0>, 0)
4 (<PIL.Image.Image image mode=RGB size=150x174 at 0x14703C43A00>, 0)
5 (<PIL.Image.Image image mode=RGB size=85x108 at 0x14703C43A30>, 0)
6 (<PIL.Image.Image image mode=RGB size=60x85 at 0x14703C439A0>, 0)
7 (<PIL.Image.Image image mode=RGB size=95x142 at 0x14703C43A00>, 0)
8 (<PIL.Image.Image image mode=RGB size=145x205 at 0x14703C43A30>, 0)
9 (<PIL.Image.Image image mode=RGB size=84x119 at 0x14703C439A0>, 0)


class MyDataSet(Dataset):
    def __init__(self,datapath):
        super(MyDataSet, self).__init__()
        dicts = datasets.ImageFolder(root = datapath)
        imgs = []
        i = 0
        for key,value in dicts:
            img = key
            img = img.resize((32,32),Image.ANTIALIAS)
            img =  transforms.ToTensor()(img)
            imgs.append((img,value))
        self.imgs = imgs
        print(imgs)
    def __len__(self):
        return len(self.imgs)
    def __getitem__(self, index):
        pic,label = self.imgs[index]
        return self.imgs[index]
data_path = "C:\\Users\\KilLogic\\summer-2023\\HW3\\data\\车辆分类数据集"
data = MyDataSet(data_path)
train_size = 800
test_size = len(data)-train_size
train_dataset, test_dataset = torch.utils.data.random_split(data, [train_size, test_size])
#print(len(train_dataset),len(test_dataset),len(data))

train_loader = DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=0)
test_loader = DataLoader(test_dataset,batch_size=batch_size,shuffle=True,num_workers=0)

 

3. 后续添加

能力有限,欢迎吐槽交流。

### 使用 PyTorch 实现 SSD 模型训练自定义 VOC 数据集 #### 准备工作环境 为了确保能够顺利运行SSD模型并完成训练,需要先安装必要的依赖库。可以使用`requirements.txt`来管理这些依赖项。 ```bash pip install -r requirements.txt ``` 其中 `requirements.txt` 文件应包含如下内容: - torch&gt;=1.8.0 - torchvision&gt;=0.9.0 - numpy - matplotlib - pillow #### 创建数据列表 创建用于加载数据的数据列表文件对于后续操作至关重要。这一步骤通过执行`create_data_lists.py`脚本来实现[^3]。该脚本会读取指定路径下的VOC格式标注文件,并生成适合于SSD使用的JSON格式的train.json和test.json文件。 ```python from utils import create_data_lists if __name__ == &#39;__main__&#39;: # 修改为实际存储VOC2007与VOC2012的位置以及希望保存转换后json文件夹位置 create_data_lists( voc07_path=&#39;./data/VOCdevkit/VOC2007&#39;, voc12_path=&#39;./data/VOCdevkit/VOC2012&#39;, output_folder=&#39;./data&#39; ) ``` #### 定义配置参数 在开始之前,还需要设置一些基本的超参数和其他全局变量。这部分通常放在项目的根目录下一个名为`config.py`或类似的Python模块里。 ```python import os class Config(object): data_root = &#39;./data&#39; # 存放数据集及其衍生品(如上述提到的json文件) checkpoint_dir = &#39;./checkpoints&#39; # 训练过程中产生的checkpoint将会被存于此处 cfg = Config() os.makedirs(cfg.checkpoint_dir, exist_ok=True) ``` #### 构建数据加载器 接下来要做的就是编代码片段以实例化PyTorch DataLoader对象。此过程涉及到从先前准备好的JSON文件中解析样本信息,并将其封装成Dataset类的一部分。之后再利用DataLoader来进行批量处理。 ```python from datasets.voc_dataset import VOCDataset from torch.utils.data import DataLoader def get_dataloaders(batch_size=32): train_ds = VOCDataset(json_file=os.path.join(cfg.data_root,&#39;train.json&#39;)) val_ds = VOCDataset(json_file=os.path.join(cfg.data_root,&#39;val.json&#39;)) train_loader = DataLoader(train_ds,batch_size=batch_size,shuffle=True,num_workers=4,collate_fn=train_ds.collate_fn) val_loader = DataLoader(val_ds,batch_size=batch_size*2,shuffle=False,num_workers=4,collate_fn=val_ds.collate_fn) return train_loader,val_loader ``` 注意这里的VOCDataset是从项目源码中的datasets包导入而来;collate_fn函数负责将不同长度的目标框统一整理成固定尺寸供网络输入层接受。 #### 初始化模型结构 现在转向核心部分&mdash;&mdash;初始化SSD架构本身。这里假设已经下载好了amdegroot版本的ssd.pytorch仓库作为基础框架[^1]。在此基础上稍作调整即可适应新的任务需求。 ```python from models.ssd import build_ssd net = build_ssd(&#39;train&#39;, size=(300, 300), num_classes=len(CLASSES)+1).cuda() # 加载预训练权重 (如果有的话),以便加速收敛速度 try: net.load_state_dict(torch.load(os.path.join(cfg.checkpoint_dir,&quot;ssd300_vgg_base.pth&quot;))) except FileNotFoundError as e: print(f&quot;No pretrained weights found at {e.filename}. Training will start from scratch.&quot;) ``` 此处需要注意的是,在构建SSD时指定了图像大小(这里是300x300)以及类别数量(包括背景)。另外还尝试加载了一个可能存在的vgg base预训练模型以帮助更快地达到较好的性能水平。 #### 设置优化策略 最后但同样重要的一环便是挑选合适的损失函数、学习率调度机制以及其他辅助工具来指导整个迭代更新流程。 ```python criterion = MultiBoxLoss(priors_cxcy=net.priors_cxcy.cuda(), threshold=0.5, neg_pos_ratio=3, alpha=1.).cuda() optimizer = optim.SGD(net.parameters(), lr=1e-3, momentum=0.9, weight_decay=5e-4) scheduler = StepLR(optimizer, step_size=50, gamma=0.1) ``` 以上代码段设置了多盒损失(MultiBox Loss)[^4],随机梯度下降(SGD)作为主要求解算法,并引入了分步衰减的学习率调节方案。 #### 开始训练循环 一切就绪之后就可以正式开启一轮又一轮的前向传播加反向传播啦! ```python for epoch in range(start_epoch, epochs): ... scheduler.step() losses = [] for i,(images,boxes,labels,difficulties) in enumerate(tqdm(train_loader)): images = Variable(images.cuda()) boxes = [Variable(b.cuda()) for b in boxes] labels = [Variable(l.cuda()) for l in labels] predicted_locs,predicted_scores = net(images) loss = criterion(predicted_locs,predicted_scores,boxes,labels) optimizer.zero_grad() loss.backward() optimizer.step() losses.append(loss.item()) avg_loss = sum(losses)/len(losses) print(f&quot;Epoch [{epoch}/{epochs}], Avg Train Loss: {avg_loss:.4f}&quot;) ``` 这段逻辑实现了每轮次内的mini-batch级别的参数修正动作,并定期打印平均loss值方便监控进度情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值