更新:2020-8-9
最开始回答这个问题的时候,对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感觉有点意思~不过我还没研究,所以也不清楚。
原答案
先mark,回到实验室后再答~
人已到实验室,打开电脑,写答案~
我自己在目标检测这个领域研究将近一年了,有一些心得体会,自己也基本上能够从零开始实现一个anchor-free(af)和anchor-based(ab)的两类检测模型。我没有跑过太多的开源模型,大多数都是拜读论文和读读源码,然后添加或在自己的模型中动手实现下,这一过程中,对af和ab有了一些认识,就过来献个丑,权当抛砖引玉~
首先,关于题主给出的两个点,我有点不同的看法:
我个人认为,这一点并不能算作af的缺点,即使ab中,也存在这种很严重的不平衡现象。在object detection这个领域,正负样本比例失衡就一直存在,毕竟一张图像中,绝大多数的像素都是背景,都是不需要的东西。具体来说,我们以yolo-v2为例,输入图像的大小时 的, ,那么网络最后输出的feature map就是 。如果我们不使用anchor box,即我们的模型时af的,那么,我们就一共有 个样本。
假如我们按照yolo-v1的方法,学习目标的中心点,如果图中有5个物体,那么正负样本的比例就是 ,这比例失衡还是挺严重的。
假如我们使用anchor box,每个位置设置3个anchor box,那么我们一共会有 个样本,如果图中的5个物体都匹配上了一个anchor box,那么正负样本比例就是 ;我们把情况想得再好一些。即每个物体都匹配了两个anchor box,那么比例就是 ;那能不能把所有的anchor box都和物体匹配上去呢?个人认为,这是很难的,通常我们都是用IoU来筛选出合适的anchor box和真实物体的bbox进行匹配,如果我们把这个IoU阈值降到很低,比如0.05,那的确可以让更多的anchor box去和真实的bbox匹配上,但这就和我们最开始引入anchor box的目的相违背了——引入anchor box,其实就是想人为地加入些先验框,有了这个先验,网络就可以在这个先验框上做一些调整即可,不需要从啥也不知道直接去预测出一个框出来,因此,我们肯定希望这个先验框是比较好的,即和真实框之间的IoU值较高,通常大于0.5。所以,对于这个阈值的设置是很敏感的,我个人的实验中,采用0.05的确能够mAP涨点,但是,指标虽然上去了,预测结果却变得有点糟糕了,结果中多了些不是很好的框(所以,单纯地看mAP涨点我个人认为根本不能证明方法的有效性!!!最直接的办法就是把结果可视化,最好是全都能拿出来看,虽然这点有些难,毕竟图片那么多,但mAP这个指标,学术界真够应该好好审视一下了,个人很不喜欢那种加了自己设计的东西,然后mAP上涨了1个点,就可以说自己的东西好使,emmmm...)。
也就是说,事实上,无论是af还是ab,正负样本严重失衡它都是存在的,这也就是为什么,即使到现在,还是有不少人在研究如何解决样本失衡的问题。
这个时候,对于单尺度的af方法来说,的确非常致命,我在自己写数据预处理的时候,也注意到了这个问题,通常一个位置先安排好了一个正样本后,如果这个位置又来了一个新的正样本,那么前一个就会被覆盖掉。关于这个问题,在ab框架下就被很好地解决了,因为每一个位置上,我们3个(假设我们设置了3个anchor box)先验框,那么让第一个框和一个物体匹配上,那么后面来的物体就和其他两个框去做匹配就行了。所以,对于这个问题,单尺度af方法还真不好办。
后来,在出了FPN的技术后,这个问题似乎看起来解决了不少,既然一个feature map容不下两个物体落在同一个网格中,那我们就用两个feature map,每个fmap上落一个,就解决了呀!然而,这就会带来另一个问题:我们如何决定哪个物体落在哪个fmap上?对于这个问题,我的解决方案就是看物体的大小,来决定它应该落在哪个fmap上,可是,这又会带来一个选择的问题,是人工设定呢?还是自适应的呢?还是网络自己学习呢?总之,还是在一定程度上解决了问题。
但回过头来看这个问题,之所以单尺度的af方法会遇到这个问题,是因为我们上面的学习目标是物体的中心点,也就是说,一个物体我就学习一个点,这似乎看起来有点太局部了,也就导致了两个中心点落在一个网格后,没法抉择正样本的问题。那么,如果我们假设把真实框中包含的所有的网格都作为正样本,那不仅提高了正负样本比例,似乎还会解决上面的问题,但马上我们就会发现,单一的feature map就那些问题,要是这么分配正负样本的话,总样本数不太够用,所以,这里我们再配合上FPN的话,样本总数更多了,我们也更好分配了,而这,正是FCOS的思想,在FCOS工作中,把真实框中所有的网格都作为了正样本,对于有重叠的部分,则会根据它设计的一套尺度分配原则来决定重叠部分的网格该赋予什么样的标签。
总之,有了FPN,这种模糊性问题得到了还不错的解决,所以,18年开始,af方法又焕发了生机。(而focal loss的技术,个人并不认为是af又重新崛起的因素,毕竟focal loss就是为了解决正负样本失衡,而ab框架下,这种失衡也很严重呀~)。
以上,是针对题主说到的两点的一些看法。下面,我想说说我自己对af方法的一些看法和展望吧。
说实话,af方法其实很好,我不认为人在做检测任务中,大脑中会先扒拉出一堆先验框让你去调整,而是看一眼,然后直接就能画出框。当然,话也不能说的这么绝对,毕竟我们还不是很清楚我们自己到底、究竟是如何实现检测的(请注意我的措辞,我说的究竟,也就是说这个事情并不没有得到绝对完美的解释和证实)。然而,af相较于ab,省去了很多的超参数,因此更加的简洁和优雅,只是在优化上,由于没有先验的东西来支持,所以不如ab的方法稳定。
然而,换个角度想想,af这种思想和当前的OD框架真的合适吗?我们真的要在一个feature map上去逐个网格(卷积操作)地找东西吗?这里我没有别的意思,只是提出了自己脑海中某个还不是很清晰的想法。
或许,有人会说,既然ab的设置需要人工,那么为了减少人工,我们可以仿照yolo-v2,使用kmeans的方法去在数据集上聚类来得到比较好的框。对此,我有些不同的看法,yolo-v2、v3是在数据集上聚类出来的,所以先验框更加适合数据集,然而,这很严重地依赖于数据集啊!如果数据集中的真实框严重有偏,不足以表征真实的分布(比如我们自己采集数据集的时候,就会有这个问题),那么这样聚类出来的框是否足够好?其次,聚几个框?怎么样才算是聚得好呢?这都是我们要考虑的啊!
“那你的网络也是依赖于数据集的啊!”我想肯定会有人这么想着反驳我,的确,这点我必须承认,所以,半监督、自监督甚至无监督可以做OD吗?我不是很清楚,虽然看过几篇,不过目前来看,有监督在OD中的效果还是最好的~
刚吃完桶泡面,有点撑得上,就先答这些吧,其实自己还是有很多想说的~
题主问的是af的缺点,我似乎没有说太多的af的缺点,因为在我眼里,我觉得af和ab没有原理上的差异,只是在优化和稳定性上,ab总是要表现得好。但我不认为这可以作为缺点摆出来说道说道,我比较喜欢追寻些本质的东西,奈何本人水平有限,难以提出些深层次的东西,写了这么多字,也是希望这个问题能有更多人关注,毕竟我也比较在于af框架的,希望能吸引来更多优秀的人来回答这个问题,哪怕是把我的答案大肆批判一番,我也很开心。
重在交流嘛~