Anchor-free目标检测 | 工业应用更友好的新网络(附大量相关论文下载)

2020-12-29 11:42:31 浏览数 (1)

随着 CVPR 2020和ICCV 2020的结束,一大批目标检测的论文在arXiv上争先恐后地露面,更多的论文都可以直接下载。

下面几篇paper有异曲同工之妙,开启了anchor-based和anchor-free的轮回。

1. Feature Selective Anchor-Free Module for Single-Shot Object Detection

2. FCOS: Fully Convolutional One-Stage Object Detection

3. FoveaBox: Beyond Anchor-based Object Detector

4. High-level Semantic Feature Detection: A New Perspective for Pedestrian Detection

这几篇论文不约而同地将矛头对准了Anchor这个检测里面的基础模块,采用anchor-free的方法在单阶段检测器上达到了和anchor-based方法类似或者更好的效果。

anchor-free和anchor-based区别

这个问题首先需要回答为什么要有anchor。在深度学习时代,物体检测问题通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中,这些候选区域就是通过滑窗方式产生的anchor;在两阶段检测器中,候选区域是RPN生成的proposal,但是RPN本身仍然是对滑窗方式产生的anchor进行分类和回归。

而在上面几篇论文的anchor-free方法中,是通过另外一种手段来解决检测问题的。同样分为两个子问题,即确定物体中心和对四条边框的预测。预测物体中心时,具体实现既可以像1、3那样定义一个hard的中心区域,将中心预测融入到类别预测的target里面,也可以像2、4那样预测一个soft的centerness score。对于四条边框的预测,则比较一致,都是预测该像素点到ground truth框的四条边距离,不过会使用一些trick来限制 regress 的范围。

为什么anchor-free能卷土重来

anchor-free 的方法能够在精度上媲美 anchor-based 的方法,最大的功劳我觉得应该归于 FPN,其次归于 Focal Loss。(内心OS:RetinaNet 赛高)。在每个位置只预测一个框的情况下,FPN 的结构对尺度起到了很好的弥补,FocalLoss 则是对中心区域的预测有很大帮助。当然把方法调 work 并不是这么容易的事情,相信有些细节会有很大影响,例如对重叠区域的处理,对回归范围的限制,如何将 target assign 给不同的 FPN level,head 是否 share 参数等等。

anchor-free 和 single anchor

上面提到的 anchor-free 和每个位置有一个正方形 anchor 在形式上可以是等价的,也就是利用 FCN 的结构对 feature map 的每个位置预测一个框(包括位置和类别)。但 anchor-free 仍然是有意义的,我们也可以称之为 anchor-prior-free。另外这两者虽然形式上等价,但是实际操作中还是有区别的。在 anchor-based 的方法中,虽然每个位置可能只有一个 anchor,但预测的对象是基于这个 anchor 来匹配的,而在 anchor-free 的方法中,通常是基于这个点来匹配的。

anchor-free的局限性

虽然上面几种方法的精度都能够与 RetinaNet 相媲美,但也没有明显优势(或许速度上有),离两阶段和级联方法相差仍然较远。和 anchor-based 的单阶段检测器一样,instance-level 的 feature representation 是不如两阶段检测器的,在 head 上面的花样也会比较少一些。顺便吐槽一下,上面的少数 paper 为了达到更好看的结果,在实验上隐藏了一些细节或者有一些不公平的比较。

anchor-free的其他套路

anchor-free 除了上面说的分别确定中心点和边框之外,还有另一种 bottom-up 的套路,以 CornerNet 为代表。如果说上面的 anchor-free 的方法还残存着区域分类回归的思想的话,这种套路已经跳出了这个思路,转而解决关键点定位组合的问题。

这里就不详细讨论每一篇论文的方法(回复提供下载链接),下面开始主要分享一下个人的想法。

  • 早期探索: DenseBox: https://arxiv.org/abs/1509.04874 YOLO: https://arxiv.org/abs/1506.02640
  • 基于关键点: CornerNet: https://arxiv.org/abs/1808.01244 ExtremeNet: https://arxiv.org/abs/1901.08043
  • 密集预测: FSAF: https://arxiv.org/abs/1903.00621 FCOS: https://arxiv.org/abs/1904.01355 FoveaBox: https://arxiv.org/abs/1904.03797v1

