开发者学堂课程【深度学习框架 TensorFlow 入门:图片读取案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/773/detail/13553
图片读取案例
内容介绍:
一、图像基本知识
二、图片特征值处理
三、数据格式
四、案例:狗图片读取
一、图像基本知识
特征抽取:
文本 — 数值(二维数组 shape(n_samples, m_features))
字典 — 数值(二维数组 shape(n_samples, m_features)
图片 — 数值(三维数组 shape(图片长度、图片宽度、图片通道数)
我们经常接触到的图片有两种,一种是黑白图片(灰度图),另一种是彩色图片。
组成图片的最基本单位是像素。
(1)图片三要素
组成一张图片特征值是所有的像素值,有三个维度:图片长度、图片宽度、图片通道数。
描述一个像素点,如果是灰度图,那么只需要一个数值来描述它,就是单通道。
如果一个像素点,有 RGB 三种颜色来描述它,就是三通道。
灰度图[长,宽,1]:单通道,由像素构成,每一个像素点是[0,255]的数,越接近于0越黑,越接近于255越白
彩色图片[长,宽,3]:三通道,由三个通道构成,每一个像素点用[0,255]的数表示
如果一张彩色图片的长200,宽200,通道数为3,那么总的像素数量为200*200*3。
(2)张量形状
在 TensorFlow 中如何用张量表示一张图片呢?
一张图片可以被表示成一个3D张量,即其形状为[height,width,channel], height 就表示高, width 表示宽, channel 表示通道数。我们会经常遇到3D和4D的表示
Tensor(指令名称,shape,dtype)
单个图片: shape = (height,width,channel)
多个图片: shape = (batch,height,width,channel),batch 表示一个批次的张量数量
二、图片特征值处理
iris 数据集
150个样本 4个特征 目标值
1)一个样本 327 * 499 * 3 数据量大
2)样本和样本的形状不统一,没办法进行批量操作和运算
为什么要缩放图片到统一大小?
在进行图像识别的时候,每个图片样本的特征数量要保持相同。所以需要将所有图片张量大小统一转换。
另一方面,如果图片的像素量太大,通过这种方式适当减少像素的数量,减少训练的计算开销。
tf.image.resize_images(images,size)
缩小放大图片
images :4-D形状[batch,height,width,channels]或3-D形状的张量[height,width,channels]的图片数据
size :1-D int32张量: new_height , new_width ,图像的新尺寸
返回4-D 格式或者3-D 格式图片
三、数据格式
存储:unit8(节约空间)
矩阵计算:float32(提高精度)
四、案例:狗图片读取
狗图片如下:
(1)读取流程分析
构造图片文件名队列
读取图片数据并进行解码
处理图片数据形状,使样本的形状和类型统一,放入批处理
开启会话线程运行
(2)完整代码
import tensorflow as tf
import os
def picture_read():
"""
狗图片读取案例
:return:
"""
# 1、构造文件名队列
file_queue = tf.train.string_input_producer(file_list)
# 2、读取与解码
# 读取阶段
reader = tf.WholeFileReader()
# key 文件名,value 一张图片的原始编码形状
key,value = reader.read(file_queue)
print("key:\n",key)
print("value:\n",value)
#解码阶段
image = tf.image.decode_jpeg(value)
print("image:\n",image)
# 图像的形状、类型修改
image_resized = tf.image.resize_images(image,[200,200])
print("image_resized:\n",image_resized)
# 静态形状修改
image_resized.set_shape(shape=[200,200,3])
print("image_resized:\n",image_resized)
# 3、批处理
image_batch=tf.train.batch([image_resized],batch_size=100,num_threads=1,capacity=100)
print("image_batch:\n",image_batch)
# 开启会话
with tf.Session() as sess:
# 开启线程
# 线程协调员
coord = tf.train.Coordinator()
threads=tf.train.start_queue_runners(sess=sess,coord==coord)
key_new,value_new,image_new,image_resized_new,image_batch_new = sess.run([key,value,image])
print("key_new:\n",key_new)
print("value_new:\n",value_new)
print("image_new:\n",image_new)
print("image_resized_new:\n",image_resized_new)
print("image_batch_new:\n",image_batch_new)
# 回收线程
coord.request_stop()
return None
if __name__ == "__main__":
# 构造路径+文件名的列表
filename = os.listdir("./dog")
# print(filename)
# 拼接路径+文件名
file_list = [os.path.join("./dog",file) for file in filename]
picture_read()