好的,经过大量修改代码后,这是我对自己问题的回答:
从一个简单的预训练模型源开始:
1. TF HUB 模型库为您提供了许多不同的对象检测模型。我特别想使用 EffifcientDet 架构。
例如:https://tfhub.dev/tensorflow/efficientdet/d2/1.。
这些模型不支持 BATCHING 图像进行推理。您可以在 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.
该链接将您带到 repo
https://github.com/tensorflow/models/tree/master/research/object_detection
3. 这意味着我必须对对象检测 API 代码进行一些修改。在这一点上,我对为什么模型不支持批量推理感到困惑,因为它们已经接受了批量图像的训练。这是我最初发布问题的时间。
这是在 COCO 上训练的最新模型的链接
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md
4. 通过从此处下载模型(例如 EfficientDet D2 768x768)并提取内容,您可以看到 protobuf saved_model 格式和检查点数据均已给出。
protobuf 模型的签名为[1,None,None ,3],这不好!这意味着我们只能对 RGB 空间中具有可变宽度/高度的 1 个图像进行操作。但是我们需要的是[None,None,None,3]的输入签名。
5. 所以最后为了做到这一点,我们需要使用exporter_main_v2.py 文件!该文件将要以原型格式('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 repo 上找到了一个 pull request:
https://github.com/tensorflow/models/pull/9228/commits/b2a6712cbe6eb9a8639f01906e187fa265f3f48e
这很好地总结了这些变化!
我尝试了几个不同的 EffifcientDet 模型,效果很好!但是我不知道这是否适用于其他型号!当心!
谢谢大家...这很长,但我认为最好解释一下我的“旅程”以及达成此解决方案的理由。