DenseBox:

如上图所示,单个FCN同时产生多个预测bbox和置信分数的输出。测试时,整个系统将图片作为输入,输出5个通道的feature map。每个pixel的输出feature map得到5维的向量,包括一个置信分数和bbox边界到该pixel距离的4个值。最后输出feature map的每个pixel转化为带分数的bbox,然后经过NMS后处理。除了NMS之外,检测系统的所有组成部分都构建在FCN之中。

网络结构如下图所示,基于VGG19进行的改进,整个网络包含16层卷积,前12层由VGG19初始化,输出conv4_4后接4个1x1的卷积,前两个卷积产生1-channel map用于类别分数,后两个产生4-channel map用于预测相对位置。最后一个1x1的卷积担当这全连接层的作用。

Refine with Landmark Localization

在DenseBox中由于是全卷积网络,因此,基于landmark定位可以通过简单添加一些层来进行实现。通过融合landmark heatmaps及目标score maps来对检测结果进行增强。如下图所示,增加了一个分支用于landmark定位,假设存在N个landmarks,landmark 定位分支将会输出N个响应maps,其中,每个像素值代表该位置为landmark的置信分数。该任务的ground truth maps与检测的十分相似,对于一个landmark 实例

,landmark k的第i个实例,其对应的ground truth 是位于输出坐标空间中第k个响应 map上的positive 标记的区域。半径rl应当较小从而避免准确率的损失。与分类任务相似,landmark 定位损失也是定义为预测值与真实值的L2损失。同样使用negative mining及ignore region。

YOLOv1:

YOLO意思是You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看两眼哦)就能知道有哪些对象以及它们的位置。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将图片划分为 7*7=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49*2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。

代码语言:javascript复制
RCNN:我们先来研究一下图片,嗯,这些位置很可能存在一些对象,你们对这些位置再检测一下看到底是哪些对象在里面。
YOLO:我们把图片大致分成98个区域,每个区域看下有没有对象存在,以及具体位置在哪里。
RCNN:你这么简单粗暴真的没问题吗?
YOLO:当然没有......咳,其实是有一点点问题的,准确率要低一点,但是我非常快!快!快!
RCNN:为什么你用那么粗略的候选区,最后也能得到还不错的bounding box呢?
YOLO:你不是用过边框回归吗?我拿来用用怎么不行了。

1)结构 去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示。

因为只是一些常规的神经网络结构,所以,理解YOLO的设计的时候,重要的是理解输入和输出的映射关系.

2)输入和输出的映射关系

3)输入 参考图5,输入就是原始图像,唯一的要求是缩放到448*448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448*448。

4)输出 输出是一个 7*7*30 的张量(tensor)。

4.1)7*7网格 根据YOLO的设计,输入图像被划分为 7*7 的网格(grid),输出张量中的 7*7 就对应着输入图像的 7*7 网格。或者我们把 7*7*30 的张量看作 7*7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。参考上面图5,比如输入图像左上角的网格对应到输出张量中左上角的向量。

要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。

4.2)30维向量 具体来看每个网格对应的30维向量中包含了哪些信息。

① 20个对象分类的概率 因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。可以记为

,之所以写成条件概率,意思是如果该网格存在一个对象Object,那么它是

的概率是

。(记不清条件概率的同学可以参考一下 理解贝叶斯定理)

② 2个bounding box的位置 每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。

③ 2个bounding box的置信度 bounding box的置信度 = 该bounding box内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU用公式来表示就是:

是bounding box内存在对象的概率,区别于上面第①点的

。Pr(Object)并不管是哪个对象,它体现的是 有或没有 对象的概率。第①点中的

意思是假设已经有一个对象在网格中了,这个对象具体是哪一个。

是 bounding box 与 对象真实bounding box 的IOU(Intersection over Union,交并比)。要注意的是,现在讨论的30维向量中的bounding box是YOLO网络的输出,也就是预测的bounding box。所以

体现了预测的bounding box与真实bounding box的接近程度。 还要说明的是,虽然有时说"预测"的bounding box,但这个IOU是在训练阶段计算的。等到了测试阶段(Inference),这时并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要(也无法)计算IOU了。

