数据增强 Data Augmentation
数据增强是一种技术,通过操作原始数据来增加输入数据。例如,对于图像,我们可以执行以下操作:旋转图像、翻转图像、添加高斯模糊等。
在深度学习项目中,寻找数据花费了相当多的时间。但在很多实际的项目中,我们难以找到充足的数据来完成任务。
为了要保证完美地完成项目,有两件事情需要做好:
- 寻找更多的数据;
- 数据增强。
还有一点要提一下,每一个epoch训练的数据分布都会有变化,这样可以训练模型的泛化能力。
数据增强的种类:
- 空间几何变换类:翻转,剪切,缩放变形,仿射
- 像素颜色变换类:噪声类、模糊类、HSV对比度变换、RGB颜色扰动、随机擦除法、超像素法(Superpixels)
- 多样本合成类:Smote
pixel augmentation
deformation augmentation
ScaleAug
CutOut
data-augmentation
from imgaug import augmenters as iaa
# pixel augmentation
class ImageAug(object):
def __call__(self, sample):
image, mask = sample
if np.random.uniform(0,1) > 0.5:
seq = iaa.Sequential([iaa.OneOf([
iaa.AdditiveGaussianNoise(scale=(0, 0.2 * 255)),
iaa.Sharpen(alpha=(0.1, 0.3), lightness=(0.7, 1.3)),
iaa.GaussianBlur(sigma=(0, 1.0))])])
image = seq.augment_image(image)
return image, mask
# deformation augmentation
class DeformAug(object):
def __call__(self, sample):
image, mask = sample
seq = iaa.Sequential([iaa.CropAndPad(percent=(-0.05, 0.1))])
seg_to = seq.to_deterministic()
image = seg_to.augment_image(image)
mask = seg_to.augment_image(mask)
return image, mask
class ScaleAug(object):
def __call__(self, sample):
image, mask = sample
scale = random.uniform(0.7, 1.5)
h, w, _ = image.shape
aug_image = image.copy()
aug_mask = mask.copy()
aug_image = cv2.resize(aug_image, (int (scale * w), int (scale * h)))
aug_mask = cv2.resize(aug_mask, (int (scale * w), int (scale * h)))
if (scale < 1.0):
new_h, new_w, _ = aug_image.shape
pre_h_pad = int((h - new_h) / 2)
pre_w_pad = int((w - new_w) / 2)
pad_list = [[pre_h_pad, h - new_h - pre_h_pad], [pre_w_pad, w - new_w - pre_w_pad], [0, 0]]
aug_image = np.pad(aug_image, pad_list, mode="constant")
aug_mask = np.pad(aug_mask, pad_list[:2], mode="constant")
if (scale > 1.0):
new_h, new_w, _ = aug_image.shape
pre_h_crop = int ((new_h - h) / 2)
pre_w_crop = int ((new_w - w) / 2)
post_h_crop = h + pre_h_crop
post_w_crop = w + pre_w_crop
aug_image = aug_image[pre_h_crop:post_h_crop, pre_w_crop:post_w_crop]
aug_mask = aug_mask[pre_h_crop:post_h_crop, pre_w_crop:post_w_crop]
return aug_image, aug_mask
class CutOut(object):
def __init__(self, mask_size, p):
self.mask_size = mask_size
self.p = p
def __call__(self, sample):
image, mask = sample
mask_size_half = self.mask_size // 2
offset = 1 if self.mask_size % 2 == 0 else 0
h, w = image.shape[:2]
cxmin, cxmax = mask_size_half, w + offset - mask_size_half
cymin, cymax = mask_size_half, h + offset - mask_size_half
cx = np.random.randint(cxmin, cxmax)
cy = np.random.randint(cymin, cymax)
xmin, ymin = cx - mask_size_half, cy - mask_size_half
xmax, ymax = xmin + self.mask_size, ymin + self.mask_size
xmin, ymin, xmax, ymax = max(0, xmin), max(0, ymin), min(w, xmax), min(h, ymax)
if np.random.uniform(0, 1) < self.p:
image[ymin:ymax, xmin:xmax] = (0, 0, 0)
return image, mask
class ToTensor(object):
def __call__(self, sample):
image, mask = sample
image = np.transpose(image,(2,0,1))
image = image.astype(np.float32)
mask = mask.astype(np.long)
return {'image': torch.from_numpy(image.copy()),
'label': torch.from_numpy(mask.copy())}
参考资料:
https://zhuanlan.zhihu.com/p/41679153
请多多指教。
文章标题:数据增强 Data Augmentation
本文作者:顺强
发布时间:2019-12-22, 23:59:00
原始链接:http://shunqiang.ml/cnn-data-augmentation/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。