深度学习模型需要足够的数据支撑才能进行更好地训练,但实际生活中,作为开发者往往无法获取大量的数据,而专业的数据采集和标注公司提供的数据服务也并不便宜,因此,解决此问题有一个较为不错的初级方案,那就是利用图像处理方法,进行数据扩充。

我个人在学习和整理过程中,对目前数据扩充守法,无非是两类,一种常规手法,另一种为高级手法;

常规手法包含:变换,旋转,剪裁,缩放,锐化,噪声,卷积处理等,特点是利用传统数学形式对原图进行处理加工;

高级手法包含:强化学习的素材生成(例如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()