数据读取和预处理/2√代码:归一化处理方式×2、裁剪/旋转/翻转、中心裁剪完整案例
归一化处理×2:
关于torchvision.transforms和compose
from torchvision import transforms ->进入transform 定义了很多class的工具箱
关于compose:
函数说明:torchvision.transforms是pytorch中的图像预处理包,一般用Compose把多个步骤整合到一起,transforms中的函数(link给出了)
Python图像库PIL(Python Image Library)是python的第三方图像处理库,但由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。
transforms.Compose()使用:torchvision是pytorch的一个图形库,服务于PyTorch深度学习框架,主要用来构建计算机视觉模型。torchvision.transforms主要用于常见的图形变换。
torchvision的构成如下:
torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
torchvision.models: 包含常用的模型结构(含预训练模型)如AlexNet、VGG、ResNet等
torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
torchvision.utils: 其他的一些有用的方法。
举列了一些常见操作
class torchvision.transforms.CenterCrop(size) 将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。
class torchvision.transforms.RandomCrop(size, padding=0) 切割中心点的位置随机选取。size可以是tuple也可以是Integer。
class torchvision.transforms.RandomHorizontalFlip 随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
class torchvision.transforms.RandomSizedCrop(size, interpolation=2) 先将给定的PIL.Image随机切,然后再resize成给定的size大小。
class torchvision.transforms.Pad(padding, fill=0) 将给定的PIL.Image的所有边用给定的pad value填充。
padding:要填充多少像素 fill:用什么值填充
eg1.
from torchvision import transforms from PIL import Image padding_img = transforms.Pad(padding=10, fill=0) img = Image.open('test.jpg') print(type(img)) print(img.size) padded_img=padding(img) print(type(padded_img)) print(padded_img.size)Compose()类的主要作用是串联多个图片变换的操作,会将transforms列表里面的transform操作进行遍历。Compose里面的参数实际上就是个列表,而这个列表里面的元素就是你想要执行的transform操作。
给了一个具体的例子,及单步代码jupyter过程化(每一个步骤处理完的图像也给哦):
transforms.Compose([transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])transforms.RandomResizedCrop(224)将给定图像随机裁剪为不同的大小和宽高比,然后缩放所裁剪得到的图像为制定的大小;(即先随机采集,然后对裁剪得到的图像缩放为同一大小),默认scale=(0.08, 1.0)该操作的含义在于:即使只是该物体的一部分,我们也认为这是该类物体;
transforms.RandomHorizontalFlip() 以给定的概率随机水平旋转给定的PIL的图像,默认0.5
transforms.ToTensor() 将给定图像转为Tensor
transforms.Normalize() 归一化处理
from PIL import Image # 操作1 img = Image.open("./demo.jpg") print("原图大小:",img.size) data1 = transforms.RandomResizedCrop(224)(img) print("随机裁剪后图片大小:",data1.size) data2 = transforms.RandomResizedCrop(224)(img) data1 = transforms.RandomResizedCrop(224)(img) plt.subplot(2,2,1),plt.imshow(img),plt.title("原图") plt.subplot(2,2,2),plt.imshow(data1),plt.title("转换后的图1") plt.subplot(2,2,3),plt.imshow(data2),plt.title("转换后的图2") plt.subplot(2,2,4),plt.imshow(data3),plt.title("转换后的图3") plt.show() # 操作2 img = Image.open("./demo.jpg") img1 = transforms.RandomHorizontalFlip()(img) img2 = transforms.RandomHorizontalFlip()(img) img3 = transforms.RandomHorizontalFlip()(img) plt.subplot(2,2,1),plt.imshow(img),plt.title("原图") plt.subplot(2,2,2), plt.imshow(img1), plt.title("变换后的图1") plt.subplot(2,2,3), plt.imshow(img2), plt.title("变换后的图2") plt.subplot(2,2,4), plt.imshow(img3), plt.title("变换后的图3") plt.show() # 操作3、4 img = Image.open("./demo.jpg") img = transforms.ToTensor()(img) img = transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])(img) print(img)plt.subplot(m,n,p) #要生成m行n列,这是第p个图plt.subplot('行','列','编号')
c
c
c
c
c
c
对分割的一些理解:基于深度学习来做医学图像处理,主要的工作集中在了数据预处理部分:深入理解医学图像的格式和特点;设计合适的图像预处理操作增强目标特征;将原始格式的数据处理为适合深度学习模型输入的格式。这三点也是从自然图像处理转到医学图像处理过程中最困难的三点。 模型的区别并不会对基于深度学习的医学图像分割产生太大的影响。换句话说,对于自然图像分割很优秀的网络模型,完全可以直接迁移到医学图像上来(反之亦然),效果如何只能训完看看了(如非常著名的FCN、SegNet、U-Net等,特别是U-Net最初就是在MICCAI上发表的)。当然,如果要高效的设计训练模型,还是要结合数据特点(如待分割对象的尺寸范围、2D还是3D等等)进行网络设计。AutoDL技术2019年效果突出Neural Architecture Search: A Survey),估计以后网络模型设计难以恰饭。
医学影像数据集:
Challenges - Grand Challenge (grand-challenge.org)
Introduction - Grand Challenge (grand-challenge.org)
待阅读:
pytorch中自定义dataset读取数据:讲述如何对自己的数据集进行训练集以及验证集的划分,并通过自定义的dataset去读取并打包成一个个batch数据。
使用PyTorch中的Dataset与DataLoader构建自己的数据集
个人记录:
分割Pipeline