深度学习模型需要足够的数据支撑才能进行更好地训练,但实际生活中,作为开发者往往无法获取大量的数据,而专业的数据采集和标注公司提供的数据服务也并不便宜,因此,解决此问题有一个较为不错的初级方案,那就是利用图像处理方法,进行数据扩充。
我个人在学习和整理过程中,对目前数据扩充守法,无非是两类,一种常规手法,另一种为高级手法;
常规手法包含:变换,旋转,剪裁,缩放,锐化,噪声,卷积处理等,特点是利用传统数学形式对原图进行处理加工;
高级手法包含:强化学习的素材生成(例如Nvidia的GAN网络生成极为逼真的人脸模型),迁移学习的素材生成(例如将素材全部使用绘画技巧进行风格处理,得到全新的风格素材,如油画风格等)
由于个人正在复现热门论文,但ImageNet1000分类的数据太大,实在是等不了那么长时间,而10分类数据则较少,训练效果一般,因此想到了使用数据扩充手段来增加我的数据量;
这里记录了个人使用基于python的imgaug库来扩充数据集的过程;
imgaug库 github链接:https://github.com/aleju/imgaug
这个库具有几十种效果处理,因此属于很不错的使用工具库。
先看效果图:
左上角是原图,其它9张则是经过处理的九张新的数据图(包括通道随机改变颜色/噪点/像素丢失/颜色扰动/翻转/镜像效果);
代码:
import cv2
from imgaug import augmenters as iaa
import random
import numpy as np
def main():
path = '1212.jpeg'
src = cv2.imread(path)
print(src)
src = cv2.cvtColor(src,cv2.COLOR_BGR2RGB)
# 颜色通道随机改变
seq_channel_shuffle = iaa.Sequential([
iaa.ChannelShuffle(),
])
# 添加高随噪点
# scale: 噪点比例
# per_channel:是否每一个通道
seq_GassNoise = iaa.Sequential([
iaa.AdditiveGaussianNoise(scale=0.2*255,per_channel=True)
])
# 随机丢失一部分像素
seq_dropout = iaa.Sequential([
iaa.Dropout(0.2,per_channel=True)
])
# 上下翻转
seq_flip_up = iaa.Sequential([
iaa.Flipud(1)
])
# 左右翻转
seq_fliplr = iaa.Sequential([
iaa.Fliplr(0.5)
])
# 子通道随机增加颜色值
seq_channel = iaa.WithChannels(
channels=[0, 1],
children=iaa.Add((random.randint(-60, -20), random.randint(20, 60)))
)
# 大地增加雪地效果
seq_FastSnowyLandscape = iaa.Sequential([
iaa.FastSnowyLandscape(lightness_threshold=200)
])
# 左转90度
seq_rot90l = iaa.Sequential([
iaa.Rot90(k=1)
])
# 右转90度
seq_rot90r = iaa.Sequential([
iaa.Rot90(k=3)
])
imglist = []
for count in range(10):
if count == 0:
imglist.append(src)
elif count == 1:
imglist.append( seq_channel_shuffle.augment_image(src))
elif count == 2:
imglist.append( seq_GassNoise.augment_image(src))
elif count == 3:
imglist.append( seq_dropout.augment_image(src))
elif count == 4:
imglist.append( seq_flip_up.augment_image(src))
elif count == 5:
imglist.append( seq_fliplr.augment_image(src))
elif count == 6:
imglist.append( seq_channel.augment_image(src))
elif count == 7:
imglist.append( seq_FastSnowyLandscape.augment_image(src))
elif count == 8:
imglist.append( seq_rot90l.augment_image(src))
elif count == 9:
imglist.append( seq_rot90r.augment_image(src))
for i in range(10):
cv2.imshow(str(i), imglist[i])
cv2.waitKey(0)
cv2.destroyAllWindows()