pytorch训练(一)——如何使用pytorch创建自己的数据集(含图像的分割处理-一个样本图片分为多个样本图片)

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正。 https://blog.csdn.net/qq_36107350/article/details/89029044

代码链接:https://github.com/duchp/python-all/tree/master/BreakHis

前言(博主的废话感悟)

经过研一上半学期的各种颓废,迷茫以及瞎学,博主终于在研一下半学期正式走入了研究的轨道中,那么像我们这种方向的研究生,入门研究第一件要做的事情就是复现论文~

论文首先是要读懂,然后get它使用的数据集(这个一般论文里面作者会提到的),下载下来之后呢,第一件事情就是读取它,并且根据自己使用的框架(博主这里用的pytorch)建立它所需要的数据集类型,pytorch的数据类型是Dataset,也就是torch.utils.data.Dataset结构,我们需要将下载好的数据集建立成这样的结构,才能进行后续的过程(比如分batch,搭建网络,预训练balabala的)

一、图片分割

这里博主读了一篇论文,并且get了它的数据集,但是文章中提到要将原本700X460大小的图片每张都分割成294张32X32的小图,并且这些小图的像素点是不重合的。那至于具体怎么分割,论文只字不提= =,所以本机智girl就算了一下,发现700/32为21余28,460/32为14余12,21x14正好294。嗯,那问题来了,多余的像素点我应该如何分配呢~这里博主本着试验的心态,将多余的像素点分配在了边缘,也就是图片上下分别剪掉14像素,左右分别剪掉6像素。
那下面借助PIL里面crop函数进行分割~
由于我们之后训练网络的时候需要数据的标签,所以在对图像分割的时候,应当将标签一同传入分割函数中,上代码:

def img_seg(img,label):
    hight,width = img.size
    w = 32
    id = 0
    j = 6
    new_imgs = []
    while(j + w <= width):
        i = 14
        while(i +w <= hight):
            new_imgs.append((img.crop((i, j, i + w, j + w)).convert('RGB'),label))
            id += 1
            i += w
        j += w
#    print(hight,width,id)
    return new_imgs

这样,我们每传入一张图片及其标签,返回的是包含这张图片分割成的294张图和标签的数组,数组维度为294X2。

二、图片分组

这篇论文用的五个分组数据分别做训练,这五组数据可以去BreakHis数据集发布者网页找到,下载相应的数据集,txt文件,py文件,再运行py文件,五组数据就分好了:
在这里插入图片描述

对每一组,后续操作都是一样的,那我这里以fold2为例(第二组)

三、torch数据集构建

pytorch的数据类型是Dataset,也就是torch.utils.data.Dataset结构,我们需要将处理好的数据集(这里只讨论fold2)构建成dataset结构,这样才能用于后续torch框架运算中。Dataset主要有两个函数:__init__和__getitem__需要写入:
具体代码如下,附上关键标注帮助理解~

class MyDataSet(torch.utils.data.Dataset):
    def __init__(self, root, datatxt, datatype,transform = None, target_transform = None):
        super(MyDataSet,self).__init__()
        fh = open(root + datatxt, 'r')
        imgs = []
       # j = 0
        for line in fh:
            columns = line.split('|')       #分割txt文件每行路径
            if columns[3].replace("\n","") == datatype:    #读取datatype类型文件,为train(训练集)或test(测试集)
                imgname = columns[0]
                imglb = imgname[4]
                if imglb == 'B':  #类型为B的赋值为0(二分类问题)
                    imglb = 0
                else:             #类型为M的复制为1(二分类问题)
                    imglb = 1
                lb = []
                mag = columns[1]  # 图像方法倍数40, 100, 200, or 400  
                fold = columns[2]
                img = Image.open((root + '%s/' + '%sX/' + imgname )% (datatype,mag)).convert('RGB')   #打开图片
                new_img = img_seg(img,imglb)   #图片分割为294张小图,标签一致
                imgs.extend(new_img)        
                
        self.imgs = imgs
        self.transform = transform
        self.target_transform = target_transform
        
    def __getitem__(self,index):
        img,target = self.imgs[index]
        if self.transform is not None:
            img = self.transform(img)
        return img,target
    
    def __len__(self):
        return len(self.imgs)

上面是dataset类的构建,运行它来创建我们的训练集和测试集:

root = './fold2/'  #这里是我放数据的路径,根据自己情况更改
# 构建训练集
fold2_train_data = MyDataSet(root = root,datatxt = 'dsfold2.txt',datatype = 'train',transform = torchvision.transforms.ToTensor())
# 构建测试集
fold2_test_data = MyDataSet(root = root,datatxt = 'dsfold2.txt',datatype = 'test',transform = torchvision.transforms.ToTensor())

四、分batch数据集创建

一般来说,在神经网络中,训练数据集数量太大,所以采用分batch来训练,那怎样将dataset数据集分batch呢~其实很简单:

kwarg = {'num_workers': 1,'pin_memory': True}
# batch大小设为64,可根据情况修改
trainloader2 = torch.utils.data.DataLoader(dataset = fold2_train_data,batch_size=64,shuffle = True, **kwarg)
testloader2 = torch.utils.data.DataLoader(dataset = fold2_test_data,batch_size=64,shuffle = True, **kwarg)

到这里为止,我们就将论文中所用到的训练集和测试集创建成了可用于pytorch的结构,batch大小为64。

猜你喜欢

转载自blog.csdn.net/qq_36107350/article/details/89029044
今日推荐