如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?
Posted
技术标签:
【中文标题】如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?【英文标题】:How to modify ssd mobilenet config to detect small objects using tensorflow object detection API? 【发布时间】:2020-06-17 15:18:47 【问题描述】:我正在尝试使用 ssd mobilenetv2 从 ipcam 视频流中检测小物体。该模型是在这些小物体的高分辨率图像上训练的,这些物体非常靠近相机。图像是从互联网下载的。 我发现更改锚框比例和修改特征提取器.py 是解决这个问题的建议解决方案。 谁能指导我如何做到这一点?
【问题讨论】:
我希望有人可以帮助我。 【参考方案1】:mobilenet-ssd - 非常适合大型对象,但它对小型对象的性能很差。 使用调整到对象纵横比和您期望的大小的锚进行训练总是更好。 要考虑的另一件事是,第一个分支是检测最小对象的分支-该分支的分辨率是输入的 1/16-您应该考虑在 1/8 特征图上添加另一个分支-这将帮助处理小物件。
如何更改锚点大小和纵横比: 让我们以用于训练配置的 pipeline.config 文件为例 - https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/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 对应于最后一个分支的比例。虽然之间的所有分支都从线性插值中获取比例:
min_scale + (max_scale - min_scale)/(num_layers - 1) * (#branch)
(与 SSD: 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 有多少,但您可能想要添加更多锚点。您需要在代码中更改它(在 multiple_grid_anchor_generator.py 中)
320 如果层 == 0 和 reduce_boxes_in_lowest_layer:
321 layer_box_specs = [(0.1, 1.0), (scale, 2.0), (scale, 0.5)]
当你播种时,它被硬编码为三个锚点......
如何提前启动分支
这也需要在代码中进行更改。每个预定义模型都有自己的模型文件 - 即 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 输入大小开始。 (缺点 - 模型更大,推理时间更长)
【讨论】:
非常感谢您解释清楚的答案。我在 *** 上暂时没有活动。我曾尝试更改锚点大小并在遵循其他类似帖子的答案后删除图层,但它没有对我来说没有帮助。无论如何,我通过添加更多带有小对象和数据增强方法的图像在很大程度上解决了这个问题。再次感谢您的回复。 嘿 Tamir,你能解释一下如何编写 feature_map_layout,有没有简单的方法可以知道图层的名称,我尝试过 tensorboard,但通过它来理解名称和顺序并不容易。 嘿@prateekkhandelwal,你将不得不从主干网络中找出张量名称,因为这些特征图名称对应于主干网络。以上是关于如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?的主要内容,如果未能解决你的问题,请参考以下文章
MobileNet SSD V2模型的压缩与tflite格式的转换(补充版)
尝试向检测模型“ssd_mobilenet_v2”添加警报,会引发错误