数据增强
什么是数据增强
- 在一个已有数据集里面,进行不同的变换,使得数据有更多的多样性
- 在语音里面加入各种不同的背景噪音
- 改变图片的颜色和形状
如何使用数据增广进行训练
- 一般是在训练时在线生成的,而不是预先存储
- 通常是随机进行数据增广
常见的数据增广方法
① 翻转
② 切割
切割一般是在图片中切割一块出来,然后将它变成固定的形状(之所以是固定的形状,是因为卷积神经网络的输入通常是固定的,一般是224*224)
-
通过对图像进行随机裁剪,使物体以不同的比例出现在图像的不同位置,从而降低模型对目标位置的敏感性
-
如何进行切割(随机性原理)
- 随机高宽比:比如在某一个区间(比如[3/4,4/3])之间随机取一个数来作为切割部分的高宽比
- 随机大小:比如在某一个区间(比如[8%,100%])之间随机取一个数来作为切割部分的大小(切割部分占原始图像的比例)
- 随机位置:给定截取部分的形状大小,然后在原始图像上面进行随机切割
③ 颜色
改变颜色中四个比较重要的指标
- 色调
- 饱和度
- 对比度
- 明亮度
④ 其他 - 高斯模糊
- 将图片中的某一块抹掉
- 对整个图片进行变形
- 锐化
- 等等
某一种数据增强的方法有用,很多时候是因为测试集中某些图片和原始图片通过这种数据增强的方式处理之后的效果类似
- 很多时候应该从结果向前推,通过对现场部署的情况或者测试集可能发生的变化进行分析,由此来反推所需要进行的数据增强
- 在实践中,通常结合多种图像增广方法
总结
- 数据增广通过变形数据来获取多样性从而使得模型泛化性能更好
- 常见图片增广包括翻转、切割、变色
%matplotlib inline
import torch
import torchvision
from torch import nn
from matplotlib import pyplot as plt
import PIL
img = PIL.Image.open('../../img/cat1.jpg')
plt.imshow(img)
img.size
(1810, 1081)
def show_images(imgs, num_rows, num_cols, titles=None, scale=3):
figsize = (num_cols * scale, num_rows * scale)
_, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
axes = axes.flatten()
for i, (ax, img) in enumerate(zip(axes, imgs)):
if torch.is_tensor(img):
# Tensor Image
ax.imshow(img.numpy())
else:
# PIL Image
ax.imshow(img)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
if titles:
ax.set_title(titles[i])
return axes
def apply(img