六、CV_图像增强方法
六、图像增强方法
大规模数据集是成功应用深度神经网络的前提。例如,可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。我们也可以调整亮度,色彩等因素来降低模型对色彩的敏感度。
图像增强概念
- 图像增强是指通过剪切,旋转/反射/反转变换,缩放变换,平移变换,尺度变换,对比度变换,噪声扰动,颜色变换等一种或多种组合数据增强变换的方式来增加数据集的大小
图像增强的意义
- 通过对训练图像做一系列随即改变,来产生相似又不相同的训练样本,从而扩大训练数据级的规模,而且随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。
图像增强方式分类
实现图像增强可以通过tf.image来完成,也可以通过tf.keras.imageGenerator来完成
(1)几何变换类
- 主要是对图像进行几何变换操作,包括 翻转,旋转,裁剪,变形,缩放 等
(2)颜色变换类
- 通过模糊,颜色变换,擦除,填充等方式对图像进行处理
tf.image进行图像增强(离线实现)
导入所需工具包并读取要处理的图像
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# 读取图像并显示
Insp = plt.imread('./Inspiration.jpg')
plt.imshow(Inspiration)
(1)翻转与裁剪
A、左右翻转
可以通过<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">tf.images.random_flip_left_right</font>
实现图像左右翻转
# 左右翻转并显示
Insp1 = tf.image.random_flip_left_right(Insp)
plt
B、上下翻转
# 上下翻转
Insp2 = tf.image.random_flip_up_down(Insp)
plt.imshow(Insp2)
C、随机裁剪
堆积裁剪出一块面积为原面积10%100%的区域,且该区域的宽和高之比随机取自0.52,然后再将该区域的宽和高分别缩放到200像素
# 随即裁剪
Insp3 = tf.image.random_crop(Insp, (200, 200, 3))
plt.imshew(Insp3)
(2)颜色变换
A、亮度
将图像的亮度随机变化为原图像的50%(1-0.5)~150%(1+0.5)
Insp4 = tf.image.random_brightness(Insp, 0.5)
plt.imshow(Insp4)
B、色调
Insp5 = tf.image.random_hue(Insp, 0.5)
plt.imshow(Insp5)
使用ImageDataGenerator()进行图像增强(在线实现)
- 对
<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">batch_size</font>
的数据随机进行指定的增强方式,增强后数据直接送入网络之中进行训练 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">ImageDataGenerator()</font>
是<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">keras.preprocessing.image</font>
模块中的图片生成器,可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如旋转,变形等。
keras.preprocessing.image.ImageDataGenerator(rotation_range = 0, # 整数,随即旋转度数范围width_shift_range = 0.0, #浮点数,宽度平移height_shift_range = 0.0, # 浮点数,高度平移brightness_range = None, # 亮度调整shear_range = 0.0, # 裁剪zoom_range = 0.0, # 浮点数 或 [lower, upper] 随机缩放范围horizontal_flip = False, # 左右翻转vertical_flip = False, # 垂直翻转rescale = None # 尺度调整
)
水平翻转结果:
from tensorflow.keras.datasets import mnist
# 获取数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# ( ,28,28)--->( ,28,28,1) 将本来缺少的通道维度加上
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
# 实例化
datagen = tf.keras.preprocessing.image.ImageDataGenerator(horizontal_flip = True)for x, y in datagen.flow(x_train, y_train, batch_size=9):plt.figure(figsize=(8, 8))for i in range(0, 9):plt.subplot(330+1+i) # # 创建3行3列的子图(330表示3行3列起始索引0)plt.imshow(x[i].reshape(28, 28),cmap = 'gray') # # 显示图像(转回28×28维度,灰度模式)plt.title(y[i]) # # 显示图像对应的标签(真实数字)plt.show()break