为什么SSD(Single Shot MultiBox Detector)对小目标的检测效果不好?

论坛 期权论坛 期权     
匿名用户1024   2021-5-30 23:53   7687   5
最近在关注一些目标检测的东西,SSD很快,但是在使用的时候发现对一些比较小的目标检测效果不好,但是Faster RCNN能够检测出来,这是什么原因造成的呢?
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
有关回应  16级独孤 | 2021-5-30 23:53:55
SSD是一种基于全卷积的网络的检测器,用不同层检测不同大小的物体。这中间有个矛盾,前面的featmap大,但semantic不够,后面的sematic够了,但经过太多的pooling,featmap太小了。

要检测小物体,既需要一张足够大的featmap来提供更加精细的特征和做更加密集的采样,同时也需要足够的semantic meaning来与背景区分开。

参会时问过SSD的作者,如果将最后的featmap放大接上前面的话,是不是能够改善性能,作者说值得一试。

不过最近读paper,发现已经有这样的工作了。建议大家可以关注FPN(https://arxiv.org/abs/1612.03144)。非常非常非常豪华的作者列表+相当相当相当solid的实验。
3#
有关回应  16级独孤 | 2021-5-30 23:53:56
我试过SSD最前面的卷积为深度残差网络,检测小物体效果还不错,比YOLO要好得多。
另外SSD原论文中,多级别的物体基本尺寸从0.1到0.8,实际上0.1的比例还是很大的,如1024*1024的输入,0.1都到102了,其实不小。
可以根据需求调整级别,我使用的为1/64~1,即不同级别格子本身大小。
当然,级别从线性分割变成指数分割后,在基本大小之上的各个变形也需要调整一下(主要是变大),不然有可能覆盖不到有些位于两个格子中间的某些大小的物体。

YOLO比较坑的地方在于倒数第二层为全连接,后面的7*7格子不能扩张太大,不然前面的全连接要爆。格子大了,同一个格子可能会包括多个小物体,检测就不好搞了。

而YOLO全连接的作用又是整合全局信息,要去掉全连接,就需要增加最后点的感受野,所以深度残差就非常适合。

提到深度残差,再说另外一点。
在深度残差的作者kaiming大神另一篇文章R-FCN: Object Detection via Region-based Fully Convolutional Networks,中有使用空间pooling,发现深度残差就是天然的自带空间pooling效果的结构啊。

-------更新-------
补充一点,SSD前面的CNN结构,一定要是全对称的,特别是pooling的时候,这样最后输出点的感受野中心才与每个格子的中心是重合的。
如果是非对称的,CNN前面特征提取的时候,它会纠结,造成大量的小物体不好学习。
而YOLO最后有全连接都还好,问题不大。
如下图,一种不好的pooling方式:

一种相对较好的pooling方式:

4#
有关回应  16级独孤 | 2021-5-30 23:53:57
SSD is a class aware RPN with a lot of bells and whistles.

每一个feature map上面的pixel对应几个anchor,这个网络对anchor进行训练,以此驱动对feature进行训练。

这是前言。

作为小物体,其所对应的anchor比较少 (gt overlap > 0.5 的 anchor),也就是说对应feature map上的pixel难以得到充分训练。读者可以脑补每一个大的ROI可能覆盖很多 anchor,那么这些 anchor 均有机会得到训练。然而一个小物体并不能覆盖很多 anchor。

没有得到充分训练有什么问题?在test的时候这个pixel的预测结果可能就是乱的,会极大干扰正常结果。

为什么SSD的data augmentation能涨这么多点,就是因为通过randomly crop,让每一个anchor都得到充分训练(也就是说,crop出一个小物体,在新图里面就变成大物体了)

只能说这种without region propisal的结果 naturally 不擅长小物体。通过往上堆 hack 才能慢慢比上吧。
5#
有关回应  16级独孤 | 2021-5-30 23:53:58
1 小目标往往更依赖浅层特征,因为浅层特征有更高的分辨率,然而对语义区分较差。
2 ssd检测和分类一起做,会把一些检测到但是分类模糊,分数不高的结果过滤掉。而rpn不会,前200个候选继续分类,都会有个结果。
3 为了速度,本来是全卷积网络,却也固定了输入尺寸。对大图的小目标影响很大
6#
有关回应  16级独孤 | 2021-5-30 23:53:59
最近刚好仔细看了一边SSD的源代码,说下我的理解。首先,小目标像素少特征不明显,因此和大目标相比,小目标的检测率低,这个用任何算法上都是无法避免的。那不同算法之间的小目标检测的区别呢?按照之前的答友所说的,SSD,YOLO等单阶段多尺度算法,小目标检测需要较高的分辨率,因此主要在底部的特征层进行检测,比如SSD中的conv4_3,但底部特征层的语义信息不够丰富,这是一个矛盾,但卷积层加足够深的话影响其实没这么大。我觉得最重要的因素还是因为scale设置的不好导致的,SSD中默认最低一层的anchor为10%~20%,对于720p的图像最小检测尺寸就有72个像素,还是太大了。事实上SSD的源码允许一个特征层做多个尺度的滑窗,将参数min_sizes里的每个元素初始化为一个列表,就可以在相应特征层中生成不同尺度的anchor,如果你设计的足够仔细,基本就可以覆盖足够小的目标了,不过此时anchor的数量估计会涨不少,速度也会降下来。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:136515
帖子:27303
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP