当前位置:  开发笔记 > 编程语言 > 正文

Tensorflow使用标签读取图像

如何解决《Tensorflow使用标签读取图像》经验,为你挑选了2个好方法。

我正在使用Tensorflow构建标准图像分类模型.为此,我有输入图像,每个图像都分配有一个标签({0,1}中的数字).因此,可以使用以下格式将数据存储在列表中:

/path/to/image_0 label_0
/path/to/image_1 label_1
/path/to/image_2 label_2
...

我想使用TensorFlow的排队系统来读取我的数据并将其提供给我的模型.忽略标签,可以通过使用string_input_producer和轻松实现这一点wholeFileReader.这里的代码:

def read_my_file_format(filename_queue):
  reader = tf.WholeFileReader()
  key, value = reader.read(filename_queue)
  example = tf.image.decode_png(value)
  return example

#removing label, obtaining list containing /path/to/image_x
image_list = [line[:-2] for line in image_label_list]

input_queue = tf.train.string_input_producer(image_list)                                                     
input_images = read_my_file_format(input_queue)

但是,标签在该过程中丢失,因为图像数据被有意地作为输入管道的一部分混洗.通过输入队列将标签与图像数据一起推送的最简单方法是什么?



1> MarvMind..:

使用slice_input_producer提供了更清洁的解决方案.Slice Input Producer允许我们创建一个包含任意多个可分离值的输入队列.这个问题的片段如下所示:

def read_labeled_image_list(image_list_file):
    """Reads a .txt file containing pathes and labeles
    Args:
       image_list_file: a .txt file with one /path/to/image per line
       label: optionally, if set label will be pasted after each line
    Returns:
       List with all filenames in file image_list_file
    """
    f = open(image_list_file, 'r')
    filenames = []
    labels = []
    for line in f:
        filename, label = line[:-1].split(' ')
        filenames.append(filename)
        labels.append(int(label))
    return filenames, labels

def read_images_from_disk(input_queue):
    """Consumes a single filename and label as a ' '-delimited string.
    Args:
      filename_and_label_tensor: A scalar string tensor.
    Returns:
      Two tensors: the decoded image, and the string label.
    """
    label = input_queue[1]
    file_contents = tf.read_file(input_queue[0])
    example = tf.image.decode_png(file_contents, channels=3)
    return example, label

# Reads pfathes of images together with their labels
image_list, label_list = read_labeled_image_list(filename)

images = ops.convert_to_tensor(image_list, dtype=dtypes.string)
labels = ops.convert_to_tensor(label_list, dtype=dtypes.int32)

# Makes an input queue
input_queue = tf.train.slice_input_producer([images, labels],
                                            num_epochs=num_epochs,
                                            shuffle=True)

image, label = read_images_from_disk(input_queue)

# Optional Preprocessing or Data Augmentation
# tf.image implements most of the standard image augmentation
image = preprocess_image(image)
label = preprocess_label(label)

# Optional Image and Label Batching
image_batch, label_batch = tf.train.batch([image, label],
                                          batch_size=batch_size)

另请参阅TensorVision示例中的generic_input_producer,了解完整的输入管道.


我通过在read_images_from_disk函数中设置图像的形状来实现它:example.set_shape([IMAGE_HEIGHT,IMAGE_WIDTH,NUM_CHANNELS])

2> mrry..:

解决此问题有三个主要步骤:

    tf.train.string_input_producer()使用包含原始的,以空格分隔的字符串的字符串列表填充包含文件名和标签的字符串.

    使用tf.read_file(filename)而不是tf.WholeFileReader()读取您的图像文件.tf.read_file()是一个无状态的op,它使用单个文件名并生成一个包含文件内容的字符串.它的优点是它是一个纯函数,因此很容易将数据与输入和输出相关联.例如,您的read_my_file_format功能将变为:

    def read_my_file_format(filename_and_label_tensor):
      """Consumes a single filename and label as a ' '-delimited string.
    
      Args:
        filename_and_label_tensor: A scalar string tensor.
    
      Returns:
        Two tensors: the decoded image, and the string label.
      """
      filename, label = tf.decode_csv(filename_and_label_tensor, [[""], [""]], " ")
      file_contents = tf.read_file(filename)
      example = tf.image.decode_png(file_contents)
      return example, label
    

    read_my_file_format通过从以下位置传递单个出列元素来调用新版本input_queue:

    image, label = read_my_file_format(input_queue.dequeue())         
    

然后,您可以在模型的其余部分中使用imagelabel张量.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有