图像样本读取
# 利用tf提供API随机、批量读取图像样本
import tensorflow as tf
import os
def img_read(filelist): # 读取图像样本
# 1.构建文件列队
file_queue = tf.train.string_input_producer(filelist)
# 定义reader,读取图像、解码
reader = tf.WholeFileReader() # 一次性读取整个文件内容
# 读取,返回文件名称、数据
k, v = reader.read(file_queue)
# 解码
img = tf.image.decode_jpeg(v)
# 3.批处理,批处理之前需要将图像设置成统一大小
# 缩放图像
img_resized = tf.image.resize(img, # 原图
[200, 200]) # 缩放到200*200
# 设置张量形状
img_resized.set_shape([200, 200, 3]) # 200*200,3通道
img_bat = tf.train.batch([img_resized], # 数据
batch_size=10, # 一个批次10笔
num_threads=1) # 线程数量
return img_bat
if __name__ == "__main__":
# 1. 找到文件,构造一个列表
dir_name = "test_img/"
file_names = os.listdir(dir_name)
file_list = []
for f in file_names:
file_list.append(dir_name + f) # 拼接目录和文件名
imgs = img_read(file_list) # 调用函数
# 开启session运行结果
with tf.Session() as sess:
coord = tf.train.Coordinator() # 定义线程协调器
# 开启读取文件线程
# 调用 tf.train.start_queue_runners 之后,才会真正把tensor推入内存序列中
# 供计算单元调用,否则会由于内存序列为空,数据流图会处于一直等待状态
# 返回一组线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# print(sess.run([imgs])) # 打印读取的内容
imgs = imgs.eval() # 执行imgs操作,将返回值存入imgs
# 回收线程
coord.request_stop()
coord.join(threads)
# 显示图片
print(imgs.shape)
import matplotlib.pyplot as plt
plt.figure("Img Show", facecolor="lightgray")
for i in range(10):
plt.subplot(2, 5, i + 1) # 2行5列第i+1个子图
plt.xticks([])
plt.yticks([])
plt.imshow(imgs[i].astype("int32")) # 将像素值转换为整型显示
plt.tight_layout()
plt.show()
执行结果