数据增强
文章目录
一、目的
丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合)
二、方法
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. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
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