综合来说,一个bounding box的置信度Confidence意味着它 是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差。

简单解释一下IOU。下图来自Andrew Ng的深度学习课程,IOU=交集部分面积/并集部分面积,2个box完全重合时IOU=1,不相交时IOU=0。

总的来说,30维向量 = 20个对象的概率 2个bounding box * 4个坐标 2个bounding box的置信度

4.3)讨论 ① 一张图片最多可以检测出49个对象 每个30维向量中只有一组(20个)对象分类的概率,也就只能预测出一个对象。所以输出的 7*7=49个 30维向量,最多表示出49个对象。

② 总共有 49*2=98 个候选区(bounding box) 每个30维向量中有2组bounding box,所以总共是98个候选区。

③ YOLO的bounding box并不是Faster RCNN的Anchor Faster RCNN等一些算法采用每个grid中手工设置n个Anchor(先验框,预先设置好位置的bounding box)的设计,每个Anchor有不同的大小和宽高比。YOLO的bounding box看起来很像一个grid中2个Anchor,但它们不是。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。

这里采用2个bounding box,有点不完全算监督算法,而是像进化算法。如果是监督算法,我们需要事先根据样本就能给出一个正确的bounding box作为回归的目标。但YOLO的2个bounding box事先并不知道会在什么位置,只有经过前向计算,网络会输出2个bounding box,这两个bounding box与样本中对象实际的bounding box计算IOU。这时才能确定,IOU值大的那个bounding box,作为负责预测该对象的bounding box。 训练开始阶段,网络预测的bounding box可能都是乱来的,但总是选择IOU相对好一些的那个,随着训练的进行,每个bounding box会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想。

另外论文中经常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. 这个 responsible 有点让人疑惑,对预测"负责"是啥意思。其实没啥特别意思,就是一个Object只由一个grid来进行预测,不要多个grid都抢着预测同一个Object。更具体一点说,就是在设置训练样本的时候,样本中的每个Object归属到且仅归属到一个grid,即便有时Object跨越了几个grid,也仅指定其中一个。具体就是计算出该Object的bounding box的中心位置,这个中心位置落在哪个grid,该grid对应的输出向量中该对象的类别概率是1(该gird负责预测该对象),所有其它grid对该Object的预测概率设为0(不负责预测该对象)。

还有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. 同样,虽然一个grid中会产生2个bounding box,但我们会选择其中一个作为预测结果,另一个会被忽略。下面构造训练样本的部分会看的更清楚。

④ 可以调整网格数量、bounding box数量 7*7网格,每个网格2个bounding box,对448*448输入图像来说覆盖粒度有点粗。我们也可以设置更多的网格以及更多的bounding box。设网格数量为 S*S,每个网格产生B个边框,网络支持识别C个不同的对象。这时,输出的向量长度为:

整个输出的tensor就是:

YOLO选择的参数是 7*7网格,2个bounding box,20种对象,因此 输出向量长度 = 20 2 * (4 1) = 30。整个输出的tensor就是 7*7*30。

因为网格和bounding box设置的比较稀疏,所以这个版本的YOLO训练出来后预测的准确率和召回率都不是很理想,后续的v2、v3版本还会改进。当然,因为其速度能够满足实时处理的要求,所以对工业界还是挺有吸引力的。

5)训练样本构造 作为监督学习,我们需要先构造好训练样本,才能让模型从中学习。

对于一张输入图片,其对应输出的7*7*30张量(也就是通常监督学习所说的标签y或者label)应该填写什么数据呢。

首先,输出的 7*7维度 对应于输入的 7*7 网格;然后具体看下30维向量的填写。

① 20个对象分类的概率 对于输入图像中的每个对象,先找到其中心点。比如图8中的自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的"中心点所在的网格对预测该对象负责"。狗和汽车的分类概率也是同样的方法填写。

② 2个bounding box的位置 训练样本的bounding box位置应该填写对象实际的bounding box,但一个对象对应了2个bounding box,该填哪一个呢?上面讨论过,需要根据网络输出的bounding box与对象实际bounding box的IOU来选择,所以要在训练过程中动态决定到底填哪一个bounding box。参考下面第③点。

