目前的单阶段检测因为引入了anchor机制,获得可以和两阶段检测相媲美的精度的同时,有较高的效率。单阶段检测器在输入图像上放置了密集的 anchor ,并通过微调和回归 box 尺寸来得到最终的预测。
使用anchor的方法的缺点:
正负样本不均衡:大部分检测算法的anchor数量都成千上万,(DSSD中使用了多于40k个anchor,RetinaNet 中使用了多于100k个anchor)但是一张图中的目标数量并没有那么多,这就导致正样本数量会远远小于负样本,因此有了对负样本做欠采样以及 focal loss等算法来解决这个问题。
引入更多的超参数,比如anchor的数量、大小和宽高比等。
CornerNet 的特点:
一种新的、无anchor的单阶段目标检测方法
检测 b-box 的左上和右下角的角点
使用单个卷积神经网络来预测同一目标类别(category)中的所有实例的“左上”角点的和 heatmap、右下角点的 heatmap、每个检测到角点的 embedding vector。嵌入向量用于对属于同一目标的 corner 进行分组,也就是该网络的训练目标是实现对同一目标的“左上”和“右下”角点进行匹配,将两者预测得到相同的嵌入向量。
本文的方法很大程度地简化了网络的输出,并且无需设计相应的 anchor。
本文方法灵感源于Newell等人的文章(2017)中的多人姿态估计上下文中关联嵌入方法,结构如图1所示。
图1 将目标检测为一对b-box的角点
利用卷积网络,对所有的左上角点生成一幅热力图,对所有右下角点生成一幅热力图,并且对所有检测到的角点生成一个嵌入式向量。训练网络将属于同一目标的角点预测成相同的嵌入式向量。
文章认为,检测角点效果比检测b-box中心点或region proposal 方法更好的原因有两个:
b-box 的中心确定后也很难确定b-box的位置,因为其基于目标的四个边,而定位角点只基于两个边,更简单。且使用 corner pooling使其更加简单,因为该pooling方法能够对corner的先验知识进行编码。
角点能够提供更有效的方法来密集的离散化box空间,只需要 O ( w h ) O(wh) O(wh) 个角点就可以表示 O ( w 2 h 2 ) O(w^2h^2) O(w2h2) 个 anchor boxes。
为了平衡正负样本,在训练中使用了改进的 focal loss:
为了提高 corner point 的检测准确性,还添加了一个和类别无关的 offset map,用来弥补下采样过程引起的分辨率损失。 offset map 训练过程使用了平滑的 L1 loss:
Corner Pooling:
一般情况下,物体的角点不会在物体上,我们在寻找物体的角点时,如左上角,一般会先向左看,找到最靠左的点,然后向上看,找到最靠上的点,那么这两个值组成的点便是左上角点;右下角同理。
Bottom-up Object Detection by Grouping Extreme and Center Points
论文中说,cornernet检测的左上和右下角点虽然取得了较好的成绩,但是这两个点并不是物体上的特征点,所以论文提出检测物体的“最左”、“最右”、“最上”和“最下”四个点,这四个点在图像特征上,更有意义,网络更好学。
Extremnet检测思路:通过标准的关键点检测网络来检测出四个极值点和1个中心点,通过几何关系对提取到的关键点进行分组,一组极值点(5个)对应一个检测结果。
是的目标检测问题转化成了一个纯粹的基于目标的外观特征的关键点估计问题,巧妙的避开了区域分类和隐含特征的学习。
Extreme and center points
传统标注使用矩形框标注目标,而矩形框一般会用左上角和右下角两个点表示。
而在ExtremeNet中,使用四点标注法,即一个目标用上下左右四个方向上的极值点来表示。额外的,通过这四个点可以计算出该目标的中心坐标。
关键点检测:
使用fully convolutional encoder-decoder network预测一个多通道heatmap,每个通道都对应一个类别的关键点。
使用HourglassNetwork作为backbone,对每张heatmap进行加权逐点逻辑回归,加权的目的是为了减少ground truth周围的虚警惩罚。
由于传统的anchor-based方法需要预设大量的 proposal 并且需要类似于 NMS 这样的后处理,大大增加了其处理复杂度。
目前已经出现的 anchor-free 的目标检测方法,比如 cornernet 和 extremenet,都在检测效率上有了一定突破,但其需要将点进行组对儿,cornernet 学习关键点的嵌入式表达,来把距离最近的点组对儿。extremenet 也需要对点进行组对儿。这会严重拉低算法的运行速度。
centernet 只检测目标的中心点,无需后续组对儿操作。
centernet 的方法接近于 anchor-based 的单阶段方法,中心点可以被看成一个形状未知的 anchor(图3所示),但还有一些区别:
输入:
输出:
backbone:
1、真实标签怎么得到:
2、训练目标函数:像素级逻辑回归的 focal loss
其中:
该 Focal loss 函数是针对 CenterNet 修正而来的损失函数,和 Focal Loss类似,对于easy example的中心点,适当减少其训练比重也就是loss值.
( 1 − Y ^ x y z ) α (1-\hat{Y}_{xyz})^{\alpha} (1−Y^xyz)α 和 ( Y ^ x y z ) α (\hat{Y}_{xyz})^{\alpha} (Y^xyz)α 的作用:
限制 easy example 导致的梯度更新被易区分的点所主导的问题
当 Y x y z = 1 Y_{xyz}=1 Yxyz=1 的时候, 假如 Y ^ x y z \hat{Y}_{xyz} Y^xyz 接近1的话,说明这个是一个比较容易检测出来的点,那么 ( 1 − Y ^ x y z ) α (1-\hat{Y}_{xyz})^{\alpha} (1−Y^xyz)α 就相应比较低了。
当 Y x y z = 1 Y_{xyz}=1 Yxyz=1 的时候,而 Y ^ x y z \hat{Y}_{xyz} Y^xyz 接近0的时候,说明这个中心点还没有学习到,所以要加大其训练的比重,因此 ( 1 − Y ^ x y z ) α (1-\hat{Y}_{xyz})^{\alpha} (1−Y^xyz)α 就会很大, α \alpha α是超参数,这里取2。
当 Y x y z = 0 Y_{xyz}=0 Yxyz=0 的时候,预测的 Y ^ x y z \hat{Y}_{xyz} Y^xyz 理论上也要接近于0,但如果其预测的值 Y ^ x y z \hat{Y}_{xyz} Y^xyz 接近于1的话, ( Y ^ x y z ) α (\hat{Y}_{xyz})^{\alpha} (Y^xyz)α 的值就会比较大,加大损失,即增加这个未被正确预测的样本的损失。
( 1 − Y x y z ) β (1-Y_{xyz})^{\beta} (1−Yxyz)β 的作用:
为了弥补输出步长所造成的离散化损失,我们对每个中心点都额外的预测了 local offset O ^ ∈ R W R × H R × 2 \hat{O}\in R^{\frac{W}{R}\times\frac{H}{R}\times 2} O^∈RRW×RH×2。
所有的类别都共享相同的预测 offset,该offset是用L1 loss训练的:
仅仅在关键点位置 p ˇ \check{p} pˇ 上实行有监督行为,其他位置被忽略。
令 ( x 1 ( k ) , y 1 ( k ) , x 2 ( k ) , y 2 ( k ) ) (x_1^{(k)},y_1^{(k)},x_2^{(k)},y_2^{(k)}) (x1(k),y1(k),x2(k),y2(k)) 表示类别为 c k c_k ck个的第 k k k 个目标的b-box,其中心点在 p k = ( x 1 ( k ) + x 2 ( k ) 2 , y 1 ( k ) + y 2 ( k ) 2 ) p_k=(\frac{x_1^{(k)}+x_2^{(k)}}{2},\frac{y_1^{(k)}+y_2^{(k)}}{2}) pk=(2x1(k)+x2(k),2y1(k)+y2(k))。
使用关键点估计 Y ^ \hat{Y} Y^ 来预测所有中心点,另外,对每个目标 k k k 都回归其目标大小 s k = ( x 2 ( k ) − x 1 ( k ) , y 2 ( k ) − y 1 ( k ) ) s_k=(x_2^{(k)}-x_1^{(k)}, y_2^{(k)}-y_1^{(k)}) sk=(x2(k)−x1(k),y2(k)−y1(k))。
为了限制计算量,对所有目标类别都使用单个尺度的预测 S ^ ∈ R W R × H R × 2 \hat{S}\in R^{\frac{W}{R}\times\frac{H}{R}\times 2} S^∈RRW×RH×2。
在中心点上使用和(2)相同的 L1 loss 来优化目标的尺寸:
没有对尺度进行规范化,且直接使用原始的像素坐标,直接使用常量 λ s i z e \lambda_{size} λsize 来平衡 loss,所以,最终的整体 loss 如下:
设定:
推理阶段,首先抽取每个类别热力图的峰值,检测所有值大于或等于其相邻8个邻域的响应,保留前100个峰值。
令 P ^ c \hat{P}_c P^c 表示类别 c c c 中,检测到的 n n n 个中心点 P ^ = ( x ^ i , y ^ i ) i = 1 n \hat{P}={(\hat{x}_i, \hat{y}_i)}_{i=1}^n P^=(x^i,y^i)i=1n 。
每个关键点是由整数坐标 ( x i , y i ) (x_i,y_i) (xi,yi) 给出的,将关键点值 Y ^ x i y i c \hat{Y}_{x_iy_ic} Y^xiyic 作为检测置信度的衡量,并且在位置上产生一个b-box:
其中:
优点:
设计模型的结构比较简单,不仅对于two-stage,对于one-stage的目标检测算法来说该网络的模型设计也是优雅简单的。
该模型的思想不仅可以用于目标检测,还可以用于3D检测和人体姿态识别,虽然论文中没有是深入探讨这个,但是可以说明这个网络的设计还是很好的,我们可以借助这个框架去做一些其他的任务。
虽然目前尚未尝试轻量级的模型,但是可以猜到这个模型对于嵌入式端这种算力比较小的平台还是很有优势的。
不足:
在实际训练中,如果在图像中,同一个类别中的某些物体的GT中心点,在下采样时会挤到一块,也就是两个物体在GT中的中心点重叠了,CenterNet对于这种情况也是无能为力的,也就是将这两个物体的当成一个物体来训练(因为只有一个中心点)。同理,在预测过程中,如果两个同类的物体在下采样后的中心点也重叠了,那么CenterNet也是只能检测出一个中心点,不过CenterNet对于这种情况的处理要比faster-rcnn强一些的,具体指标可以查看论文相关部分。
有一个需要注意的点,CenterNet在训练过程中,如果同一个类的不同物体的高斯分布点互相有重叠,那么则在重叠的范围内选取较大的高斯点。