pytorch训练(一)——如何使用pytorch创建自己的数据集(含图像的分割处理-一个样本图片分为多个样本图片)
代码链接: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。
- tensorflow训练自己的数据集实现CNN图像分类2(保存模型&测试单张图片)
- PyTorch(三)——使用训练好的模型测试自己图片
- 使用python实现一个可以使用电脑摄像头的程序,对每一帧图片进行如下处理,切割出图像1/4图像作为显示
- 【PyTorch图像语义分割】4. 使用训练好的模型测试
- TensorFlow学习笔记(八) 如何训练自己的图片模型-基于inception模型(未完成)使用迁移学习和从头学习
- 使用QT实现一个图像处理软件1 —— 图片的加载和显示
- Tensorflow 如何使用自己cifar10训练模型检测一张任意的图片
- 练习3-7 使用cvCmp()创建一个掩码。加载一个真实的图像。使用cvSplit()将图像分割成红,绿,蓝三个单通道图像。
- Android如何使用XML创建一个环形渐变颜色图片
- pytorch如何用自己训练好的模型预测新的图片类型?
- PyTorch创建分割数据集(数据:图像 + 标签:图像)
- 如何使用VC/MFC创建一个线程池
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之创建一个灵活的UI
- 如何在ASP.NET中使用Syndication创建一个RSS源
- 如何快速创建一个AJAX的"加载"的图片效果
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之使用Support Library
- 如何使用自己电脑搭建一个外网可以访问的服务器
- N-Tiers使用ObjectDataSouce如何自己处理中间层传回的错误讯息
- 如何创建一个映射驱动器使用的网络连接对话框
- 如何创建一个不使用xib的helloworld;