我已经训练了一个具有自定义数据集(电池)的SSD Mobilenet模型。下面给出了电池的示例图像,并附上了我用来训练模型的配置文件。
当物体靠近摄像机(用摄像头测试)时,它用概率在0.95上准确地检测到物体,但当我将物体移动到更远的距离时,它就没有被检测到。调试后,发现该对象被检测到,但概率较低的为0.35。最小阈值设置为0.5。如果将阈值更改为0.5到0.2,则会检测到对象,但有更多的错误检测。
提到这个链接,SSD对于小型对象的性能不太好,另一种解决方案是使用FasterRCNN,但是这个模型的实时性非常慢。我想用SSD从更远的距离检测电池。
请帮我做以下几点
发布于 2019-05-10 11:34:57
改变长宽比和尺度无助于提高小物体的检测精度(因为原来的尺度已经足够小了,例如min_scale = 0.2
)。您需要更改的最重要参数是feature_map_layout
。feature_map_layout
确定特征映射的数量(及其大小)及其相应的深度(通道)。但是遗憾的是,这个参数不能在pipeline_config文件中配置,您必须在特性提取器中直接修改它。
这就是为什么这个feature_map_layout
在检测小对象时非常重要的原因。
在上图中,(b)和(c)是两幅不同布局的地形图。地真象中的狗与4x4特征地图上的红锚盒相匹配,而猫匹配8x8特征图上的蓝色锚框。现在,如果要检测的对象是cat的ear,那么就不会有与对象匹配的锚框。因此,的直觉是:如果没有与对象匹配的锚框,那么该对象就不会被检测到。要成功地检测猫的耳朵,您需要的可能是一个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,
}
这里有6幅不同比例的特征图。前两层直接取自移动层(因此深度都是-1),其余四层来自额外的卷积运算。可以看出,最底层的特征映射来自移动网络的Conv2d_11_pointwise
层。层越低,特征映射特征越好,对小目标的检测效果越好。所以您可以将这个Conv2d_11_pointwise
更改为Conv2d_5_pointwise
(为什么会这样?)从tensorflow图中可以发现,这一层比层Conv2d_11_pointwise
具有更大的特征映射,可以帮助检测较小的对象。
但是,更高的精确度需要额外的成本,这里的额外成本是检测速度会下降一点点,因为有更多的锚盒需要处理。(较大的地形图)。另外,由于我们选择Conv2d_5_pointwise
而不是Conv2d_11_pointwise
,我们失去了Conv2d_11_pointwise
的检测能力。
如果您不想更改该层,而只是添加一个额外的功能映射,例如,使其总共有7个功能映射,则必须将配置文件中的num_layers
更改为7。你可以把这个参数看作是检测网络的分辨率,层次越低,分辨率就越好。
现在,如果您已经执行了上面的操作,还有一件事需要帮助,那就是添加更多的小对象图像。如果这不可行,至少可以尝试添加像random_image_scale
这样的数据增强操作。
https://stackoverflow.com/questions/56071683
复制相似问题