02_人脸识别实战(深度学习)- 数据增强
深度学习的3个核心就是优秀的算法设计、高性能的计算能力、大数据所以说数据非常重要,但我们数据不够,所以我们需要数据增强通常的手段有:随机裁剪、颜色改变、水平或竖直翻转、随机改变大小、加入噪声、对图片进行仿射变换等开始吧!在data目录下,新建一个新的目录generator,运行下面的代码:图片变换的工具类import osimport numpy as npimport...
·
深度学习的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”两侧的数值,
其中每个参数的填充方式如下。
- constant:kkkkkkkk|abcd|kkkkkkkk
- nearest:aaaaaaaa|abcd|dddddddd
- reflect:abcddcba|abcd|dcbaabcd
- 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]区间的浮点数,表示保留用于验证的图像比例
其他网上也有很多,数据增强的代码
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)