我希望能够批量读取图像。但是,这些批处理必须由 python 脚本构建(由于各种原因,它们不能提前放入文件中)。什么是最有效的方法,在 tensorflow 中执行以下操作:
(1) 提供:指向图像的 B 可变长度字符串的 python 列表,所有具有相同的大小。 B 是批量大小。 (2) 对每个字符串,加载它对应的图片,应用5%的随机crop(crop是随机的,但crop的大小是固定的) (3) 将图像拼接成大小为 B x H x W x 3 的张量
如果这不可能,是否有人有关于在 python 中加载和预处理图像然后将它们放入队列的效率损失的任何基准/数据?我认为如果在 tensorflow 上内部完成图像加载/预处理,网络将运行得更快。
请您参考如下方法:
我是这样理解你的问题的:
- 你有一些图片
- 你有一个函数
sample_batch()返回一批大小为B的文件名 - 你想读取这些文件名对应的图片并进行预处理
- 最后你输出了一批这样的例子
input = tf.placeholder(tf.string, name='Input')
queue = tf.FIFOQueue(capacity, tf.string, [()], name='Queue')
enqueue_op = queue.enqueue_many(input)
reader = tf.WholeFileReader()
filename, content = reader.read(queue)
image = tf.image.decode_jpeg(content, channels=3)
# Preprocessing
image = tf.random_crop(image, [H, W, 3])
image = tf.to_float(image)
batch_image = tf.train.batch([image], batch_size=B, name='Batch')
output = inference(batch_image)
然后在 session 中,您必须使用 sample_batch() 函数中的文件名运行入队操作:
with tf.Session() as sess:
tf.train.start_queue_runners()
for i in range(NUM_STEPS):
batch_filenames = sample_batch()
sess.run(enqueue_op, feed_dict={input: batch_filenames})
sess.run(output)
