Din*_*esh 4 solid-state-drive object-detection tensorflow object-detection-api mobilenet
我已经使用自定义数据集(电池)训练了SSD Mobilenet模型。电池的示例图像在下面给出,并且还附带了我用来训练模型的配置文件。
当物体离摄像机更近(通过网络摄像头测试)时,它可以以0.95以上的概率准确地检测到物体,但是当我将物体移到更长的距离时,它不会被检测到。通过调试,发现该对象被检测到,但概率较低,为0.35。最小阈值设置为0.5。如果将阈值0.5更改为0.2,则将检测到对象,但是会有更多的错误检测。
参照此链接,SSD对于小物体的性能不佳,替代解决方案是使用FasterRCNN,但该模型的实时性非常慢。我也希望使用SSD从更长的距离检测电池。
请帮我以下
dan*_*ang 10
更改长宽比和比例将无助于提高小物体的检测精度(因为原始比例已经足够小,例如min_scale = 0.2)。您需要更改的最重要的参数是feature_map_layout。feature_map_layout确定要素地图的数量(及其大小)及其对应的深度(通道)。但是遗憾的是,无法在pipeline_config文件中配置此参数,您将必须直接在功能提取器中对其进行修改。
这就是为什么这feature_map_layout在检测小物体时很重要的原因。

在上图中,(b)和(c)是两个具有不同布局的特征图。地面真相图像中的狗与4x4功能图上的红色锚框匹配,而猫与8x8功能图上的蓝色锚框匹配。现在,如果您要检测的对象是猫的耳朵,那么将没有匹配对象的锚框。因此直觉是:如果没有锚框与对象匹配,则根本不会检测到该对象。 要成功检测猫的耳朵,您可能需要一张16x16的特征图。
您可以通过以下方法将更改为feature_map_layout。在每个特定的特征提取器实现中都配置了此参数。假设您使用ssd_mobilenet_v1_feature_extractor,则可以在此文件中找到它。
feature_map_layout = {
'from_layer': ['Conv2d_11_pointwise', 'Conv2d_13_pointwise', '', '',
'', ''],
'layer_depth': [-1, -1, 512, 256, 256, 128],
'use_explicit_padding': self._use_explicit_padding,
'use_depthwise': self._use_depthwise,
}
Run Code Online (Sandbox Code Playgroud)
这里有6个不同比例的特征图。前两层直接取自移动网络层(因此深度均为-1),而其余四层则来自额外的卷积运算。可以看出,最低层的特征图来自移动网层Conv2d_11_pointwise。通常,该层越低,特征图特征越精细,检测小物体越好。因此,您可以将其更改Conv2d_11_pointwise为Conv2d_5_pointwise(为什么?这可以从tensorflow图中找到,该层的特征图比layer大Conv2d_11_pointwise),它应该有助于检测较小的对象。
但是更高的精度会带来额外的成本,这里的额外成本是检测速度会有所下降,因为有更多的锚框需要处理。(更大的功能图)。此外,由于我们选择Conv2d_5_pointwise了Conv2d_11_pointwise,因此会失去的检测能力Conv2d_11_pointwise。
如果您不想更改图层,而只是添加一个额外的功能图(例如,使其总共成为7个功能图),则也必须num_layers将配置文件的int 也更改为7。 您可以将此参数视为检测网络的分辨率,级别越低的层,分辨率就越高。
现在,如果您已执行上述操作,则还有另一件事需要帮助:添加带有小对象的更多图像。如果这样做不可行,至少您可以尝试添加数据扩充操作,例如random_image_scale
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |