2

我想将 Tensorflow 对象检测 API 用于多通道图像(例如,4 通道 RGB + 红外)。有一个教程如何更改 API 以添加其他频道。但是,该教程是在一年前编写的,并且 API 从那时起一直在发展,现在 API 似乎可以接受多通道图像了。

例如,在 tensorflow-models/research/object-detection/data_decoders/tf_example_decoder.py 中,除了 fields.InputDataFields.image 现在还有fields.InputDataFields.image_additional_channels。除了输入到 fields.InputDataFields.image 中的标准 3 个通道之外,它可以用于输入图像中的任何其他通道吗?我无法弄清楚这个 image_additional_channels 的用途以及如何使用它。

更一般地说,我的问题是如何将 Tensorflow 对象检测 API 用于多通道(>3)图像。默认情况下,它们是否被接受,即考虑在内?我可以喂它们来训练模型,但是对于 object_detection_tutorial 笔记本中的推理,它不能接受超过 3 个通道,这让我想知道它是否在训练期间忽略了第 4 个通道。

我正在使用对象检测 API 的最新提交 (7a75bfc) 的 Tensorflow 1.12.0。image_additional_channels 于 2018 年 6 月 6 日在提交 9fce9c6 中添加

4

2 回答 2

1

我正在尝试做同样的事情。它似乎在训练期间接受额外的频道(您需要在创建 TfExample 文件期间添加它们)。您还需要在管道配置文件num_additional_channelstrain_input_reader部分中设置您添加的通道数。

但是,导出模型以进行推理的脚本似乎不支持以允许其接受其他通道的方式导出模型。

正如你在这里看到的:https ://github.com/tensorflow/models/blob/master/research/object_detection/exporter.py#L129

输入张量只是标准图像张量,tensor_dict[fields.InputDataFields.image_additional_channels]不包含在输入中。

我即将为我的项目解决这个问题,所以我会尝试打开一个拉取请求并让他们将其合并。

于 2018-12-11T14:00:23.347 回答
0

对于 TFRecord 创建,您必须在此处编辑示例:

def create_tf_example(group, path):
with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
    encoded_jpg = fid.read()
encoded_jpg_io = io.BytesIO(encoded_jpg)
image = Image.open(encoded_jpg_io)
width, height = image.size

这部分代码加载并打开一个图像文件路径;如果您有多个图像,则必须将它们加载到不同的变量中。例如,我使用这样的东西:

with tf.gfile.GFile(dictionary[0], 'rb') as fid:
    encoded_jpg = fid.read()
if ndata > 1:
    with tf.gfile.GFile(dictionary[1], 'rb') as fid:
        encoded_depth = fid.read()
    encoded_inputs = encoded_depth

其中dictionary[0]包含 rgb 图像dictionary[1]的路径,并包含深度图像的路径。

然后,必须像这样创建 TFRecord:

tf_example = tf.train.Example(features=tf.train.Features(feature={
    'image/height': dataset_util.int64_feature(height),
    'image/width': dataset_util.int64_feature(width),
    'image/filename': dataset_util.bytes_feature(filename),
    'image/source_id': dataset_util.bytes_feature(filename),
    'image/encoded': dataset_util.bytes_feature(encoded_jpg),
    'image/additional_channels/encoded': dataset_util.bytes_feature(encoded_inputs),
    'image/format': dataset_util.bytes_feature(image_format),
    'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
    'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
    'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
    'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
    'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
    'image/object/class/label': dataset_util.int64_list_feature(classes),
}))

但是,导出模型以进行推理的脚本似乎不支持以允许其接受其他通道的方式导出模型。

正如你在这里看到的: https ://github.com/tensorflow/models/blob/master/research/object_detection/exporter.py#L129

输入张量只是标准图像张量,输入中不包含 tensor_dict[fields.InputDataFields.image_additional_channels]。

我即将为我的项目解决这个问题,所以我会尝试打开一个拉取请求并让他们将其合并。

我也想知道!我设法训练没有问题,但我不能使用训练后的模型,因为无法加载额外的通道......你解决了吗?

于 2019-07-19T15:11:20.513 回答