如何修改ssd移动网配置以使用tensorflow对象检测API检测小对象



我正在尝试使用ssd mobilenetv2从ipcam视频流中检测小对象。该模型是在这些小物体的高分辨率图像上训练的,这些物体离相机很近。图片是从互联网上下载的。我发现,改变anchorbox比例和修改特征提取器.py是克服这一问题的建议解决方案。有人能指导我怎么做吗?

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对应于第一个分支中锚点的比例,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_i_lowest_layer:321 layer_box_specs=[(0.1,1.0(,(比例尺,2.0(,(比例,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-sd,主要使用mobilenet-v1-ssd,但根据我的经验,它不是一个适合小对象的好模型。我想它可以通过编辑锚来进行一点优化,但不确定它是否足以满足您的需求。对于一个阶段的类ssd网络,考虑使用ssdmobilenetv1_fpn-coco-它的输入大小为640x640,第一个分支的输入大小从1/8开始。(缺点-更大的模型,更高的推理时间(

晚会迟到,为子孙后代发帖。我最好使用ssd_mobilenet_v2_fpnlite处理小对象。。。变体

点击此处了解fpnhttps://towardsdatascience.com/review-fpn-feature-pyramid-network-object-detection-262fc7482610

最新更新