如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?

stu*_*ujo 2 object detection tensorflow mobilenet

我正在尝试使用 ssd mobilenetv2 从 ipcam 视频流中检测小物体。该模型是在这些小物体的高分辨率图像上训练的,其中物体非常靠近相机。图像是从互联网上下载的。我发现改变锚箱比例和修改特征提取器.py 是解决这个问题的建议解决方案。谁能指导我如何做到这一点?

小智 11

mobilenet-ssd - 非常适合大对象,但它对小对象的性能却很差。使用根据您期望的对象纵横比和大小调整的锚进行训练总是更好。还要考虑的另一件事是,第一个分支是检测最小对象的分支 - 该分支的分辨率是输入的 1/16 - 您应该考虑在 1/8 特征图上添加另一个分支 - 这将帮助处理小物件。

如何更改锚点大小和纵横比: 让我们以用于训练配置的 pipeline.config 文件为例 - https://github.com/tensorflow/models/blob/master/research/object_detection/samples/配置/ssd_mobilenet_v2_coco.config。您会在那里找到以下参数:

 90     anchor_generator {
 91       ssd_anchor_generator {
 92         num_layers: 6
 93         min_scale: 0.20000000298
 94         max_scale: 0.949999988079
 95         aspect_ratios: 1.0
 96         aspect_ratios: 2.0
 97         aspect_ratios: 0.5
 98         aspect_ratios: 3.0
 99         aspect_ratios: 0.333299994469
100       }
101     }
Run Code Online (Sandbox Code Playgroud)

如何提前启动分支

这也需要在代码中进行更改。每个预定义的模型都有自己的模型文件 - 即 ssd_mobilenet_v2:https : //github.com/tensorflow/models/blob/master/research/object_detection/models/ssd_mobilenet_v2_feature_extractor.py

第 111:117 行

feature_map_layout = {
    'from_layer': ['layer_15/expansion_output', 'layer_19', '', '', '', ''
                  ][:self._num_layers],
    'layer_depth': [-1, -1, 512, 256, 256, 128][:self._num_layers],
    'use_depthwise': self._use_depthwise,
    'use_explicit_padding': self._use_explicit_padding,
}
Run Code Online (Sandbox Code Playgroud)

您可以通过名称选择要从哪些图层开始。

现在为了我的 2 美分,我没有尝试 mobilenet-v2-ssd,主要使用 mobilenet-v1-ssd,但从我的经验来看,对于小物体来说并不是一个好的模型。我想可以通过编辑锚点来优化它,但不确定它是否足以满足您的需求。对于类似 ssd 的一级网络,请考虑使用ssd_mobilenet_v1_fpn_coco - 它适用于 640x640 输入大小,其第一个分支从 1/8 输入大小开始。(缺点 - 模型更大,推理时间更长)