本文是在《tensorflow查看VGG》的基础上进行图像增强的,添加图像增强的代码可以有两处:
1. 在tensorflow的计算图的构建过程中,将图像增强的方法给应用到x_image上去。
2. 我的图像是使用一个叫做feed_dict的东西传入进来的,但是在传入之前是普通的一维向量,但是在传入的时候就可以变成一个三维向量,变成一个图片的格式。也就是在feed_dict之前,对图像做处理。
在这次实战过程中,使用第一种实现方式。
也就是在计算图中去进行修改,使得代码具有图像增强的实现,即:在x_image上去进行处理,达到图像增强的效果。
为了在x_image上做图像增强,首先需要做一件事情,就是要将输入做一个修改,因为我们之前的输入是一个归一化后的输入,这样的输入相当于是将图像进行了一定的变换,这个时候图像的值在 -1 ~ 1 之间,很显然这样的值在API里面是识别不出来是一张图像的。所以要将这个图像增强的方法给去掉。
也就是图片中红色框的位置需要做更改,即将【/127.5-1】这一部分给去掉,需要在tensorflow的计算图中去做这个图像的归一化。
以此对应,也需要在tensorboard代码中的reverse的操作给去掉。
首先是第一个红框,需要去掉,其次是将之后传入的参数,改回x_image.
此时,x_image中的值就是 0 ~ 255 之间的一个像素值。
然后就是将图像增强的API应用到x_image中。
此时,x_image就是一个四维的向量,不需要做reshape。
图像增强程序:
data_aug_1 = tf.image.random_flip_left_right(x_image)
data_aug_2 = tf.image.random_brightness(data_aug_1,max_delta=63) # max_delta:改变光照的最大值
data_aug_3 = tf.image.random_contrast(data_aug_2,lower=0.2,upper=1.8)
添加位置为下图红框处,并将图像增强后的效果图添加到模型中去:
到这里在我的电脑上执行是没有问题的。
但是有的可能会出现问题,原因可能在于tensorflow的版本,有的版本中tf.random_flip_left_right不支持输入四维向量,输入的是三维图像,三维图像指的就是一张图像。然后可以发现,在我们的实现中,它是有很多张图像的,所以不能直接在x_image上进行处理。
这里就需要做一个曲线救国的策略:将x_image进行拆分,分成一张张单个的图片,然后在单个的图片上做图像增强,然后将单个的图片合并起来,还是变成了一个minibatch。同时,需要对【None】做一个处理,这是因为None表示输入的样本数是不确定的,而这里需要做一个切分,也就是把样本切分成一个个单个的样本。因此,需要将None变成一个确定的数字(batch_size)。
具体更改的代码为:
batch_size = 20
x = tf.placeholder(tf.float32, [batch_size, 3072]) # placeholder--占位符 , None--输入样本数目是不确定的
x_image = tf.reshape(x , [-1,3,32,32]) # 将一维向量展开为三通道的图片格式
x_image = tf.transpose(x_image,perm=[0,2,3,1]) # 交换通道
x_image_arr = tf.split(x_image, num_or_size_splits=batch_size , axis=0)
result_x_image_arr = []
# 设一个数组来保存每一张图片经过数据增强后的结果
for x_single_image in x_image_arr:
# x_single_image : [1 , 32 ,32 , 3] --> [32 , 32 ,3]
x_single_image = tf.reshape(x_single_image,[32,32,3])
data_aug_1 = tf.image.random_flip_left_right(x_single_image)
data_aug_2 = tf.image.random_brightness(data_aug_1,max_delta=63) # max_delta:改变光照的最大值
data_aug_3 = tf.image.random_contrast(data_aug_2,lower=0.2,upper=1.8)
x_single_image = tf.reshape(data_aug_3,[1,32,32,3])
result_x_image_arr.append(x_single_image)
result_x_images = tf.concat(result_x_image_arr,axis=0)
normal_result_x_images = result_x_images / 127.5 -1
# y --shape [None] ,真实值 eg: [0,5,6,3]
y = tf.placeholder(tf.int64, [batch_size])
位置如下图红框处: