您的位置:首页 > 其它

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

2019-04-20 17:53 1016 查看
版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正。 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。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