文章目录
- 1 前言
- 2 数据增强效果展示
- 3 数据增强程序实现
- 3.1 变换尺寸.Resize
- 3.2 中心裁剪.CenterCrop
- 3.3 随机裁剪.RandomSizedCrop
- 3.4 水平翻转.HorizontalFlip
- 3.5 垂直翻转.VerticalFlip
- 3.6 随机旋转.Rotate
- 3.7 随机亮度对比度.RandomBrightnessContrast
- 3.8 随机放射变换.ShiftScaleRotate
- 3.9 标准化.Normalize
- 3.10 转置.Transpose
- 3.11 网格畸变.GridDistortion
- 3.12 HUE(色相)和饱和度.HueSaturationValue
- 3.13 高斯噪声.GaussNoise
- 3.14 直方图均衡化.CLAHE
- 4 数据增强实战——组合使用
- 5 总结
1 前言
对于深度学习任务来说,理论上来说获取大量的数据是提高模型拟合能力并防止过拟合的最优解。但在实际应用中,受限于各种因素,我们很难拥有充足的数据。这时通过数据增强技术就可以高效的利用现有的数据,丰富我们的数据集。
本文将通过一张猫的图片来为大家在程序上讲解深度学习中常用数据增强的实现方式及使用效果。所有程序围绕albumentations
包展开(编辑器为jupyternotebook
)
2 数据增强效果展示
为了直观展示数据增强的效果并方便大家对不同增方式进行比对,下面以一张猫的图像为例,展示albumentations
包中14种数据增强后的图像效果,每种增强实现方式第3节都有对应的程序实现方式。(制图不易,觉得有收获的小伙伴请点赞收藏加关注,谢谢):

3 数据增强程序实现
导入相应数据包
import cv2
import albumentations
from albumentations.pytorch.transforms import ToTensorV2
import matplotlib.pyplot as plt
导入原始cat图像
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(5, 5))
plt.imshow(image) # 展示原始图片
输出结果:
3.1 变换尺寸.Resize
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
print(image.shape)
# 将图像尺寸重置为:320,320
image = albumentations.Resize(320, 320)(image=image)["image"]
print(image.shape)
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.2 中心裁剪.CenterCrop
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 中心裁切,height:要裁切的高度, width:要裁切的宽度
image = albumentations.CenterCrop(height=100, width=300, p=1)(image=image)["image"]
print(image.shape)
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.3 随机裁剪.RandomSizedCrop
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
print(image.shape)
# 随机大小裁切 裁切后的 height=1200, width=1200, min_max_height:在(50, 1200)这个范围中随机裁切一个尺寸,裁切下来后再放大到height
image = albumentations.RandomSizedCrop(min_max_height=(50, 200), height=500, width=281, p=1)(image=image)["image"]
print(image.shape)
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.4 水平翻转.HorizontalFlip
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 水平翻转
image1 = albumentations.HorizontalFlip(always_apply=True ,p=1.0)(image=image)['image']
plt.figure(figsize=(5, 5))
plt.imshow(image1)
输出结果:
3.5 垂直翻转.VerticalFlip
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 垂直翻转
image = albumentations.VerticalFlip(p=1.0)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.6 随机旋转.Rotate
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = albumentations.Rotate(limit=90, p=1)(image=image)["image"] # 在(-90, 90)之间随机旋转
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.7 随机亮度对比度.RandomBrightnessContrast
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = albumentations.RandomBrightnessContrast(brightness_limit=0.8, contrast_limit=0.2, brightness_by_max=True,p=1)(image=image)["image"]
# RandomBrightnessContrast默认参数亮度和对比度都是0.2,将亮度调到0.8后发现猫明显变亮
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.8 随机放射变换.ShiftScaleRotate
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# shift_limit 移动因子(以某个点为中心,进行中心对称),设置高和宽的移动因子取值范围,如果shift_limit是一个浮点数,
# 则移动因子的取值范围为(-shift_limit, shift_limit),shift_limit的取值范围的绝对值应在[0,1]之间,默认值是(-0.0625, 0.0625).
# scale_limit 缩放因子范围,进行缩放,其取值范围为[0, 1] 默认为(-0.1, 0.1)
# rotate_limit 旋转角度 默认为(-45, 45)
image = albumentations.ShiftScaleRotate(
shift_limit=0.0625, scale_limit=0.1, rotate_limit=45, p=1.0 # 对图片进行平移(translate)、缩放(scale)和旋转(roatate)
)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.9 标准化.Normalize
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 标准化操作,显示出来的不是正常的图片是值缩放到[0,1]之间后的图片,一般处理完图片后会再缩放回去,
# [0.485, 0.456, 0.406] 均值,[0.229, 0.224, 0.225] 标准差 max_pixel_value最大像素值,图片的最大像素值为255
image = albumentations.Normalize(
[0.485, 0.456, 0.406], [0.229, 0.224, 0.225],
max_pixel_value=255.0, always_apply=True
)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.10 转置.Transpose
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = albumentations.Transpose(p=1)(image=image)["image"] # 交换行和列 即转置
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.11 网格畸变.GridDistortion
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 网格畸变, 变瘦和变胖是随机的
image = albumentations.GridDistortion(p=1)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.12 HUE(色相)和饱和度.HueSaturationValue
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 随机改变图片的 HUE(色相)、饱和度和值
image = albumentations.HueSaturationValue(p=1)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.13 高斯噪声.GaussNoise
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 高斯噪音
image = albumentations.GaussNoise(var_limit=(10, 1000), p=1)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
3.14 直方图均衡化.CLAHE
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 自适应直方图均衡化
image = albumentations.CLAHE(clip_limit=2, p=1)(image=image)["image"]
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
4 数据增强实战——组合使用
在实际任务种,我们希望获得的数据尽可能多样化,所以数据增强往往都是多种方法并行的。这是就需要用到albumentations包种的.Compose方法对上述介绍的每种数据增强操作进行组合使用。
image = cv2.imread('./cat.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
print(image.shape)
# 组合操作
image = albumentations.Compose([
albumentations.CLAHE(),
# 转置
albumentations.Transpose(),
# 随机仿射变换
albumentations.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.50, rotate_limit=45, p=.75),
# 模糊
albumentations.Blur(blur_limit=3),
# 光学畸变
albumentations.OpticalDistortion(),
# 网格畸变
albumentations.GridDistortion(),
# 随机改变图片的HUE和饱和度和值
albumentations.HueSaturationValue()
], p=1.0)(image=image)['image']
print(image.shape)
plt.figure(figsize=(5, 5))
plt.imshow(image)
输出结果:
5 总结
albumentations包集成了大部分常见的数据增强方法,并且能跟pytorch联动直接处理用于深度学习的数据。关于它的安装及一些代码的详细注释可见链接:albumentations传送门。