阿里云天池零基础入门CV赛事(4)——数据扩增

Tesk 2 数据扩增

在深度学习中数据扩增方法非常重要,数据扩增可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力。

以torchvision为例,常见的数据扩增方法包括:

transforms.CenterCrop 对图片中心进行裁剪
transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行变换
transforms.Grayscale 对图像进行灰度变换
transforms.Pad 使用固定值进行像素填充
transforms.RandomAffine 随机仿射变换
transforms.RandomCrop 随机区域裁剪
transforms.RandomHorizontalFlip 随机水平翻转
transforms.RandomRotation 随机旋转
transforms.RandomVerticalFlip 随机垂直翻转

使用Image读取图像,图像的大小为(125,200, 3)

from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
img = Image.open("./cat1.jpg")
img

1 对图片中心进行裁剪
torchvision.transforms.CenterCrop(size)

img_CenterCrop = transforms.CenterCrop((90, 120))(img)
img_CenterCrop

2 对图像颜色的对比度、饱和度和零度进行变换
torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
brightnes(亮度):取值范围(0, 1)
contrast(对比度):取值范围(0, 1)
saturation(饱和度):取值范围(0, 1)
hue:取值范围(-0.5,0.5)

img_ColorJitter = transforms.ColorJitter(0.5, 0.5, 0.5)(img)
img_ColorJitter

3 将图像转化为灰度图
torchvision.transforms.Grayscale(num_output_channels = 1 )
输出通道数为1或3

img_Gray = transforms.Grayscale(1)(img)
img_Gray

使用matplotlib输出显示图像

plt.figure(figsize=(5, 5))
plt.subplot(221)
plt.imshow(img), plt.title("original"), plt.axis('off')
plt.subplot(222)
plt.imshow(img_CenterCrop), plt.title("centercrop"), plt.axis('off')
plt.subplot(223)
plt.imshow(img_ColorJitter), plt.title("colorjitter"), plt.axis('off')
plt.subplot(224)
plt.imshow(img_Gray, cmap=plt.cm.gray), plt.title('gray'), plt.axis('off')
plt.show()

输出图像结果:
阿里云天池零基础入门CV赛事(4)——数据扩增_第1张图片
4 使用固定值进行像素填充
torchvision.transforms.Pad(padding,fill = 0,padding_mode =‘constant’ )
padding: 边框填充
fill:像素填充值,用于恒定填充
padding_mode: 填充类型, 常量,边缘,反射或对称,默认为常数。
constant 常数:具有恒定值的填充,此值由填充指定
edge 边缘:在图像的边缘具有最后一个值的填充
reflect 反射:在不重复边缘上最后一个值的情况下反射图像的焊盘
symmetric 对称:具有图像反射的填充板,其边缘上的最后一个值重复

img_Pad_1 = transforms.Pad(20, 0 ,padding_mode='constant')(img)
img_Pad_1
img_Pad_2 = transforms.Pad(20, 0, padding_mode='edge')(img)
img_Pad_2
img_Pad_3 = transforms.Pad(20, 0, padding_mode='reflect')(img)
img_Pad_3
img_Pad_4 = transforms.Pad(20, 0, padding_mode='symmetric')(img)
img_Pad_4

plt.figure(figsize=(5, 5))
plt.subplot(221)
plt.imshow(img_Pad_1), plt.title("constant"), plt.axis('off')
plt.subplot(222)
plt.imshow(img_Pad_2), plt.title("edge"), plt.axis('off')
plt.subplot(223)
plt.imshow(img_Pad_3), plt.title("reflect"), plt.axis('off')
plt.subplot(224)
plt.imshow(img_Pad_4), plt.title('symmetric'), plt.axis('off')
plt.show()

输出图像结果:
阿里云天池零基础入门CV赛事(4)——数据扩增_第2张图片
5 随机仿射变换
torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=False, fillcolor=0)
degrees: 旋转角度 0°是固定不动
translate:平移(a,b) a,b取值范围为(0,1)
scale: 比例缩放(a, b) a,b不能等于0

img_RandomAffine_1 = transforms.RandomAffine(30)(img) # 图像旋转30度
img_RandomAffine_2 = transforms.RandomAffine(0, (0.5,0))(img) # 图像沿X轴平移
img_RandomAffine_3 = transforms.RandomAffine(0, None, (0.5, 0.5))(img) # 图像缩小
img_RandomAffine_4 = transforms.RandomAffine(0, None, (2, 2))(img) # 图像放大

plt.figure(figsize=(6, 6))
plt.subplot(221)
plt.imshow(img_RandomAffine_1), plt.title("degrees 30"), plt.axis('off')
plt.subplot(222)
plt.imshow(img_RandomAffine_2), plt.title("translate X"), plt.axis('off')
plt.subplot(223)
plt.imshow(img_RandomAffine_3), plt.title("scale 0.5"), plt.axis('off')
plt.subplot(224)
plt.imshow(img_RandomAffine_4), plt.title('scale 2'), plt.axis('off')
plt.show()

图像输出结果:
阿里云天池零基础入门CV赛事(4)——数据扩增_第3张图片
6 随机区域裁剪
torchvision.transforms.RandomCrop(size,padding = None,pad_if_needed = False,fill = 0,padding_mode =‘constant’ )

img_RandomCrop = transforms.RandomCrop(100)(img) # 随机区域裁剪100*100的像素

7 随机水平翻转
torchvision.transforms.RandomHorizontalFlip(p = 0.5 )

img_RandomHorizontalFlip = transforms.RandomHorizontalFlip(1)(img) # 根据概率随机水平翻转

8 随机旋转
torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)

img_RandomRotation = transforms.RandomRotation(90)(img) # 随机旋转

9 随机垂直翻转
torchvision.transforms.RandomVerticalFlip(p = 0.5 )

img_RandomVerticalFlip = transforms.RandomVerticalFlip(1)(img) # 随机垂直翻转
plt.figure(figsize=(6, 6))
plt.subplot(221)
plt.imshow(img_RandomCrop), plt.title("RandomCrop"), plt.axis('off')
plt.subplot(222)
plt.imshow(img_RandomHorizontalFlip), plt.title("RandomHorizontalFlip"), plt.axis('off')
plt.subplot(223)
plt.imshow(img_RandomRotation), plt.title("RandomRotation"), plt.axis('off')
plt.subplot(224)
plt.imshow(img_RandomVerticalFlip), plt.title('RandomVerticalFlip'), plt.axis('off')
plt.show()

图像显示结果:
阿里云天池零基础入门CV赛事(4)——数据扩增_第4张图片
小结
展示了几种数据扩增的方法,将图像进行几何变形后添加到训练集中,这样可以是训练集扩大。这样虽然不如额外收集新的图像那么好,但是可以减少搜集图像所花费的时间。

总有一个遗忘的过程,记录一下为以后查找方便。

你可能感兴趣的:(计算机视觉,python,pytorch)