Tensorflow对象检测API image_additional_channels

时间:2018-11-20 12:16:15

标签: tensorflow object-detection object-detection-api satellite-image

我想将Tensorflow对象检测API用于多通道图像(例如4通道RGB +红外)。 tutorial有一种如何更改API以添加其他渠道的方法。但是,该教程是一年前编写的,此后API不断发展,现在看来该API可以接受多通道图像。

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

更笼统地说,我的问题是如何针对多通道(> 3)图像使用Tensorflow对象检测API。默认情况下是否接受它们,即将它们考虑在内?我可以输入它们来训练模型,但是为了在object_detection_tutorial笔记本中进行推断,它不能接受3个以上的通道,这使我想知道在训练过程中是否忽略了第4个通道。

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

2 个答案:

答案 0 :(得分:0)

我正在尝试做同样的事情。训练期间似乎接受了其他渠道(您需要在创建TfExample文件的过程中添加它们)。您还需要在管道配置文件的num_additional_channels部分中将train_input_reader设置为已添加的通道数。

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

如您所见:https://github.com/tensorflow/models/blob/master/research/object_detection/exporter.py#L129

输入张量仅为标准图像张量,tensor_dict[fields.InputDataFields.image_additional_channels]未包含在输入中。

我将为我的项目修复此问题,因此,我将尝试打开拉取请求并让他们将其合并。

答案 1 :(得分: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]不是   包含在输入中。

     

我将为我的项目修复此问题,因此我将尝试打开一个下拉菜单   请求并让他们将其合并。

我也想知道!我设法没有问题地进行了训练,但是由于无法加载其他频道,因此我无法使用经过训练的模型...您是否已解决该问题?