SSD mobilenet 模型无法检测到更远距离的物体
Posted
技术标签:
【中文标题】SSD mobilenet 模型无法检测到更远距离的物体【英文标题】:SSD mobilenet model does not detect objects at longer distances 【发布时间】:2019-09-28 00:19:51 【问题描述】:我已经使用自定义数据集(电池)训练了一个 SSD Mobilenet 模型。下面给出了电池的示例图像,并附上了我用来训练模型的配置文件。
当物体更靠近相机(使用网络摄像头测试)时,它会以超过 0.95 的概率准确检测到物体,但是当我将物体移动到更长的距离时,它不会被检测到。经过调试,发现对象被检测到但概率较低0.35。最小阈值设置为 0.5。如果我将阈值 0.5 更改为 0.2,则会检测到对象,但会出现更多错误检测。
参考这个link,SSD对于小物体的表现不是很好,一个替代的解决方案是使用FasterRCNN,但是这个模型在实时上很慢。我也希望使用 SSD 从更远的距离检测电池。
请帮我解决以下问题
-
如果我们想以更高的概率检测到更远距离的物体,是否需要更改配置中的纵横比和比例参数?
如果我们想要纵横比,如何选择与对象相关的那些值?
【问题讨论】:
【参考方案1】:改变纵横比和比例不会帮助提高小物体的检测精度(因为原始比例已经足够小,例如min_scale = 0.2
)。您需要更改的最重要的参数是feature_map_layout
。 feature_map_layout
确定特征图的数量(及其大小)及其对应的深度(通道)。但遗憾的是这个参数不能在 pipeline_config 文件中配置,你必须直接在特征提取器中修改它。
这就是为什么feature_map_layout
在检测小物体时很重要的原因。
上图中,(b)和(c)是两个不同布局的特征图。 groundtruth 图像中的狗与 4x4 特征图上的红色锚框匹配,而猫与 8x8 特征图上的蓝色锚框匹配。现在,如果您要检测的对象是猫的耳朵,那么将没有与该对象匹配的锚框。 所以直觉是:如果没有锚框匹配一个对象,那么这个对象根本就不会被检测到。要成功检测到猫的耳朵,你需要的可能是一个 16x16 的特征图。
以下是更改feature_map_layout
的方法。此参数在每个特定的特征提取器实现中配置。假设您使用ssd_mobilenet_v1_feature_extractor
,那么您可以在this 文件中找到它。
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 个不同尺度的特征图。前两层直接取自 mobilenet 层(因此深度均为 -1),其余四层来自额外的卷积操作。可以看出,最底层的feature map来自mobilenet的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
int 更改为 7。 你可以把这个参数看成是检测网络的分辨率,层数越低,分辨率越精细。
现在,如果您已经执行了上述操作,还有一件事可以帮助您添加更多带有小物体的图像。如果这不可行,至少你可以尝试添加像random_image_scale
这样的数据增强操作
【讨论】:
@danyfang 感谢您的回复..如果我在特征图布局中进行更改,我是否能够在更远的距离检测到猫,因为我不想检测猫的耳朵(如你提到)? 只是想展示一个极端的例子,好像距离较远的猫大约是耳朵的大小(距离较近的猫)。 @danyfang 在更改图层名称时我们需要更改 min_scale 和 max_scale 吗?比例值对更改图层名称有影响吗? @danyfang,谢谢您的回答,我遇到了与 OP 类似的问题。但是,我尝试按照您描述的程序进行操作,但它不起作用。我在 ssd_mobilenet_v1_feature_extractor.py 中添加了一个 Conv2d_5_pointwise(以及 layer_depth 中相应的 -1 字段),并更改了 num_layers也将配置文件设置为 7,但我仍然收到一条错误消息,指出“ValueError:特征映射的数量应等于“num_anchors_per_location”的长度。我是否应该修改其他任何内容以使其工作?以上是关于SSD mobilenet 模型无法检测到更远距离的物体的主要内容,如果未能解决你的问题,请参考以下文章
MobileNet SSD V2模型的压缩与tflite格式的转换(补充版)
如何修改 ssd mobilenet 配置以使用 tensorflow 对象检测 API 检测小对象?
如何使用最新的 MobileNet (v3) 进行目标检测?