在TensorFlow中访问队列中的文件名和预处理数据

时间:2018-05-04 09:38:56

标签: python tensorflow tensorflow-datasets

我有一个图像文件目录和相应的信息文件(包含每个图像的一些更多信息)。它看起来像这样:

  

数据/图片/ 001.png

     

数据/信息/ 001.txt

     

数据/ INFO2 / 001.txt

我可以使用...

加载图像
filename_queue = tf.train.string_input_producer(filenames)
reader = tf.WholeFileReader()
_, value = reader.read(filename_queue)`

...但我还需要来自相关文件的信息(实际上我有一些函数使用图像文件名作为输入,预处理信息的路径,预处理数据,并返回一个numpy数组)。但是现在,我很困惑如何将它传递给队列。我似乎需要访问队列中的文件名来在每一步调用我的函数。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用tf.py_func()来包含文件名中的python / numpy预处理,同时知道reader.read()同时返回key(文件名)和value(文件内容),例如

def my_preprocessing_from_filename(filename):
    # This is your pre-processing, e.g.:
    image_name = os.path.splitext(os.path.basename(str(filename)))[0]
    image_info_path = os.path.join("data/info", "{}.txt".format(image_name))
    image_info = numpy.loadtxt(image_info_path, dtype=numpy.int64)
    # ... or whatever you do to load/process the info
    return image_info

filename_queue = tf.train.string_input_producer(filenames)
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
my_image_info  = tf.py_func(my_preprocessing_from_filename, [key], tf.int64)
# ...

注意:根据预处理的不同,您可以考虑将其移植到Tensorflow操作中,使用TF string_ops方法从图像中获取信息文件名,例如:

def my_tf_preprocessing_from_filename(filename):
    # Get basename:
    image_name = tf.string_split(filename, delimiter='/').values[-1]
    # Remove ext (supposing no other "." in name):  
    image_name = tf.string_split(filename, delimiter='.').values[0]    
    image_info = tf.reduce_join(["data/info", image_name, ".txt"])
    _, info_value = reader.read(filename_queue)
    # ... further pre-process your info
    return info_value

filename_queue = tf.train.string_input_producer(filenames)
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
my_image_info = my_tf_preprocessing_from_filename([key])