喜欢摄影的盆友都知道图像的亮度,对比度等属性对图像的影响是非常大的,相同物体在不同亮度,对比度下差别非常大。然而在很多图像识别问题中,这些因素都不应该影响最后的结果。所以本文将学习如何对图像数据进行预处理使训练得到的神经网络模型尽可能小地被无关因素所影响。但与此同时,复杂的预处理过程可能导致训练效率的下降。为了减少预处理对于训练速度的影响,后面也学习多线程处理输入数据的解决方案。
在大部分图像识别问题中,通过图像预处理过程可以提高模型的准确率。当然在TensorFlow中提供了几类图像处理函数,下面一一学习。
1,图像编码处理
我们知道一张RGB色彩模式的图像可以看成一个三维矩阵,矩阵中的每个数表示了图像上不同位置,不同颜色的亮度。然而图像在存储时并不是直接记录这些矩阵中的数字,而是记录经过压缩编码之后的结果。所以要将一张图像还原成一个三维矩阵,需要解码的过程。TensorFlow提供了对JPEG和png格式图像的编码/解码函数。以下代码示范了如何使用TensorFlow中对 JPEG 格式图像的编码/解码函数。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#_*_coding:utf-8_*_ # matplotlib.pyplot 是一个python 的画图工具。下面用这个来可视化 import matplotlib.pyplot as plt import tensorflow as tf # 读取图像的原始数据 picture_path = 'kd.jpg' image_raw_data = tf.gfile.FastGFile(picture_path, 'rb').read() with tf.Session() as sess: # 将图像使用JPEG的格式解码从而得到图像对应的三维矩阵 # TensorFlow提供了 tf.image.decode_png 函数对png格式的图像进行解码 # 解码之后的结果为一个张量,在使用它的取值之前需要明确调用运行的过程 img_data = tf.image.decode_jpeg(image_raw_data) # 输出解码之后的三维矩阵 # print(img_data.eval()) ''' # 输出解码之后的三维矩阵如下: [[[4 6 5] [4 6 5] [4 6 5] ... [35 29 31] [26 20 24] [25 20 26]]] ''' # 使用 pyplot工具可视化得到的图像 plt.imshow(img_data.eval()) plt.show() # 将数据的类型转
|