图像增强实战(vgg-tensorflow-data_aug)

 

本文是在《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])

位置如下图红框处:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值