数据集构建部分代码

前言总结

老师要求使用真实并且是我们的数据集,于是使用部分GID数据集。本周简单写了数据集部分代码,等后面写完再贴吧~

刚开始接触pytorch推荐学习土堆老师的视频

PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili

复现项目可以参考bubbliiing大佬

bubbliiiing-哔哩哔哩_bilibili

一、数据集的构建

pytorch关于构建数据集有两个重要的类:Dataset和Dataloader

本视频里所使用的都是环境pytorch1.1

1.Dataset:读取数据(图片+标签+索引)【p6,p14】

(1)基础构成

他有三个重要的类:Init,get_item,len

init—初始化数据根路径和文件读取路径

get_item—获取文件索引,return img,target

len—获得数据集长度

在这个视频里,我除了学到了这些不算崭新的知识点,还学到了pycharm控制台的用法,感谢土堆

python console可以更方便的显示修改的数据的类型和具体内容

from torch.utils.data import Dataset, DataLoader
import numpy as np
from PIL import Image
import os
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from torchvision.utils import make_grid

writer = SummaryWriter("logs")

class MyData(Dataset):

    def __init__(self, root_dir, image_dir, label_dir, transform):
        self.root_dir = root_dir
        self.image_dir = image_dir
        self.label_dir = label_dir
        self.label_path = os.path.join(self.root_dir, self.label_dir)
        self.image_path = os.path.join(self.root_dir, self.image_dir)
        self.image_list = os.listdir(self.image_path)
        self.label_list = os.listdir(self.label_path)
        self.transform = transform
        # 因为label 和 Image文件名相同,进行一样的排序,可以保证取出的数据和label是一一对应的
        self.image_list.sort()
        self.label_list.sort()

    def __getitem__(self, idx):
        img_name = self.image_list[idx]
        label_name = self.label_list[idx]
        img_item_path = os.path.join(self.root_dir, self.image_dir, img_name)
        label_item_path = os.path.join(self.root_dir, self.label_dir, label_name)
        img = Image.open(img_item_path)

        with open(label_item_path, 'r') as f:
            label = f.readline()

        # img = np.array(img)
        img = self.transform(img)
        sample = {'img': img, 'label': label}
        return sample

    def __len__(self):
        assert len(self.image_list) == len(self.label_list)
        return len(self.image_list)

if __name__ == '__main__':
    transform = transforms.Compose([transforms.Resize((256, 256)), transforms.ToTensor()])
    root_dir = "dataset/train"
    image_ants = "ants_image"
    label_ants = "ants_label"
    ants_dataset = MyData(root_dir, image_ants, label_ants, transform)
    image_bees = "bees_image"
    label_bees = "bees_label"
    bees_dataset = MyData(root_dir, image_bees, label_bees, transform)
    train_dataset = ants_dataset + bees_dataset

    # transforms = transforms.Compose([transforms.Resize(256, 256)])
    dataloader = DataLoader(train_dataset, batch_size=1, num_workers=2)

    writer.add_image('error', train_dataset[119]['img'])
    writer.close()
    # for i, j in enumerate(dataloader):
    #     # imgs, labels = j
    #     print(type(j))
    #     print(i, j['img'].shape)
    #     # writer.add_image("train_data_b2", make_grid(j['img']), i)
    #
    # writer.close()

(2)torchvision中的标准数据集调用

pytorch.org中有一个torchvision模块,集成了许多计算机视觉领域的常用数据集

ctrl+p快捷键显示类所需要的参数

import torchvision
from torch.utils.tensorboard import SummaryWriter

dataset_transform = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()
])

train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=dataset_transform, download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=dataset_transform, download=True)

# print(test_set[0])
# print(test_set.classes)
#
# img, target = test_set[0]
# print(img)
# print(target)
# print(test_set.classes[target])
# img.show()
#
# print(test_set[0])

writer = SummaryWriter("p10")
for i in range(10):
    img, target = test_set[i]
    writer.add_image("test_set", img, i)

writer.close()

2.Dataloader:以批次方式整合数据【p15】

Dataloader是将dataset里的数据通过Dataloader类进行整合

import torchvision

# 准备的测试数据集
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)

# 测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)

writer = SummaryWriter("dataloader")
for epoch in range(2):
    step = 0
    for data in test_loader:
        imgs, targets = data
        # print(imgs.shape)
        # print(targets)
        writer.add_images("Epoch: {}".format(epoch), imgs, step)
        step = step + 1

writer.close()

3.Transform:

from torch.utils.data import Dataset, DataLoader
from PIL import Image
import os
from torchvision import transforms

