深度学习的3个核心就是优秀的算法设计、高性能的计算能力、大数据

所以说数据非常重要,因为我们数据不够,所以我们需要数据增强,通常的手段有:
随机裁剪、颜色改变、水平或竖直翻转、随机改变大小、加入噪声、对图片进行仿射变换

开始吧!

在data目录下,新建一个新的目录generator,运行下面的代码:

  • 图片变换的工具类
import os
import numpy as np
import random
import scipy.ndimage as ndi
    # 将图片随机的裁剪
    #translation_factor:变换因子
    #图片np类型
def do_random_crop(translation_factor, image_array,zoom_range):
    height = image_array.shape[0] #获得图片的高
    width = image_array.shape[1]  #获得图片的宽
    x_offset = np.random.uniform(0, translation_factor * width)
    y_offset = np.random.uniform(0, translation_factor * height)
    offset = np.array([x_offset, y_offset])
    scale_factor = np.random.uniform(zoom_range[0], zoom_range[1])
    crop_matrix = np.array([
        [scale_factor,0],
        [0,scale_factor]
    ])
    image_channel = [ndi.interpolation.affine_transform(image_channel, crop_matrix, offset=offset, order=0, mode = 'nearest',cval = 0.0)
                         for image_channel in image_array]

    image_array = np.stack(image_channel, axis=0)
    return image_array

def do_random_rotation(translation_factor, image_array,zoom_range):
    height = image_array.shape[0]
    width = image_array.shape[1]
    x_offset = np.random.uniform(0, translation_factor * width)
    y_offset = np.random.uniform(0, translation_factor * height)
    offset = np.array([x_offset, y_offset])
    scale_factor = np.random.uniform(zoom_range[0],
                                        zoom_range[1])
    crop_matrix = np.array([
        [scale_factor,0],[0,scale_factor]
    ])
    image_array = np.rollaxis(image_array,axis = -1,start = 0)
    image_channel = [ndi.interpolation.affine_transform(image_channel, crop_matrix, offset=offset, order=0, mode='nearest', cval=0.0)
                         for image_channel in image_array]
    image_array = np.stack(image_channel, axis = 0)
    image_array = np.rollaxis(image_array,0,3)
    return image_array

  • 读取上一篇博客获得的人脸图片,并将进行变换
# img_path:图片的路径
# save_path:保存的路径
# data_augmentation:放大的倍数

def generator_dataset(img_dir_path, save_path, data_augmentation,translation_factor):
    img_dirs = os.listdir(img_dir_path)
    zoom_range = [0.75, 1.25]
    for img_name in img_dirs:  
        img = cv2.imread(img_dir_path + "/" + img_name)
        for i in range(0, data_augmentation):
            crop_img = do_random_crop(translation_factor,img,zoom_range)
            rotate_img = do_random_rotation(translation_factor,crop_img,zoom_range)
            cv2.imwrite(save_path + "/" + str(i) + "_" + img_name, rotate_img)
  • 调用变换的图片
generator_dataset("./data/split","./data/generator",10,0.3)
总结

上面代码,我们将一张图片,随机的变换成10张不同样子,于是我们获得了4000千张图片(打开generator目录就可以看到)
在这里插入图片描述

延伸阅读(可以先不读,以后用的时候再来翻阅)

上面代码没有进行翻转、变换颜色等操作,我们可以通过下面代码,加入这些操作

openCV的操作方式
import cv2
image = cv2.flip(image,1) # 水平翻转
blurred = cv2.GaussianBlur(image, (11, 11), 0) #高斯模糊
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #颜色变为灰色
#更多方式,可以查看opencv的API
另外也可以调用keras中数据增强功能

ImageDataGenerator类,例子如下:

from keras.utils import np_utils
from tensorflow.keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator

(x_train,y_train),(x_test,y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train,num_classes)
y_test = np_utils.to_categorical(y_train,num_classes)
datagen = ImageDataGenerator(
    featurewise_center = True,
    featurewise_std_normalization = True,
    rotation_range = 20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip = True
)
datagen.fit(x_train)
model.fit_generator(datagen.flow(x_train,y_train,batch_size=32),steps_per_epoch=len(x_train)/32,epochs=epochs)

使用文档(API)如下:

keras.preprocessing.image.ImageDataGenerator(
featurewise_center = False,
samplewise_center = False,
featurewise_std_normalization = False,
samplewise_std_normalization = False,
zca_whitening = False,
zca_epsilon = 1e-06,
rotation_range = 0.0,
width_shift_range = 0.0,
height_shift_range = 0.0,
brightness_range = None,
shear_range = 0.0,
zoom_range = 0.0,
channel_shift_range = 0.0,
fill_mode = 'nearest',
cval = 0.0,
horizontal_flip = False,
vertical_flip = False,
rescale = None,
preprocessing_function = None,
data_format = None,
validation_split = 0.0
)
  • featurewise_center:布尔值,是否将输入数据的均值设置为0
  • samplewise_center:布尔值,是否将每个样本的均值设置为0
  • featurewise_std_normalization:布尔值,是否将输入特征除以其标准差
  • samplewise_std_normalization:布尔值,是否将每个输入样本除以其标准差
  • zca_whitening:布尔值,决定是否应用ZCA白化的方式进行数据增强
  • zca_epsilon:ZCA白化的ε值,默认为1e-6
  • rotation_range:整数值,决定随机旋转的角度
  • width_shift_range:浮点数、整数或者其数组,水平位置平移值
  • height_shift_range:浮点数、整数或者其数组,垂直位置平移值
  • shear_range:浮点数,图片剪切的强度
  • zoom_range:浮点数或者一个区间,表示随机缩放的范围,形如[0.1,0.2],分别表示其上界和下界。
  • channel_shift_range:浮点数,随机通道偏移的幅度
  • fill_mode:“constant”不变的,“nearest”最近的,“reflect”反射,“wrap”包裹,默认为“nearest”,当进行变幻时,超出边界的点将根据本参数给定的方法进行处理。假设填充序列“abcd”两侧的数值,

其中每个参数的填充方式如下。

  1. constant:kkkkkkkk|abcd|kkkkkkkk
  2. nearest:aaaaaaaa|abcd|dddddddd
  3. reflect:abcddcba|abcd|dcbaabcd
  4. wrap:abcdabcd|abcd|abcdabcd
  • cval:浮点数或整数,详见fill_mode参数;
  • horizontal_flip:布尔值,是否孙吉水平翻转
  • vertical_flip:布尔值,是否随机垂直翻转
  • rescale:重缩放因子的数值,将数据乘以所提供的参数值。如果不指定该参数则默认为None。如果是None或者0,则不进行缩放
  • preprocessing_function:指定一个回调函数,这个函数会在其他任何操作之前运行。这个函数需要一个参数-图片数据(秩为3的Numpy张量)
  • data_format:图片数据格式,与前面所述的同名参数含义相同
  • validation_split:是一个在[0,1]区间的浮点数,表示保留用于验证的图像比例

其他网上也有很多,数据增强的代码

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