2017-02-22 82 views
0

我有以下代码,它从本地磁盘上的文件读取一批10张图像。读取一批图像很慢?

问题是代码似乎运行速度很慢。大约需要5-6分钟才能完成。包含图像的目录包含约。 25.000图像。

代码是否正确或者我是否做了一些愚蠢的事情?

import matplotlib.pyplot as plt 
import numpy as np 
from PIL import Image 
import tensorflow as tf 

image_width = 202 
image_height = 180 
num_channels = 3 

filenames = tf.train.match_filenames_once("./train/Resized/*.jpg") 

def read_image(filename_queue): 
    image_reader = tf.WholeFileReader() 
    key, image_filename = image_reader.read(filename_queue) 
    image = tf.image.decode_jpeg(image_filename) 
    image.set_shape((image_height, image_width, 3)) 

    return image 

def input_pipeline(filenames, batch_size, num_epochs=None): 
    filename_queue = tf.train.string_input_producer(filenames, num_epochs=num_epochs, shuffle=True) 
    input_image = read_image(filename_queue) 
    min_after_dequeue = 10000 
    capacity = min_after_dequeue + 3 * batch_size 
    image_batch = tf.train.shuffle_batch(
     [input_image], batch_size=batch_size, capacity=capacity, 
     min_after_dequeue=min_after_dequeue) 
    return image_batch 

new_batch = input_pipeline(filenames, 10) 

with tf.Session() as sess: 
    # Required to get the filename matching to run. 
    tf.global_variables_initializer().run() 

    # Coordinate the loading of image files. 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    b1 = sess.run(new_batch) 

    # Finish off the filename queue coordinator. 
    coord.request_stop() 
    coord.join(threads) 
+0

为了缩小问题,您可以计算出您怀疑是罪魁祸首的每个函数调用,例如,时间'image_reader.read(..)'和'tf.image.decode_jpeg(..)'。 – kaufmanu

回答

1

将min_after_dequeue减小为1000并尝试一次。查看以下不同的min_after_dequeue值的时间表。

min_after_dequeue = 2000 => 2.1 sec to finish

min_after_dequeue = 100 => 0.13 sec to finish

不要下面进入时间表

from tensorflow.python.client import timeline 

run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) 
run_metadata = tf.RunMetadata() 

b1 = sess.run(new_batch,options=run_options,run_metadata=run_metadata) 
# Create the Timeline object, and write it to a json 
tl = timeline.Timeline(run_metadata.step_stats) 
ctf = tl.generate_chrome_trace_format() 
with open('timelinestack1.json', 'w') as f: 
    f.write(ctf) 

此外,请确保您的所有图片都有相同的大小,你提到的。否则,请在set_shape()之前的下一行使用。

image = tf.image.resize_images(imaged, [224, 224]) 

我希望我给出了合理的答案。

+0

谢谢,min_after_dequeue减少到1,000会显着减少执行时间。所以,如果我正确理解这一点以返回一批10张图像,实际上会读取min_after_dequeue图像的数量。然后从这些图像中随机抽取10张图像。它是否正确? – OlavT

+1

是的,最好根据批量大小限制min_after_dequeue的值。 – hars