当前位置:   article > 正文

深度学习之数据增强(数据集扩充)方式和实现总结_数据增强扩充数据集

数据增强扩充数据集

前言: 主要总结了数据增强(Data augmentation)常用的一些方法,包括了翻转(flip)、旋转(rotation)、缩放(scale)、裁剪(crop)、移位(translation)和其他一些方法,列出了使用opencv、numpy、tensorflow和其他一些库进行实现的函数。还有展示了keras中的实现数据增强的工具。
数据增强可以有效提高数据量,可以扩充训练数据集。但也并非万能的,有时过度信任数据增强会带来负面效果,还会增加网络训练时间。需酌情使用。

相关总结如下:

import cv2
import numpy as np
import tensorflow as tf
import imutils
import skimage
import pillow

path = '/home/zhangwei/workfiles/deeplearning/dogVScat/data/cat_1.jpg'
img = cv2.imread(path)
# tensorflow加载图片
# img = tf.gfile.FastGFile(path).read()
# img_data = tf.image.decode_jpeg(img)


#-----> 翻转(flip)<--------------#
# 用opencv实现
flip_11 = cv2.flip(img, 1, dst = None) # 1:水平,0:垂直,-1:对角

# 用numpy实现
flip_21 = np.fliplr(img) # 水平翻转
flip_22 = np.transpose	# 转置

# 用tensorfolw实现
flip_31 = tf.image.flip_up_down(img) 
flip_32 = tf.image.flip_left_right	
flip_33 = tf.image.random_flip_up_down # 随机翻转,50%概率
flip_34 = tf.image.random_flip_left_right
flip_35 = tf.image.transpose_image	# 转置图像


#----> 旋转(rotation)<-----------#
# 用opencv实现
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotation_11 = cv2.warpAffine(img, M, (w,h))
rotation_12 = imutils.rotate(img, angles)

# 用numpy实现
rotation_21 = np.rot90(img, k, axes)

# 用tensorflow实现
rotation_31 = tf.image.rot90(img, k = 1) # k:旋转次数
rotation_32 = tf.contrib.image.rotate(img, angles = 3.14) # 旋转任意角度

# 用其他方式
rotation_41 = skimage.transform.rotate(img, angles = 45, mode = 'reflect')


#----> 缩放(scale)<-------------#
# 用opencv实现
scale_11 = cv2.resize(img, dsize, fx, fy, interpolation)

# 用numpy实现
reshape() x
resize() x

# 用tensorflow实现
tf.image.resize_images(img, [M,N], method)
tf.image.resize_image_with_crop_or_pad(img, M, N)
tf.image.central_crop(img, factor)

# 用其他方式
scale_41 = skimage.transform.rescale(img, scale, mode)


#---->裁剪(crop)<-------------#
# 用切片即可实现

# 用tensorflow实现
crop_31 = tf.random_crop(img, size, seed)
crop_32 = tf.image.crop_to_bounding_box()


#---->移位(translation)<------------#
# 用opencv实现
M = np.float32([[x1,y1,z1],[x2,y2,z2]])
translation_11 = cv2.warpAffine(img, M, (w,h))

# 用numpy实现
None

# 用tensorflow实现
translation_31 = tf.image.pad_to_bounding_box(img, pad_bottom, pad_right,height, width)


#----->其他一些方法<----------------#
# 光照对比度
tf.image.adjust_brightness
tf.image.random_brightness
tf.iamge.adjust_constrast
tf.image.random_constrast
# 增加噪声
# 其他有创造性的想法


# !!!keras中有提供了批量数据增强的函数ImageDataGenerator!!!#
from keras.preprocessing.image import ImageDataGenerator
# 图像增强
train_datagen = ImageDataGenerator(
	featurewise_center=False,	# 去中心化
    samplewise_center=False,	# 样本均值为0
    featurewise_std_normalization = False,	# 样本值/数据集标准差
    samplewise_std_normalization = False,	# 样本值/自身标准差
    zca_whitening = False,	# ZCA白化
    rotation_range = 0.,	# 随机旋转角度*
    width_shift_range = 0.,	# 宽度比例0-1*
    height_shift_range = 0.,	# 高度比例0-1*
    shear_range = 0.,	# 剪切强度*
    zoom_range = 0.,	# 随机缩放幅度*
    channel_shift_range = 0., # 随机通道偏移幅度,颜色变化
    fill_mode = 'nearest',	# 当变换处理超出边界时,处理方式:constant,nearest,reflect,wrap
    cval = 0.0,	# 超出边界时,填充的值
    horizontal_flip = False,	# 随机水平翻转*
    vertical_flip = False,	# 随机垂直翻转*
    rescale = None,	# 比例系数
    preprocessing_function = None,	# 预处理函数*
    data_format = K.image_data_format()
	)

# 生成(x,y)元组的目标迭代器,x:图像numpy数组,y:标签numpy数组
train_generator = train_datagen.flow_from_directory(
	directory: Any, # 寻找该目录下的图像
    target_size: Tuple[int, int] = (256, 256), # 调整找到的所有图像尺寸
    color_mode: str = 'rgb', # 图像颜色模式
    classes: Any = None, # 子目录,类列表
    class_mode: str = 'categorical', # 类模式
    batch_size: int = 32, # 批次大小
    shuffle: bool = True, # 随机数据,否则按照字母排序
    seed: Any = None, # 种子,用于洗牌和切换
    save_to_dir: Any = None, # 保存路径
    save_prefix: str = '', # 保存前缀
    save_format: str = 'png', # 保存格式:png,jpeg
    follow_links: bool = False, # 跟随链接
    subset: Any = None, # 子集(验证集)
    interpolation: str = 'nearest' # 插值方式
	)

# 使用其训练模型,返回值为一个对象
model.fit_generator(
	generator = train_generator,  # 生成器 
	steps_per_epoch, # 次数
	epochs=1, # 迭代轮数
	verbose=1, # 日志显示,0:不输出,1:输出进度条信息,2:每个epoch出一行记录
	callbacks=None, # 回调 
	validation_data=None, # 生成验证集生成器:tuple
	validation_steps=None, # 当validation为生成器,指定返回次数
	class_weight=None, # 类别权重字典
	max_q_size=10, # 生成器队列最大容量
	workers=1, # 最大进程数
	pickle_safe=False, # 基于进程的线程
	initial_epoch=0 # 从该参数指定的epoch开始训练
	)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/255203
推荐阅读
相关标签
  

闽ICP备14008679号