tensorflow 有没有办法在一批图像而不是一张图像上运行来自TF对象检测API推理的EfficientDet?

bkhjykvo  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(135)

我已经设法从模型花园下载了对象检测API(Tensorflow 2.0,对象检测API)。我能找到的所有推理代码(在目录中和在线)都能在批量大小为1的情况下工作。
我在考虑重新配置 pipeline.config 文件。更具体地说是eval_config(batch_size = 5)。这能做到吗?
对于我来说,如何通过可变批量支持进一步的训练/微调是令人困惑的......但推理却不是?
感谢您给予的任何提示。

7qhs6swi

7qhs6swi1#

好了,在对代码进行了大量的修改之后,这是我对自己问题的回答:

从一个简单的预训练模型源开始:

  • 1.* TF HUB模型库提供了许多不同的对象检测模型。我特别想使用EfficientDet架构。

例如:https://tfhub.dev/tensorflow/efficientdet/d2/1.
这些模型不支持批量图像推理。你可以在Inputs部分看到。
A three-channel image of variable size - the model does NOT support batching. The input tensor is a tf.uint8 tensor with shape [1, height, width, 3] with values in [0, 255].这是一个交易破坏者。所以我试图寻找一个解决方案!

  • 2.* 这些目标检测COCO模型中的许多都是Object Detection API的一部分。在本页末尾的Source部分中有这样的说明。

The model's checkpoints are publicly available as a part of TensorFlow Object Detection API.
该链接会将您带到存储库https://github.com/tensorflow/models/tree/master/research/object_detection

  • 3.* 这意味着我不得不在Object Detection API代码中做一些修补。此时我很困惑,为什么模型不支持批推理,因为它们已经在批图像上训练过了。这是我最初提出问题的时候。

这是COCO https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md培训最新车型的链接

  • 4.* 从此处下载模型(例如EfficientDet D2 768 x768),并提取内容物,您可以看到protobuf saved_model和检查点数据都被给出了。protobuf模型有一个[1,None,None ,3]的签名,这是不好的!这意味着我们只能在RGB空间中对一个具有可变宽度/高度的图像进行操作。但我们需要的是一个输入签名[None,None,None,3]
  • 5.* 最后,我们需要使用exporter_main_v2.py文件!该文件将您要以proto格式('saved_model')导出的模型的检查点作为参数。然而,默认情况下,输入签名被设置为[1,NONE,NONE,3]
  • 6.* 解决这个问题的方法是修改exporter_main_v2.py使用的文件。在exporter_lib_v2.py中,我们需要将几行代码从tf.TensorSpec(shape=[1, None, None, 3]更改为tf.TensorSpec(shape=[None, None, None, 3]

我在github回购网站上找到了一个拉取请求:https://github.com/tensorflow/models/pull/9228/commits/b2a6712cbe6eb9a8639f01906e187fa265f3f48e这很好地总结了变化!
我尝试了几个不同的efficientdet模型,它的工作很好!我不知道,但如果这是要工作的其他模型!小心!
谢谢大家...这是一个很长的一个,但我认为这将是很好的解释我的“旅程”和推理,以达到这个解决方案。

66bbxpm5

66bbxpm52#

它看起来像pipeline.config支持eval_config中batch_size,它应该像这样:

eval_config {
  metrics_set: "coco_detection_metrics"
  use_moving_averages: false
  batch_size:5
}

您可以查看the protos来检查pipeline.config中支持哪些参数。在本例中,您可以看到在eval.proto中指定了batch_size。
我还确认了batch_size在这里的Tensorflow对象检测API中使用。我看到了一个指定了原型但实际上没有使用的示例。

carvr3hs

carvr3hs3#

exporter_lib_v2.py中,你会在末尾找到一个dict,它迎合了不同类型的模型导出。

DETECTION_MODULE_MAP = {
    'image_tensor': DetectionFromImageModule,
    'encoded_image_string_tensor':
    DetectionFromEncodedImageModule,
    'tf_example': DetectionFromTFExampleModule,
    'float_image_tensor': DetectionFromFloatImageModule,
    'image_and_boxes_tensor': DetectionFromImageAndBoxModule,
}

请注意上面dict中的键,并参考下面给出的从检查点导出模型的命令:

python .\exporter_main_v2.py --input_type image_tensor --pipeline_config_path .\models\my_ssd_resnet50_v1_fpn\pipeline.config --trained_checkpoint_dir .\models\my_ssd_resnet50_v1_fpn\ --output_directory .\exported-models\my_model

input_type标志接受DETECTION_MODULE_MAP指令的密钥image_tensor。因此,我们还可以传递其他密钥。
现在,如果你对照这些键检查值,你会看到类。每个类有一个不同的input_signature
如果需要批量推理,DetectionFromFloatImageModule是最佳选择,因为其输入签名为input_signature=[tf.TensorSpec(shape=[None, None, None, 3], dtype=tf.float32)]
因此,在将模型从检查点文件夹导入到已保存的模型格式时,只需触发以下命令:

python .\exporter_main_v2.py --input_type float_image_tensor --pipeline_config_path .\models\my_ssd_resnet50_v1_fpn\pipeline.config --trained_checkpoint_dir .\models\my_ssd_resnet50_v1_fpn\ --output_directory .\exported-models\my_model

请注意,我已经将input_type更改为float_image_tensor。这确保了模型可以在批处理模式下进行推理。

相关问题