class MyData(Dataset):

    def __init__(self, root_dir, image_dir, label_dir, transform=None):
        self.root_dir = root_dir
        self.image_dir = image_dir
        self.label_dir = label_dir
        self.label_path = os.path.join(self.root_dir, self.label_dir)
        self.image_path = os.path.join(self.root_dir, self.image_dir)
        self.image_list = os.listdir(self.image_path)
        self.label_list = os.listdir(self.label_path)
        self.transform = transform
        # 因为label 和 Image文件名相同,进行一样的排序,可以保证取出的数据和label是一一对应的
        self.image_list.sort()
        self.label_list.sort()

    def __getitem__(self, idx):
        img_name = self.image_list[idx]
        label_name = self.label_list[idx]
        img_item_path = os.path.join(self.root_dir, self.image_dir, img_name)
        label_item_path = os.path.join(self.root_dir, self.label_dir, label_name)
        img = Image.open(img_item_path)
        with open(label_item_path, 'r') as f:
            label = f.readline()

        if self.transform:
            img = transform(img)


        return img, label

    def __len__(self):
        assert len(self.image_list) == len(self.label_list)
        return len(self.image_list)


transform = transforms.Compose([transforms.Resize(400), transforms.ToTensor()])
root_dir = "dataset/train"
image_ants = "ants_image"
label_ants = "ants_label"
ants_dataset = MyData(root_dir, image_ants, label_ants, transform=transform)
image_bees = "bees_image"
label_bees = "bees_label"
bees_dataset = MyData(root_dir, image_bees, label_bees, transform=transform)


4.Tensorboard:

(1)作用:绘制Loss损失函数曲线,显示图片

(2)ctrl+鼠标点击,可以查看pycharm类

(3)一个是要写代码,一个是终端里要运行,运行的时候必须指定文件夹,可以指定端口

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image

writer = SummaryWriter("logs")
image_path = "data/train/ants_image/6240329_72c01e663e.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)

writer.add_image("train", img_array, 1, dataformats='HWC')
# y = 2x
for i in range(100):
    writer.add_scalar("y=2x", 3*i, i)

writer.close()

5.两大法宝

查看和使用package

dir():查看工具里有什么

help():询问工具箱怎么使用

e.g. dir(torchvision.datasets) help(torchvision.datasets)

6.实践问题

(1)查看png标签图片真值

因为voc数据集的存储一般是直接将标签以类别数字存储,所以查看数据也在这里查看

首先转换为numpy,然后再查看 

注意:PIL中的Image对象没有直接的numpy数组接口,但可以使用numpy的asarray函数转换

注意:PIL中的Image对象没有直接的numpy数组接口,但可以使用numpy的asarray函数转换
from  PIL import Image
# 测试图片显示
img_path = "dataset/VOCdevkit/VOC2012/SegmentationClass/2007_000032.png"
img = Image.open(img_path)
# 查看这个图片numpy形式
import numpy as np
label_array = np.asarray(img, dtype=np.uint8)

print(label_array.shape)
print(np.unique(label_array))
print(label_array[200:210, 200:210])

 (2)transform在语义分割领域的常见使用方法(来自lbq学长和CSDN)

pytorch有数据增强工具箱transform,其中常见的数据增强方式包括:旋转、垂直翻转、水平翻转、放缩、剪裁、归一化等。

语义分割和图像分类的数据增强差异在于:语义分割是对图像的每个像素进行分类,所以在进行某些数据增强时,需要对标注图像(mask)进行同步操作,如旋转、剪裁、翻转等。

也许在数据集足够大的时候对数据增强进而扩充数据集并不是必要的,毕竟一个真实的数据集好过一千个虚拟的数据集

语义分割数据增强——图像和标注同步增强_数据增强标记也增强-CSDN博客

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VOC数据集是一种常用的目标检测数据集,其中包含了一系列图像和对应的标注信息。在使用VOC数据集进行目标检测任务时,代码的实现部分主要包括数据预处理、模型构建、训练与评估。 首先,数据预处理是指对VOC数据集进行预处理操作,以便于后续模型训练和评估。这部分代码主要包括图像的读取、尺寸统一化、数据增强等操作。例如,可以使用OpenCV库读取图像,将不同尺寸的图像进行统一化处理,以满足网络输入要求。同时,可以进行数据增强操作,如随机裁剪、旋转、水平翻转等,以增加数据样本的多样性和数量。 其次,模型构建是指搭建用于目标检测的模型结构。常用的目标检测模型包括Faster R-CNN、YOLO、SSD等。在代码中,需要根据所选模型的结构在网络中定义对应的层和结构,并确定损失函数、优化器等。例如,在Faster R-CNN模型中,需要实现RPN网络、ROI Pooling等关键模块,同时定义相关的损失函数(如分类损失和边界框回归损失)。 然后,训练阶段是指使用VOC数据集对目标检测模型进行训练。代码部分涵盖了数据集的划分、批量读取、前向传播、反向传播和参数更新等过程。例如,可以将VOC数据集划分为训练集和验证集,并使用mini-batch方式将数据输入网络进行前向计算,然后计算损失并反向传播更新参数,直到训练达到一定的迭代次数或其他停止条件。 最后,评估部分代码是用于评估训练得到的目标检测模型的性能和精度。常见的评估指标包括mAP、精确率、召回率等。代码中需要加载训练好的模型参数,对测试集数据进行预测,然后根据预测结果与真实标注进行对比,计算评估指标。 综上所述,针对VOC数据集的目标检测任务,代码部分包括数据预处理、模型构建、训练和评估等。这些代码的实现是为了更好地处理数据、构建模型、优化参数以及评估模型性能,从而实现高效准确的目标检测任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值