opencv+tf.image模块对FER2013人脸表情数据集进行数据增强

对FER2013.csv数据集进行数据扩充,包括左右翻转、随即调整亮度、随机调整对比度、随机切割等。
参考内容:
Tensorflow的image模块API:
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-szpy2rq1.html
tensorflow下有关图片的随机翻转、随机调整亮度以及对比度函数:
https://blog.csdn.net/sinat_21585785/article/details/74180217
数据增强函数的测试:

  1. tf.image.random_flip_left_right(image)#将图像以一定概率从左到右翻转(图为:桥本环奈,推荐日剧:我是大哥大)
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第1张图片
  2. tf.image.random_brightness(image, max_delta=32./255)#通过随机因子调整图像的亮度;际上是在原图的基础上随机加上一个值(如果加上的是正值则增亮否则增暗),此值取自[-max_delta,max_delta),要求max_delta>=0
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第2张图片
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第3张图片
  3. tf.image.random_contrast(image, lower=0.8, upper=1.2) #在[lower,upper]范围内随机调整图的对比度
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第4张图片
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第5张图片
  4. tf.random_crop(image, [48-np.random.randint(0, 4), 48-np.random.randint(0, 4), 3]);random_crop随机切割,第一参数是图像源,第二个参数是切割大小
    opencv+tf.image模块对FER2013人脸表情数据集进行数据增强_第6张图片

上述即为数据增强模块,使用时只需将fer2013.csv中想要进行数据扩增的数据进行复制即可。在训练提取数据时,每张图片都会经过该数据增强模块进而生成不同的数据,复制10次即生成10倍不同的数据。

代码:

import cv2
import numpy as np
import tensorflow as tf
# 数据增强
def pre_process_img(image):
	cast_image = tf.cast(image,tf.float32) #这句必须加上
	flip_image = tf.image.random_flip_left_right(cast_image)#以一定概率从左到右翻转
	bright_image = tf.image.random_brightness(flip_image, max_delta=28)#通过随机因子调整图像的亮度,白色255黑色0
	contrast_image = tf.image.random_contrast(bright_image, lower=0.2, upper=1.8)#在[lower,upper]范围内随机调整图的对比度
	# #random_crop随机切割,第一参数是图像源,第二个参数是切割大小
	crop_image = tf.random_crop(contrast_image, [1080-np.random.randint(0, 250), 1080-np.random.randint(0, 250), 1])
	image = tf.image.resize_images(crop_image, [1080, 1080])
	return image
y = cv2.imread('qiaoben.jpg')
print(y.shape)#48*48*3
y = cv2.resize(y,(1080,1080))
image_gray = cv2.cvtColor(y, cv2.COLOR_BGR2GRAY)
print(image_gray.shape)#48*48
image_ = np.reshape(image_gray, [1080, 1080, 1])#经tf操作后的东西都不能show!
process_image = pre_process_img(image_)

with tf.Session() as sess:
	res = sess.run(process_image)
	print(res.shape)

	imgs = np.hstack([image_,res])
	cv2.namedWindow("a",0)
	cv2.resizeWindow("a", 1000, 500)
	cv2.imshow('a',sess.run(tf.cast(imgs,tf.uint8)))
	cv2.waitKey(0)

代码要注意:
1.经tf中的方法进行数据增强的图片要经过sess.run()才可显示;同理,经tf.reshape操作后一样不能用cv2.show展示图片;
2.调整亮度时需将像素点转化为float32类型,否则输出图片为全白
3.随机切割后要将图片重新resize为规定大小

你可能感兴趣的:(opencv+tf.image模块对FER2013人脸表情数据集进行数据增强)