③ 2个bounding box的置信度 上面讨论过置信度公式:

6)损失函数

损失就是网络实际输出值与样本标签值之间的偏差。

YOLO给出的损失函数如下

DenseBox和YOLO的区别:

1.DenseBox最初应用于人脸检测,相当于只有两类,而YOLO是通用检测,通常大于两类。 2.DenseBox是密集预测,对每个pixel进行预测,而YOLO先将图片进行网格化,对每个grid cell进行预测,所以前者更适合于小目标,后者更适合于大目标。 3.DenseBox的gt通过bbox中心圆形区域确定的,而YOLO的gt由bbox中心点落入的grid cell确定的。

CornerNet:

下图,经过特征提取主干网络(主干网络为Hourglass-104)后分为两个分支(两个分支分别接前面提到的corner pooling,随后细谈),一个分支生成目标左上点热力图,一个分支生成目标右下点热力图,而此时两个热力图并没有建立联系,因此无法确定两点是够属于同一目标,因此两分支同时生成embeddings,通过判断两个embedding vector的相似性确定同一物体(距离小于某一阈值则划为同一目标)。

1、输入一张图像,经过backbone网络(Hourglass network)后,得到feature map。 2、将feature map同时输入到两个branch,分别用于预测Top-Left Corners和Bottom-right Corners。 3、两个branch都会先经过一个叫Corner Pooling的网络,最后输出三个结果,分别是Heatmaps、Embeddings、Offsets。 4、根据Heatmaps能够得到物体的左上角点和右下角点,根据Offsets对左上角和右下角点位置进行更加精细的微调,根据Embeddings可以将同一个物体的左上角和右下角点进行匹配。得到到最终的目标框。

1:怎么检测这个两个点?生成keypoint的heatmap,heatmap中响应值最大的位置就是点的位置。 2:怎么知道这两个点所组成的框包含物体的类别?每个heatmaps集合的形式都是CxHxW,其中C代表的是检测目标的类别数,H和W则代表的heatmap的分辨率,Corner响应值最大所在的channel即对应了物体的类别。 3:当图像中有多个物体时,怎么知道哪些点可以组成框?(哪些左上角的点和哪些右下角的点能够组成有效的框)生成embedding向量,用向量的距离衡量两个Corner是否可以组成对。 4:Loss是什么形式?loss总共分了三个部分,一部分是用于定位keypoint点的detecting loss,一个是用于精确定位的offset loss,一个是用于对Corner点进行配对的grouping loss。 5:网络结构是怎么样的?使用Hourglass作为backbone,使用Corner Pooling构造了prediction module,用来得到最终的结果。 6:有没有什么比较新奇的东西?提出的Corner Pooling,第一次使用检测点的方法检测物体。

贡献: 1.通过检测bbox的一对角点来检测出目标。 2.提出corner pooling,来更好的定位bbox的角点。

上图是top-left corner的 Corner Pooling过程。在水平方向,从最右端开始往最左端遍历,每个位置的值都变成从最右到当前位置为止,出现的最大的值。同理,bottom-right corner的Corner Pooling则是最左端开始往最右端遍历。同样的,在垂直方向上,也是这样同样的Pooling的方式。 以左上角点为例,当我们决定此点是否个corner点的时候,往往会沿着水平的方向向右看,看看是否与物体有相切,还会沿着垂直方向向下看,看看是否与物体相切。简而言之,其实corner点是物体上边缘点和坐边缘点的集合,因此在pooling的时候通过Corner Pooling的方式能够一定程度上体现出当前点出发的射线是否与物体相交。

ExtremeNet:

作者使用了最佳的关键点估计框架,通过对每个目标类预测4个多峰值的heatmaps来寻找极值点。另外,作者使用每个类center heatmap来预测目标中心。仅通过基于几何的方法来对极值点分组,如果4个极值点的几何中点在center map上对应的分数高于阈值,则这4个极值点分为一组。 offset的预测是类别无关的,而极值点的预测是类别相关的。对每种极值点heatmap,不包含center map,预测2张offset map(分别对应XY轴方向)。网络的输出是5xC heatmaps和4x2offset maps,C是类别数。 分组算法的输入是每个类的5个heatmaps,一个center heatmap和4个extreme heatmaps,通过检测所有的峰值来提取出5个heatmaps的关键点。给出4个极值点,计算几何中心,如果几何中心在center map上对应高响应,那么这4个极值点为有效检测。作者使用暴力枚举的方式来得到所有有效的4个关键点。 贡献: 1.将关键点定义为极值点。 2.根据几何结构对关键点进行分组。

