# 数据增强

数据增强

一、目的

丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合)

二、方法

Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当)

PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值。参见论文

Random Scale:尺度变换

Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换

Horizontal/Vertical Flip:水平/垂直翻转

Shift:平移变换

Rotation/Reflection:旋转/仿射变换

Noise:高斯噪声、模糊处理

Label shuffle:类别不平衡数据的增广,参见海康威视ILSVRC2016的report

对数据进行标准化(数据的均值为0,方差为1)

原文链接:https://blog.csdn.net/yzy_1996/article/details/82223241

三、代码

tensorflow内置函数数据增强:

1、随机裁剪

原始图片的大小为300×300,将图片随机裁剪为280×280,通道大小不变。

import tensorflow as tf
import cv2
import matplotlib.pyplot as plt
#用来正常显示中文
plt.rcParams["font.sans-serif"]=["SimHei"]

if __name__ == "__main__":
    img = cv2.imread("img/img.jpg")
    #将图片进行随机裁剪为280×280
    crop_img = tf.random_crop(img,[280,280,3])
    sess = tf.InteractiveSession()
    #显示图片
    # cv2.imwrite("img/crop.jpg",crop_img.eval())
    plt.figure(1)
    plt.subplot(121)
    #将图片由BGR转成RGB
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.title("原始图片")
    plt.subplot(122)
    crop_img = cv2.cvtColor(crop_img.eval(),cv2.COLOR_BGR2RGB)
    plt.title("裁剪后的图片")
    plt.imshow(crop_img)
    plt.show()
    sess.close()

tf.InteractiveSession():它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。
tf.Session():需要在启动session之前构建整个计算图,然后启动该计算图。

2、随机翻转

对图片的水平方向和垂直方向进行随机翻转。

    img = cv2.imread("img/img.jpg")
    #将图片随机进行水平翻转
    h_flip_img = tf.image.random_flip_left_right(img)
    #将图片随机进行垂直翻转
    v_flip_img = tf.image.random_flip_up_down(img)
    sess = tf.InteractiveSession()
    #通道转换
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    h_flip_img = cv2.cvtColor(h_flip_img.eval(),cv2.COLOR_BGR2RGB)
    v_flip_img = cv2.cvtColor(v_flip_img.eval(),cv2.COLOR_BGR2RGB)
    #显示图片
    plt.figure(1)
    plt.subplot(131)
    plt.title("水平翻转")
    plt.imshow(h_flip_img)
    plt.subplot(132)
    plt.title("垂直翻转")
    plt.imshow(v_flip_img)
    plt.subplot(133)
    plt.title("原始图片")
    plt.imshow(img)
    plt.show()
3、 随机亮度、对比度、色度、饱和度的设置
   #随机设置图片的亮度
    random_brightness = tf.image.random_brightness(img,max_delta=30)
    #随机设置图片的对比度
    random_contrast = tf.image.random_contrast(img,lower=0.2,upper=1.8)
    #随机设置图片的色度
    random_hue = tf.image.random_hue(img,max_delta=0.3)
    #随机设置图片的饱和度
    random_satu = tf.image.random_saturation(img,lower=0.2,upper=1.8)

原文链接:https://blog.csdn.net/sinat_29957455/article/details/80629098
4、图片的标准化

标准化后图片的均值为0,方差为1

img = cv2.imread("img/img.jpg")
#将图片进行标准化
std_img = tf.image.per_image_standardization(img)
sess = tf.InteractiveSession()
print(std_img.eval())

ImageDataGenerator()函数数据增强:

这是Keras提供的一个自动增强的函数

     ImageDataGenerator(
​    featurewise_center=False,
​    samplewise_center=False,
​    featurewise_std_normalization=False,
​    samplewise_std_normalization=False,
​    zca_whitening=False,
​    rotation_range=0.,
​    width_shift_range=0.,
​    height_shift_range=0.,
​    shear_range=0.,
​    zoom_range=0.,
​    channel_shift_range=0.,
​    fill_mode='nearest',
​    cval=0.,
​    horizontal_flip=False,
​    vertical_flip=False,
​    rescale=None,
​    dim_ordering=K.image_dim_ordering())

参数解释,所有参数不一定都需要包括,可以不写。

featurewise_center:布尔值,使输入数据集去中心化(均值为0)
samplewise_center:布尔值,使输入数据的每个样本均值为0
featurewise_std_normalization:布尔值,将输入除以数据集的标准差以完成标准化
samplewise_std_normalization:布尔值,将输入的每个样本除以其自身的标准差
zca_whitening:布尔值,对输入数据施加ZCA白化
rotation_range:整数,数据提升时图片随机转动的角度
width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
channel_shift_range:浮点数,随机通道偏移的幅度
fill_mode:;‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
horizontal_flip:布尔值,进行随机水平翻转
vertical_flip:布尔值,进行随机竖直翻转
rescale: 重放缩因子,默认为None. 如果为None0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
dim_ordering:‘tf’和‘th’之一,规定数据的维度顺序。‘tf’模式下数据的形状为samples, width, height, channels,‘th’下形状为(samples, channels, width, height).该参数的默认值是Keras配置文件~/.keras/keras.json的image_dim_ordering值,如果你从未设置过的话,就是'th'

有了这个函数,那怎么具体对一张图片或者批量化处理

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(
    rotation_range=0.2,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

img = load_img('lena.jpg')
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in datagen.flow(x,
    batch_size=1,
    save_to_dir='data/preview',   #保存在这个文件夹下
    save_prefix='lena',
    save_format='jpg'):
    i += 1
    if i > 20:  #生成20张图
        break

img_to_array()不管是2D shape还是3D shape image,返回都是3D Numpy array. 而nd.array()本身不改变shape。

其中flow函数的参数解释

X:样本数据,秩应为4.在黑白图像的情况下channel轴的值为1,在彩色图像情况下值为3
batch_size:整数,默认32
shuffle:布尔值,是否随机打乱数据,默认为True
save_to_dir:None或字符串,该参数能让你将提升后的图片保存起来,用以可视化
save_prefix:字符串,保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效
save_format:”png”或”jpeg”之一,指定保存图片的数据格式,默认”jpeg”
yields:形如(x,y)tuple,x是代表图像数据的numpy数组.y是代表标签的numpy数组.该迭代器无限循环.
seed: 整数,随机数种子

四、mycode:

import keras
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
import os
datagen = ImageDataGenerator(
    rotation_range=0.2,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

path='c:/Users/WMY/Desktop/picture'#处理前图片路径
filenames=[]
for file in os.listdir(path):
	filenames.append(path+'/'+file)#记得/
# print(filenames)
for file in filenames:
	img =load_img(file)
	x=img_to_array(img)
	x= x.reshape((1,)+x.shape)
	i=0
	for batch in datagen.flow(x,
		batch_size=1,
		save_to_dir='f:/picture/enhance',
		save_prefix=file.split('.')[0].split('/')[5],#处理后图片名称
		save_format ='jpg'):
		i+=1
		if i>7:
			break
	#print(file.split('.')[0].split('/')[5])

五、意外收获:

windows pip 换源 在资源管理器收索框,输入:%appdata%

新建pip 文件夹

新建 pip.ini 文本

在文本中粘贴:

 [global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值