从Anchor角度看目标检测的发展

作者:Kissrabbit
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.正负样本定义与OD当前检测框架的冲突:
在谈OD前,简单回顾一下分类问题中的正负样本问题,以最简单的二分 类问题开始,比如猫狗分类,如果我们有100张图片,也就有了100个样本,猫狗数量五五开,那肯定是最好的,对猫和狗来说,正负样本比例都是1:1,但如果猫只有5张,狗有95张,显然,对猫来说,正样本只有5个,学不到东西;对狗来说,正样本竟然有95个,负样本才5个,这反而容易过拟合,最终分类器会对狗这个类别产生过拟合。

解决办法很简单,我们只需要多加点猫的图片就完事了,因为一张图片就是一个样本。

所以,在分类问题中,样本的最小单元就是图片本身。想解决这种失衡的问题也非常容易,缺啥补啥就行,而且,对于单个样本本身,模型要么遇见的是正样本,要么遇见的是负样本,不会同时遇见正负样本。

然而,在OD这一块,问题不一样,对于一张图片,模型必须得学会区分前景和背景,并且,它还得知道前景又都是些什么东西。而前景就是正样本,背景是负样本,因此,我们得让模型学会如何去做这件事。

(在目标检测中最小样本变成了一个个网格,下文提到)

最早的RCNN为了解决这件事,采用了“给用搜索算法给出前景,然后对前景作分类”的多步pipeline,先区分出前景和背景,然后在去给每个前景分类,这种多步法也为后来的Two-stage体系做了铺垫。

而在16年的CVPR,YOLOv1将这“多步法”捏合在一起,网络在区分前背景的同时,还能对前景做预测(边界框+类别)。

YOLOv1为了实现这一目的,提出了“网格”思想(其实,这种思想在更早的UnitBox、DenseBox中都能看到),可以说,从这个时候开始,OD今后许多年的范式就被定型了:逐网格找东西

为什么这么说呢,我举几个例子:

Faster RCNN先用RPN网络去区分前背景,怎么区分的?是不是也有网格在里头,每个网格设定了k个anchor box,提供尺寸先验,然后每个网格都会给出几个自认是是前景的框,交给后续的RoIpooling去分类。

SSD,虽然用了多个尺度的feature map,但是,不管用了几个,对于每一个feature map,依旧是网格,每个网格中会输出一组预测(边界框+类别)

RetinaNet,还是网格,每个网格设定了几个anchor box,输出一组预测;

FCOS,我们知道FCOS去掉了anchor box,但这个不重要,我们还是看它的检测模式,依旧是每个网格输入一组参数(tlrb+类别)。

虽然这些工作各有千秋,比如Faster给出了anchor box 的概念,SSD可以说是最早用上了多个feature map来检测的思想,RetinaNet则给出了Focal loss(后续我们再说这个focal loss),FCOS把anchor box又给抛弃了,但万变不离其宗,都是在一个覆盖了整张图像的网格上去找东西。

而这样的检测框架带来了什么养问题呢?
正负样本失衡。

我认为,我们现在讨论的正负样本失衡的问题,其实就是这个范式本身的最大缺陷。

当你把一张网格覆盖到原图上去时,自然地就把不包含前景的网格视为负样本,包含前景的网格视为正样本,请大家想象一下,通常情况,正样本多还是负样本多?还是负样本会更多些(当然,也有一些特殊情况,一个大目标几乎占据了整张图,但翻一翻COCO,这样的特殊情况还是少)。

不过,这么说就太草率了,我们稍微展开说一下:

对于ab方法:最粗暴的方式就是,每个网格的k个ab都去和gt box算iou,大于阈值的ab就是正样本,否则就是负样本。请大家再想象一下,能有多少个ab匹配上,网格本身带来的失衡就严重了,再加上ab,而且能匹配上的也没几个,这问题就更严重了。

对于af方法:以FCOS为例,只要这个网格位置落在gt box中,这个网格就是个正样本,啊。这就是网格本身的角度了,失衡问题我就不重复了。(样本还是严重失衡)

也就是说,和分类不同,在OD中,一张图像会包含一大堆正负样本,即,此时的样本最小单元不再是图像,而是网格

为了去划分一张图像上的正负样本,许多研究学者又提出了各种各样的“规则”,比如简单的IoU阈值筛选(Faster、SSD、YOLOv2v3v4等),或者ATSS提出的动态方法,再或者YOLOv1和CenterNet的只考虑包含中心点的网格(CenterNet尽管用了heatmap,但包含gt box信息的依旧只有中心点),又或者FCOS那样的考虑gt box中所有的网格。总之呢,这些规则都没有脱离“逐网格找东西”这个框架。也就无法解决最核心的问题:

样本数太TM多了!!!!!!!!!!!!!

比如,YOLOv3中,输入图像是608,用三个尺度的网格:19x19,38x38,76x76,每个网格还设立3个anchor box,算一下,一共22743个样本,加入,这张图像一共就10个物体,那么按照YOLOv3的匹配规则:

对于IoU大于阈值的M个ab,只保留最大的,其他人的M-1个都忽略,不参与loss计算;
对于IoU小于阈值的,都是负样本。

因此,最多你手里也就10个正样本,负样本呢?2w+,嗯,酸爽,这比例失衡的,哈哈哈!

所幸,YOLO有objectness这个预测,因此这个失衡也只是在二分类这个层次上,对于class和bbox这两块的回归不会带来影响(因此只有正样本才会参与这两块的计算),而在SSD和RetinaNet中,这个失衡会对class产生影响,因为他们都把背景也为了一个类别了,但依旧不会对bbox产生影响,因为只有类别是前景的才会去算bbox部份的loss。

那af呢?就不用多说了,照样有这个问题,背景的包含的像素绝大多数时候它都比前景多,比如一望无际的大草原,牛羊群的像素才能占到多少呢?

因此,这种“逐网格找东西”的范式本身就无法避免这个正负样本比例失衡的问题,即便用OHEM、Focal Loss等一类的工作去缓解正负样本之间的不平衡,也只能是缓解,打个补丁,无法根治。

所以,从这个角度来讲,不管是ab还是af,致命问题都是一样。

私以为,想解决这个问题,可以走两条路子:

1.提出更好的“规则”,在这个新的规则下,我们可以更好的去划分网格,让正负样本去尽量平衡,具体来说,前面说了,大部分网格都落在背景上,因此,我们有必要把所有的背景网格都拿去回归吗?可不可这样:背景的那些网格做个随机采样,只取一部分,从而和正样本个数达到一种平衡。当然,这只是一个设想,我对更好的“规则”暂时没有太多想法。

2.推翻当前框架!!!!emmm……这个好像不太容易,在这浮躁的社会中,谁又愿意去挖新坑呢?当前的OD模型也都还不错(就是落地难点),将就用着,谁会闲的没事“闹革命”呢?不过,最近的Facebook提出的用Transformer感觉有点意思~不过我还没研究,所以也不清楚。

(后面我更新一下基于Transformer的DETR目标检测新范式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值