目标检测领域最近有个较新的方向:基于关键点进行目标物体检测。该策略的表明算法为:CornerNet和CenterNet。因为本人工做特性,对网络的实时性要求比较高,所以多用YoLov3及其变体。而就在今天下午得知,基于CornerNet改进的CornerNet-Squeeze网络竟然在实时性和精度上都超越了YoLov3,我仍是蛮激动的,故趁此机会学习下该类检测算法的原理。git
cornerNer论文连接:https://arxiv.org/pdf/1808.01244.pdf
github:https://github.com/umich-vl/CornerNet
CenterNet论文连接:https://arxiv.org/abs/1904.08189
github:https://github.com/Duankaiwen/CenterNet
CornerNe-Lite论文连接: https://arxiv.org/abs/1904.08900
github: https://github.com/princeton-vl/CornerNet-Litegithub
所谓基于关键点进行目标检测,其实就是使用one-stage网络将目标边界框检测为一对关键点(即边界框的左上角和右下角)。经过将目标检测为成对关键点,就可消除现有的one-stage检测网络中对一组anchors的须要,这个最近火热的anchor-free也是不谋而合。接下来,先简单介绍下CornetNet和CenterNet这两个基于特征点的目标检测网络。最后对CornerNet-Squeeze作个简单介绍!算法
CornerNet网络的总体思路是,首先经过Hourglass Network网络进行特征提取,紧接着将网络获得的特征输入到两个模块:Top-left Corner pooling
和Bottom-right Corner pooling
提取关键点的特征,对于每一个Corner Pooling模块都会进行目标框的左上角关键点和右下角关键点的类别分类(Heatmaps
),并找到每一个目标的一对关键点(Embeddings
),以及减小基于坐标回算目标目标位置时的偏置(offsets
)。网络的总体结构图以下:markdown
很显然,CornerNet的核心是四个部分:网络
两个Corner Pooling
下图展现的是Top-left corner pooling的示意图,为了使得关键点的特征可以表征左上角和右下角关键点所包含的目标区域的特征,做者提出了以下所示的corner pooling的策略,好比下图所示,为求左上角关键点特征,须要求当前关键点同一行中的左边区域的最大值,和同一列中的下面区域的最大值,并将两个最大值相加才是当前位置的左上角关键点特征。ide
Heatmaps模块
经过Heatmaps模块,网络会预测每个关键点所属于的类别,该过程当中使用的损失函数以下:函数
上述公式是针对角点预测(headmaps)的损失函数,总体上是改良版的focal loss。几个参数的含义:pcij表示预测的heatmaps在第c个通道(类别c)的(i,j)位置的值,ycij表示对应位置的ground truth,N表示目标的数量。ycij=1时候的损失函数容易理解,就是focal loss,α参数用来控制难易分类样本的损失权重;ycij等于其余值时表示(i,j)点不是类别c的目标角点,照理说此时ycij应该是0(大部分算法都是这样处理的),可是这里ycij不是0,而是用基于ground truth角点的高斯分布计算获得,所以距离ground truth比较近的(i,j)点的ycij值接近1,这部分经过β参数控制权重,这是和focal loss的差异。为何对不一样的负样本点用不一样权重的损失函数呢?这是由于靠近ground truth的误检角点组成的预测框仍会和ground truth有较大的重叠面积,以下图所示所示。
图中,红色实线框是ground truth;橘色圆圈是根据ground truth的左上角角点、右下角角点和设定的半径值画出来的,半径是根据圆圈内的角点组成的框和ground truth的IOU值大于0.7而设定的,圆圈内的点的数值是以圆心往外呈二维的高斯分布;白色虚线是一个预测框,能够看出这个预测框的两个角点和ground truth并不重合,可是该预测框基本框住了目标,所以是有用的预测框,因此要有必定权重的损失返回,这就是为何要对不一样负样本点的损失函数采起不一样权重值的缘由。post
embedding这部分的训练是经过两个损失函数实现的,etk表示属于k类目标的左上角角点的embedding vector,ebk表示属于k类目标的右下角关键点的embedding vector,ek表示etk和ebk的均值。公式4用来缩小属于同一个目标(k类目标)的两个关键点的embedding vector(etk和ebk)距离。公式5用来扩大不属于同一个目标的两个角点的embedding vector距离。性能
最终,以下图所示,上半支路的网络结果以下所示,网络最终是由两条支路组成的。学习
CenterNet网络主要是基于CornerNet网络存在的问题,而提出的基于关键点目标检测的网络。其实现了目前为止在one-stage系类算法中最高的MAP。CenterNet的做者发现,CornerNet是经过检测物体的左上角点和右下角点来肯定目标,但在此过程当中CornetNet使用corner pooling仅仅可以提取到目标边缘的特征,而致使CornetNet会产生不少的误检。基于此,CenterNet利用关键点三元组
即中心点、左上角关键点和右下角关键点
三个关键点而不是两个点来肯定一个目标,使得网络可以获取到目标内部的特征。而CornerNet在论文中也说道了,约束其网络性能最重要的部分是关键点的提取,所以CenterNet提出了Center Pooling
和cascade corner Pooling
用来更好的提取本文提出的三个关键点。
三元组预测
以下图所示,网络经过 cascade corner pooling获得左上角,右下角的关键点类别。并经过center pooling获得中心点的关键点类别。随后经过 offsets 将三个关键点位置尽量精确的映射到输入图片的对应位置,最后经过 embedings 判断三个点是否属于同一个目标。
在预测中心点特征时,对每一个预测框定义一个中心区域,经过判断每一个目标框的中心区域是否含有中心点,如有则保留,而且此时预测框的 confidence 为中心点,左上角关键点和右下角关键点的confidence的平均,若无则去除。而很显然,对于每一个预测框的中心区域,咱们须要其和预测框的大小进行适应,由于中心区面积太小会使得小尺度的错误预测框没法被去除,而中心区过大会致使大尺度的错误预测框没法被去除。所以做者提出以下策略:
如上图所示,当预测框的尺寸较大时,咱们获得的中心区域面积也会变小,而与之对应的,当预测框的尺寸较小时,中心区域的面积也会变大。
Center Pooling
做者基于Corner Pooling的系列思想,提出了Center Pooling的思想,使得网络提取到的中心点特征可以更好的表征目标物体。
一个物体的中心并不必定含有很强的,易于区分于其余类别的语义信息。例如,一我的的头部含有很强的,易于区分于其余类别的语义信息,可是其中心每每位于人的中部。咱们提出了center pooling 来丰富中心点特征。上图为该方法原理,center pooling提取中心点水平方向和垂直方向的最大值并相加,以此给中心点提供所处位置之外的信息。这一操做使中心点有机会得到更易于区分于其余类别的语义信息。Center pooling 可经过不一样方向上的 corner pooling 的组合实现。一个水平方向上的取最大值操做可由 left pooling 和 right pooling经过串联实现,同理,一个垂直方向上的取最大值操做可由 top pooling 和 bottom pooling经过串联实现,如图6所示。
通常状况下角点位于物体外部,所处位置并不含有关联物体的语义信息,这为角点的检测带来了困难。上图(b) 为传统作法,称为 corner pooling。它提取物体边界最大值并相加,该方法只能提供关联物体边缘语义信息,对于更加丰富的物体内部语义信息则很难提取到。上图©为cascade corner pooling 原理,它首先提取物体边界最大值,而后在边界最大值处继续向内部(图中沿虚线方向)提取提最大值,并与边界最大值相加,以此给角点特征提供更加丰富的关联物体语义信息。Cascade corner pooling 也可经过不一样方向上的 corner pooling 的组合实现,如图8 所示,图8展现了cascade left corner pooling 原理。
最终,CenterNet在CornerNet的基础上增长了中心点的预测,以及修改了关键点特征的提取方式,大大减少了网络的误检,而且实现了one-stage系列算法中的最好效果。
普林斯顿大学在4月19号提出了两种更高效的基于关键点的目标检测算法,分别为:CornetNet-Saccade
和CornetNet-Squeeze
,若将两种策略结合则称为CornerNet-Lite
。
如上图所示,CornerNet-Squeeze专一于速度,但其在性能和速度上都超越了YOLOv3,而CornerNet-Saccade专一于精度。
如上图所示,咱们发现CornetNet-Saccade
和CornetNet-Squeeze
确实很优秀。
如下是Cver对这两个网络的介绍,我的感受写的很好,我就不造轮子了:
最终我最感兴趣的网络CornerNet-Squeeze和YOLOv3进行对比,达到了以下图所示的效果。
然而,就在我学习并总结这篇文章的过程当中,我发现CornerNet-Squeeze是基于CornerNet改进的,但正如上文中介绍CenterNet的时候提到过的CornerNet所具备的那些弊端,我总以为CornerNet-Squeeze在误检的部分不必定会很优秀,因此接下来就是看源码阶段了,但愿CornerNet-Squeeze可以不负我望哈~
参考文献:
https://mp.weixin.qq.com/s/lk268kc55Lgz1d_21zg26A
https://blog.csdn.net/u014380165/article/details/83032273
https://mp.weixin.qq.com/s/xy1WWl2rNvGAXnqIJCy-Mg