首页 > 解决方案 > 如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?

问题描述

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

标签: tensorflowobjectdetectionmobilenet

解决方案


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     }
  • num_layers - 分支数 - 从输入的 1/16 的分支开始...
  • min_scale / max_scale - min_scale 对应于第一个分支中的 anchors 的比例,max_scale 对应于最后一个分支的比例。虽然之间的所有分支都从线性插值中获取比例:( 与SSDmin_scale + (max_scale - min_scale)/(num_layers - 1) * (#branch)中定义的相同:Single Shot MultiBox Detector - https://arxiv.org/pdf/1512.02325.pdf
  • aspect_ratios - 纵横比列表定义锚点 - 这样您可以决定要添加哪些 AR 锚点,AR=1.0 表示方形锚点,而 2.0 表示锚点是横向的 - 而它的宽度是 x2 高度,0.5 表示纵向高度是 x2 宽度...代码可以在以下路径中找到: https ://github.com/tensorflow/models/blob/master/research/object_detection/anchor_generators/grid_anchor_generator.py 和 https://github .com/tensorflow/models/blob/master/research/object_detection/anchor_generators/multiscale_grid_anchor_generator.py
  • 还有一件事是,在 mobilenet-v1-ssd - 第一个分支只有 3 个锚点,我不确定 mobilenet-v2-ssd 有多少,但您可能想要添加更多锚点。如果 layer == 0 和 reduce_boxes_in_lowest_layer: 321 layer_box_specs = [(0.1, 1.0), (scale, 2.0), (scale, 0.5)]您需要在代码中更改它(在multiple_grid_anchor_generator.py中)320被硬编码为三个锚点......

如何更早地启动分支

这也需要在代码内部进行更改。每个预定义模型都有自己的模型文件 - 即 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,
}

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

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


推荐阅读