CornerNet和ExtremeNet的区别:

1.CornerNet通过预测角点来检测目标的,而ExtremeNet通过预测极值点和中心点来检测目标的。

2.CornerNet通过角点embedding之间的距离来判断是否为同一组关键点,而ExtremeNet通过暴力枚举极值点、经过中心点判断4个极值点是否为一组。

FSAF:

让每个实例选择最好的特征层来优化网络,因此不需要anchor来限制特征的选择。

一个anchor-free的分支在每个特征金字塔层构建,独立于anchor-based的分支。和anchor-based分支相似,anchor-free分支由分类子网络和回归子网络。一个实例能够被安排到任意层的anchor-free分支。训练期间,基于实例的信息而不是实例box的尺寸来动态地为每个实例选择最合适的特征层。选择的特征层学会检测安排的实例。推理阶段,FSAF模块和anchor-based分支独立或者联合运行。

在RetinaNet的基础上,FSAF模块引入了2个额外的卷积层,这两个卷积层各自负责anchor-free分支的分类和回归预测。具体的,在分类子网络中,feature map后面跟着K个3x3的卷积层和sigmoid,在回归子网络中,feature map后面跟着4个3x3的卷积层和ReLU。

实例输入到特征金字塔的所有层,然后求得所有anchor-free分支focal loss和IoU loss的和,选择loss和最小的特征层来学习实例。训练时,特征根据安排的实例进行更新。推理时,不需要进行特征更新,因为最合适的特征金字塔层自然地输出高置信分数。

FCOS:

和语义分割相同,检测器直接将位置作为训练样本而不是anchor。具体的,如果某个位置落入了任何gt中,那么该位置就被认为是正样本,并且类别为该gt的类别。基于anchor的检测器,根据不同尺寸安排anchor到不同的特征层,而FCOS直接限制边界框回归的范围(即每个feature map负责一定尺度的回归框)。

Center-ness:

为了剔除远离目标中心的低质量预测bbox,作者提出了添加center-ness分支,和分类分支并行。

优点: 1.将检测和其他使用FCN的任务统一起来,容易重用这些任务的思想。 2.proposal free和anchor free,减少了超参的设计。 3.不使用trick,达到了单阶段检测的最佳性能。 4.经过小的修改,可以立即拓展到其他视觉任务上。

FoveaBox:

人类眼睛的中央凹:视野(物体)的中心具有最高的视觉敏锐度。FoveaBox联合预测对象中心区域可能存在的位置以及每个有效位置的边界框。由于特征金字塔的特征表示,不同尺度的目标可以从多个特征层中检测到。

FoveaBox添加了2个子网络,一个子网络预测分类,另一个子网络预测bbox。

Object Fovea:

目标的中央凹如上图所示。目标中央凹只编码目标对象存在的概率。为了确定位置,模型要预测每个潜在实例的边界框。

FSAF、FCOS、FoveaBox的异同点:

1.都利用FPN来进行多尺度目标检测。 2.都将分类和回归解耦成2个子网络来处理。 3.都是通过密集预测进行分类和回归的。 4.FSAF和FCOS的回归预测的是到4个边界的距离,而FoveaBox的回归预测的是一个坐标转换。 5.FSAF通过在线特征选择的方式,选择更加合适的特征来提升性能,FCOS通过center-ness分支剔除掉低质量bbox来提升性能,FoveaBox通过只预测目标中心区域来提升性能。

总结: 1.各种方法的关键在于gt如何定义 2.主要是基于关键点检测的方法和密集预测的方法来做Anchor-Free 3.本质上是将基于anchor转换成了基于point/region

下一期我们详细说说商汤的《CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection》,基于向心偏移的anchor-free目标检测网络centripetalnet,为基于关键点的目标检测方法研究带来了新思路。

/End.

0 人点赞