点击上方“AI算法修炼营”,选择加星标或“置顶”
标题以下,全是干货
在前面的秘籍一:模型加速之轻量化网络、秘籍二:非极大抑制算法和回归损失优化之路、秘籍三:多尺度检测、秘籍四:数据增强、秘籍五:解决样本不均衡问题中,我们主要关注了轻量化网络,非极大值抑制算法、回归损失优化、多尺度方法实现小目标检测、数据增强解决过拟合、引入OHEM、Focal loss函数解决样本不均衡问题等几大攻克目标检测难点的方法。这一期,我们主要来关注目标检测中新的热点领域——Anchor-Free。
在当前主流的目标检测领域中,Anchor通常被看做是一组不同大小形状的先验框,由于其具有启发性的先验信息,在Faster RCNN和SSD等框架中发挥了巨大的作用,基于Anchor的算法也占据了物体检测的大半“江山”。
然而,近一两年来,不依赖锚框的检测算法不断地涌现了出来,并且达到了与依赖锚框(Anchor-Based)算法相同甚至更好的检测效果。
下面,本文主要介绍秘籍六:Anchor free。
回顾一下物体检测算法,在发展的初始阶段是没有Anchor这个概念的,例如Fast RCNN使用随机搜索(Selective Search)的方法提取感兴趣区域,虽然共享了卷积,但耗时严重,正是Faster RCNN引入了Anchor作为先验框,才将实时的物体检测变为可能,达到了检测的第一个高峰,其中Anchor可以说是居功至伟。
当前主流的基于Anchor的检测算法中,对于二阶的算法,第一阶段RPN会对Anchor进行有效的筛选,生成更有效、精准的Proposal,送入第二个阶段,最终得到预测的边框。相比之下,一阶的算法相当于把固定的Anchor当做了Proposal,通过高效的特征与正、负样本的控制,直接预测出了物体。
随着检测性能的提升,Anchor的弊端也渐渐地暴露了出来,使用Anchor通常会面临如下3个问题:
正、负样本不均衡:我们通常在特征图所有点上均匀采样Anchor,而在大部分地方都是没有物体的背景区域,导致简单负样本数量众多,这部分样本对于我们的检测器没有任何作用。
超参难调:Anchor需要数量、大小、宽高等多个超参数,这些超参数对检测的召回率和速度等指标影响极大。此外,人的先验知识也很难应付数据的长尾问题,这显然不是我们乐意见到的。
匹配耗时严重:为了确定每个Anchor是正样本还是负样本,通常要将每个Anchor与所有的标签进行IoU的计算,这会占据大量的内存资源与计算时间。
以这3个问题为出发点,近期出现了大量Anchor-Free的算法。Anchor-Free的思想最早可见于2015年的DenseBox,以及前面讲解过的YOLOV1(YOLOV1算法将目标检测定义为一个张量的回归问题,直接通过张量的估计得到目标框位置和类别概率,没有用到Anchor的先验知识,而在之后的YOLOV2和YOLOV3中都用到了Anchor来提供先验)。
在各种Anchor-Free的算法中,根据其表征一个物体的方法,大体可以分为以下几类:
此图建议收藏
从实验结果来看,Anchor-Free的算法已经达到了与基于Anchor的检测器相同甚至更好的检测效果,虽然距离两阶的基于Anchor的检测器还有些差距,完全取代Anchor仍有一段距离。当然,抛弃Anchor这个先验知识,还能把目标检测做到如此高的水平,也依赖与FPN和Focal Loss等当前公认的优秀经验(可参考之前的系列文章:多尺度检测、解决样本不均衡问题)。
下面,选择几个代表性工作来领略Anchor-Free方法。
论文地址:https://arxiv.org/abs/1808.01244
代码地址:https://github.com/princeton-vl/CornerNet
由于Anchor会带来较多的超参数与正、负样本的不均衡,发表于ECCV 2018的CornerNet算法另辟蹊径,舍弃了传统Anchor与区域建议框的检测思路,利用关键点的检测与匹配,出色地完成了目标检测的任务。
CornerNet的思路实际是受多人体姿态估计的方法启发。在多人体姿态估计领域中,一个重要的解决思路是Bottom-Up,即先使用卷积网络检测整个图像中的关键点,然后对属于同一个人体的关键点进行拼接,形成姿态。
CornerNet将这种思想应用到了目标检测领域中,将传统的预测边框思路转化为了预测边框的左上角与右下角两个角点问题,然后再对属于同一个边框的角点进行组合,整体网络结构如下图所示。
CornerNet的主要结构主要由以下3部分组成:
沙漏结构Hourglass:特征提取的Backbone,能够为后续的网络预测提供很好的角点特征图。
角点池化Corner Pooling:作为一个特征的池化方式,角点池化可以将物体的信息整合到左上角点或者右下角点。
预测输出:传统的物体检测会预测边框的类别与位置偏移,而CornerNet则与之完全不同,其预测了角点出现的位置Heatmaps、角点的配对Embeddings及角点位置的偏移Offsets。
为了很好地理解CornerNet,下面分别详细介绍这3个模块。
1.沙漏结构:
Hourglass为了提取图像中的关键点,CornerNet使用了沙漏结构Hourglass作为网络特征提取的基础模块,其结构下图所示。
此图来自于GiantPandaCV公众号文章
从图中可以看出,Hourglass的整体形状类似于沙漏,两边大,中间小。Hourglass结构是从人体姿态估计领域中借鉴而来,通过多个Hourglass模块的串联,可以十分有效地提取人体姿态的关键点。
在图中,左半部分表示传统的卷积与池化过程,语义信息在增加,分辨率在减小。右半部分表示上采样与融合过程,深层的特征通过上采样操作与浅层的特征进行融合,在增大分辨率的同时,保留了原始的细节信息。
CornerNet首先通过一个步长为2的7×7卷积层,以及步长为2的残差模块,将图像尺寸缩小为原图的1/4,然后将得到的特征图送入两个串联的Hourglass模块。
2.角点池化:
Corner Pooling在传统卷积网络中,通常使用池化层来进行特征融合,扩大感受野,也可以起到缩小特征图尺寸的作用。以3×3的最大池化层为例,通常是以当前位置的点为中心点,融合周围共9个点的信息,取最大值输出。
然而,CornerNet的思想是利用左上与右下两个关键点进行目标检测,对于一个物体的左上点,其右下区域包含了物体的特征信息,同样对于物体的右下点,其左上区域包含了物体的特征信息,这时角点的周围只有四分之一的区域包含了物体信息,其他区域都是背景,因此传统的池化方法就显然不适用了。
为了达到想要的池化效果,CornerNet提出了Corner Pooling的方法,左上点的池化区域是其右侧与下方的特征点,右下点的池化区域是其左侧与上方的特征点,如下所示为左上点的Corner Pooling过程。
在图中,假设当前点的坐标为(x, y),特征图宽为W,高为H,则Corner Pooling的计算过程如下:
(1)计算该点到其下方所有点的最大值,即(x, y)到(x, H)所有点的最大值。
(2)计算该点到其最右侧所有点的最大值,即(x, y)到(W, y)所有点的最大值。
(3)将两个最大值相加,作为Corner Pooling的输出。
工程实现时,可以分别从下到上、从右到左计算最大值,这样效率会更高。右下点的CornerPooling过程与左上点类似。
3.预测输出
下面来看CornerNet的预测输出,以及损失的计算方式。左上角与右下角两个Corner Pooling层之后,分别接了3个预测量,这3个预测量的意义分别如下:
Heatmaps:角点热图,预测特征图中可能出现的角点,大小为C×W×H, C代表类别数,以左上角点的分支为例,坐标为(c, x, y)的预测点代表了在特征图上坐标为(x, y)的点是第c个类别物体的左上角点的分数。
Embeddings:Heatmaps中的预测角点都是独立的,而一个物体需要一对角点,因此Embeddings分支负责将左上角点的分支与右下角点的分支进行匹配,找到属于同一个物体的角点,完成检测任务,其大小为1×W×H。
Offsets:第三个预测Offsets代表在取整计算时丢失的精度,以进一步提升检测的精度。取整的丢失对于小物体检测影响很大,因此CornerNet引入了偏差的预测来修正检测框的位置,其大小为2×W×H。
CornerNet在损失计算时借鉴了Focal Loss的思想,对于不同的负样本给予了不同的权重,总体的损失公式为:
这4部分损失的含义说明如下:
Ldet:角点检测的损失,借鉴了Focal Loss权重惩罚的思想。CornerNet为了减小负样本的数量,将以标签角点为中心,半径为r区域内的点都视为正样本,因为这些点组成的边框与标签会有很大的IoU,仍有可能是我们想要的正样本。
Lpull:Embeddings中,对于属于同一物体的两个角点的惩罚。具体实现时,提取Embeddings中属于同一个物体的两个角点,然后求其均值,并希望两个角点的值与均值的差尽可能地小。
Lpush:Embeddings中,对不属于同一物体的两个角点的惩罚。具体实现时,利用Lpull中配对的角点的平均值,期望没有配对的角点与该平均值的差值尽可能地大,可以有效分离开无效的角点。
Loff:位置偏差的损失,与Faster RCNN相似的是,CornerNet使用了smoothL1损失函数来优化这部分位置偏差。
总体上,CornerNet巧妙地利用了一对关键点来实现物体检测,从而避免了Anchor带来的问题,在检测精度上相比其他单阶检测器有了一定提升。此外,CornerNet的工作也推动了一系列利用关键点做物体检测的算法的诞生。
论文地址:https://arxiv.org/abs/1904.07850
代码地址:https://github.com/xingyizhou/CenterNet
CornerNet虽然实现了利用关键点做物体检测,但其需要两个角点进行匹配,匹配过程耗时较长,并且容易出现误检的样本。
CenterNet算法将目标检测问题变成了一个关键点的估计问题,通过预测物体的中心点位置及对应物体的长与宽,实现了当前检测精度与速度最好的权衡。
CenterNet思想与网络
传统的基于Anchor的检测,常见做法是将Anchor与所有样本计算重叠的IoU,大于一定IoU阈值的作为正样本,小于阈值的视为负样本。而CenterNet的特点是:
(1)没有使用Anchor作为先验框,而是预测物体的中心点出现位置,因此也就不会存在先验框与标签的匹配,正、负样本的筛选过程。
(2)每个物体标签仅仅选择一个中心点作为正样本,具体实现是在关键点热图上提取局部的峰值点,因此也就不会存在NMS的过程。
(3)由于CenterNet专注在关键点的检测,因此其可以使用更大的特征图,而无须使用多个不同大小的特征图。在CenterNet的论文中其使用的网络下采样率为4。
CenterNet尝试了串联Hourglass、ResNet等多种网络用来提取特征,生成了特征点的热图。实验结果表明,Hourglass的网络能够提供更精确的检测精度,而更轻量的ResNet的检测速度会更快。
另外,CenterNet网络中没有center pooling操作, 而是把CenterPoint当做关键点来处理, 中心处响应值最高, 让其上下左右四个位置低些, 其余位置为0。
为了提高中心点的定位精度, 同样也会在每个位置上预测两个offset。 box的宽高通过直接回归得到(h, w)。在将点回归到框的过程中, 会选择这个位置上的置信度比其他8个邻域位置置信度都要高的点。
CenterNet网络预测与损失计算
CenterNet参考了CornerNet的思想,网络输出了以下3个预测值:
关键点热图:这里的关键点热图与CornerNet类似,只是这里只预测一个中心点的位置。对于标签的处理,CenterNet将标签进行下采样,然后通过下式的高斯核函数分散到热图上。
中心点偏差:CenterNet对每个中心点增加了一个偏移的预测,并且所有类别共享同一个偏移预测值。
宽与高的预测:CenterNet不需要预测Embeddings来处理配对,而是预测了物体的宽与高,这里的预测是原图像素坐标的尺度。
总体上,对于特征图上的一个点,CenterNet会预测C+4个值,其中包括C个类别的中心点得分、中心点(x, y)的偏差以及该物体的宽高(w, h)。
CenterNet的整体损失函数:
其中,Lk为关键点的损失,使用了Focal Loss的形式;Lsize为宽与高的预测损失,Loff为偏移预测的损失;Lsize与λoff是为了平衡各部分损失而引入的权重。
这个思想可以用于多个任务,文章给出了三种类型的例子, object detection(目标检测),3D object detection(3D目标检测), multi human pose estimation(人体姿态检测)。
对于2D object detection, 就输出HxWx5的featurmap,包括(confidence, 2个offset, 2个object size)。对于3D object detection而言, 输出 HxWx12的featuremap,,包括(3个方向的size, 1个深度, 8个方向的指向)。
对于pose estimation而言,输出 HxWx(3k+2)的featuremap。其中kx2是k个关键点离centerpoint的偏移, k是每个关键点的point,2是每个关键点自身的偏移。在pose estimation inference的时候,首先得到k个关键点的位置,然后根据center point的2k个偏移得到另外一组k个关键点位置, 然后判断这k个关键点哪个是哪个类型的关键点,就是找离它最近的那k个关键点其中是哪个,最后应该还是以centpoint回归得到的点为准。
论文地址:https://arxiv.org/abs/1904.01355
代码地址:https://github.com/tianzhi0549/FCOS
通过消除预定义的锚框,FCOS避免了与锚框相关的复杂计算,例如在训练期间计算重叠等,并且显著减少了训练内存。更重要的是,FCOS还避免了设定与锚框相关的所有超参数,这些参数通常对最终检测性能非常敏感。FCOS算法凭借唯一的后处理:非极大值抑制(NMS),实现了优于以前基于锚框的one-stage检测算法的效果。
FCOS的网络结构还是FPN的结构,就是在生成p3~p7的时候,没有在C5上采样得到P6,而是直接用P5采样得到P6。
网络的输出有三个branch,classification branch输出每个点的类别, regression branch输出每个点的四个值, (l,t,r,b)。其实这两个branch都和keypoint detection思想很像,网络最主要的贡献在于提出了centernet-ness branch这个方法。以下分别介绍:
1.逐像素回归预测
YOLOv1中也使用了无anchor策略,但基于YOLOv1在预测边界框的过程中,提出的cell概念,导致YOLOv1只预测了目标物体中心点附近的点的边界框。这很显然预测的框少,召回率自然也就低了。基于此,FCOS算法为了提升召回率,则对目标物体框中的所有点都进行边界框预测。当然这种逐像素的边界框预测肯定会导致最终预测得到的边界框质量不高,因此作者在后续还会提出弥补策略。FCOS目标检测算法在边界框预测中使用的策略和YOLOv1有所不同,F提出的预测策略如下:
如上两张图所示,FCOS算法在对目标物体框中所有的点进行目标框回归时,用到各个边的距离长度来计算损失。之所以使用这种策略,而不使用主流目标检测算法的策略,其主要原因是为了后续使用center-ness准备。
由于FCOS算法是基于目标物体框中的点进行逐像素回归的,因此执行回归的目标都是正样本,所以作者使用了exp()函数将回归目标进行拉伸,可以此操作是为了最终的特征空间更大,辨识度更强。最后,逐像素回归预测除了能够带来更多的框以外,更重要的是利用了尽可能多的前景样本来训练回归器,而传统的基于anchor的检测器,只考虑具有足够高的IOU的anchor box作为正样本。作者认为,这可能是FCOS优于基于anchor的同类检测器的原因之一。
2. 多尺度策略
对于基于anchor的检测算法,由于较大的降采样操作而导致的低召回率可以通过降低正anchor所需的IOU阈值做一定程度上的补偿,进行召回率的提升。然而对于FCOS算法,如果降采样的尺度过大,那么网络不可能回忆起一个在最终特征图上没有位置编码的对象的初始框的,基于此作者提出了基于FPN的多尺度策略。(虽然作者在文中说,即使没有FPN策略,逐像素检测网络在召回率上表现的也不逊色基于anchor的网络)
如上图所示,FCOS算法那使用了{P3, P4, P5, P6, P7}这五个尺度的特征映射。其中P3、P4、P5由主干CNNs网络的特征层 C3、C4、C5经过一个1*1的卷积得到的,而,P6、P7则是接着P5进行了步长为2的卷积操作得到的(相当于降采样,看注解)。最终对这五个尺度都做逐像素回归。
当然,为了能够更好的利用这种多尺度特征,在每一个尺度的特征层都限定了边界框回归的范围。具体步骤如下:
计算当前层级中的回归目标:l、t、r、b
判断max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1是否满足。
若满足,则不对此边界框进行回归预测。
mi是作为当前尺度特征层的最大回归距离。
而且这种约束带来的额外的效果在于,由于不同尺寸的物体被分配到不同的特征层进行回归,又由于大部分重叠发生在尺寸相差较大的物体之间,因此多尺度预测可以在很大程度上缓解目标框重叠情况下的预测性能。
3. center-ness
由于FCOS算法使用了逐像素回归策略,在提升召回率的同时,会产生许多低质量的中心点偏移较多的预测边界框。基于此,作者提出了一个简单而有效的策略center-ness来抑制这些低质量检测到的边界框,且该策略不引入任何超参数。
如上图所示,center-ness策略在每一个层级预测中添加了一个分支,该分支与分类并行,相当于给网络添加了一个损失,而该损失保证了预测的边界框尽可能的靠近中心。
具体来说,FCOS添加单层分支,与分类分支并行,以预测Center-ness位置。
从图中可以看出,box的中心处响应值最高, 随后逐次降低,值的范围在0~1之间。centet-ness branch中每个featuremap位置上的值计算是根据回归计算得到的(l, t, r, b), 可以看出, 越是中间位置, centerness值就越高, 越偏离中心处,centerness值就会越低,centerness-branch的loss用BCE来计算。
center-ness(可以理解为一种具有度量作用的概念,在这里称之为中心度,中心度取值为0,1之间,使用交叉熵损失进行训练。并把损失加入前面提到的损失函数中。测试时,将预测的中心度与相应的分类分数相乘,计算最终得分(用于对检测到的边界框进行排序)。因此,中心度可以降低远离对象中心的边界框的权重。因此,这些低质量边界框很可能被最终的非最大抑制(NMS)过程滤除,从而显着提高了检测性能。
从15年densebox第一次提出anchor-free的思想,到2019年的anchor-free detector的文章井喷, 有2点原因, 一是anchor-based的网络已经调不动了或者只是AP0.1的大小提升; 二是18年出的cornernet开源, 让大家认识到这个方向的可行性(densebox没有开源)。
无论哪种方法, 其实都是着重于如何更有效的表达“box”这个概念。cornernet用上下两个角点, centernet加上了中心点,,grid rcnn用九个点,,objects as points用1个点+hw,extreme net用四个极值点+中心点,FCOS和densebox很像,多加了一个center-ness branch。从整体速度/精度平衡上看,objects as points做到了最优的速度/精度平衡, 而且思路很简单。
展望
Anchor-free 的方法由于网络结构简单,对于工业应用来说可能更加友好。对于方法本身的发展,我感觉一个是新的 instance segmentation pipeline,因为 anchor-free 天生和 segmentation 更加接近。一个是向两阶段或者级联检测器靠拢,进一步提高性能,如果能在不使用 RoI Pooling 的情况下解决 feature align 问题的话,还是比较有看头的。另外还有一个是新的后处理方法,同时也期待看到 anchor-free 的灵活性带来新的方法和思路。
参考:
1.深度学习之PyTorch物体检测实战 董洪义
2.https://blog.csdn.net/Murdock_C/article/details/89681076
3.http://suo.im/5AowRL
4.http://suo.im/5sSjnA
5.http://suo.im/63N0KX
6.https://zhuanlan.zhihu.com/p/62372897
注意:目标检测系列历史文章
秘籍一:模型加速之轻量化网络
秘籍二:非极大抑制算法和回归损失优化之路
秘籍三:多尺度训练
秘籍四:数据增强
秘籍五:解决样本不均衡问题
-END-
扫描个人微信号,
拉你进AI算法修炼营学习交友群。
目标检测、图像分割、自动驾驶、机器人、面试经验
福利满满,名额已不多…
▲长按关注我们
觉得好看对你有帮助,就点个在看吧