Tensorflow multithreading image loading

前端 未结 1 1466
攒了一身酷
攒了一身酷 2020-12-20 09:31

So I have this toy example code;

import glob
from tqdm import tqdm
import tensorflow as tf

imgPaths = glob.glob(\"/home/msmith/imgs/*/*\") # Some images

fi         


        
相关标签:
1条回答
  • 2020-12-20 10:16

    EDIT (2018/3/5): It's now easier to get the same results using the tf.data API.

    import glob
    from tqdm import tqdm
    import tensorflow as tf
    
    imgPaths = glob.glob("/home/msmith/imgs/*/*") # Some images
    
    dataset = (tf.data.Dataset.from_tensor_slices(imgPaths)
               .map(lambda x: tf.reduce_mean(tf.decode_jpeg(tf.read_file(x))),
                    num_parallel_calls=16)
               .prefetch(128))
    
    iterator = dataset.make_one_shot_iterator()
    next_mean = iterator.get_next()
    
    with tf.Session() as sess:
        for i in tqdm(range(10000)):
            sess.run(next_mean)
    

    As sygi suggests in their comment, a tf.train.QueueRunner can be used to define some ops that run in a separate thread, and (typically) enqueue values into a TensorFlow queue.

    import glob
    from tqdm import tqdm
    import tensorflow as tf
    
    imgPaths = glob.glob("/home/msmith/imgs/*/*") # Some images
    
    filenameQ = tf.train.string_input_producer(imgPaths)
    
    # Define a subgraph that takes a filename, reads the file, decodes it, and                                                                                     
    # enqueues it.                                                                                                                                                 
    filename = filenameQ.dequeue()
    image_bytes = tf.read_file(filename)
    decoded_image = tf.image.decode_jpeg(image_bytes)
    image_queue = tf.FIFOQueue(128, [tf.uint8], None)
    enqueue_op = image_queue.enqueue(decoded_image)
    
    # Create a queue runner that will enqueue decoded images into `image_queue`.                                                                                   
    NUM_THREADS = 16
    queue_runner = tf.train.QueueRunner(
        image_queue,
        [enqueue_op] * NUM_THREADS,  # Each element will be run from a separate thread.                                                                                       
        image_queue.close(),
        image_queue.close(cancel_pending_enqueues=True))
    
    # Ensure that the queue runner threads are started when we call                                                                                               
    # `tf.train.start_queue_runners()` below.                                                                                                                      
    tf.train.add_queue_runner(queue_runner)
    
    # Dequeue the next image from the queue, for returning to the client.                                                                                          
    img = image_queue.dequeue()
    
    init_op = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        sess.run(init_op)
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        for i in tqdm(range(10000)):
            img.eval().mean()
    
    0 讨论(0)
提交回复
热议问题