Cornernet Detecting objects as paired keypoints
ECCV2018的论文
提出了CornerNet,这是一种新的目标检测方法,其中我们使用单个卷积神经网络将目标边界框检测为一对关键点,即左上角和右下角。通过将目标检测为成对的关键点,我们消除了设计先前单级检测器中常用的一组锚盒的需要。除了我们的新公式,我们引入了corner pooling,一种新型的池化层,帮助网络更好地定位角。实验表明,CornerNet在MS COCO上实现了42.1%的AP,优于所有现有的单阶段检测器。
基于卷积神经网络(ConvNets)[20,36,15]的目标检测器已经在各种具有挑战性的基准测试[24,8,9]上取得了最先进的结果。最先进方法的一个常见组件是anchor boxes[32,25],它是各种大小和纵横比的盒子,用作检测候选。anchor box广泛用于单级检测器[25,10,31,23],可获得与两级检测器[32,12,11,13]极具竞争力的结果,同时效率更高。单级检测器将锚定框密集地放置在图像上,并通过对锚定框进行评分并通过回归细化其坐标来生成最终的框预测。
但是anchor box的使用有两个缺点。首先,我们通常需要一组非常大的anchor box,例如在DSSD超过40k[10],在RetinaNet超过100k[23]。这是因为检测器被训练来分类每个anchor box是否与ground truth box充分重叠,并且需要大量anchor box来确保与大多数地面真实盒充分重叠。因此,只有极小一部分anchor box会与ground truth box重叠;这造成了正负anchor box之间的巨大不平衡,并减缓了训练[23]。
第二,anchor box的使用引入了许多超参数和设计选择。这些包括有多少个anchor box,什么尺寸,什么纵横比。这种选择在很大程度上是通过ad-hoc试探法做出的,当与多尺度体系结构结合时,单个网络会变得更加复杂。以多种分辨率进行单独预测,每个比例使用不同的特征和自己的锚定框集[25,10,23]。
在本文中,我们介绍了CornerNet,这是一种新的单阶段目标检测方法,它消除了anchor box。我们将一个目标检测为一对关键点——边界框的左上角和右下角。我们使用单个卷积网络来预测相同目标类别的所有实例的左上角的热图、所有右下角的热图以及每个检测到的角的嵌入向量。嵌入用于对属于同一目标的一对角进行分组——网络被训练来预测它们的相似嵌入。我们的方法大大简化了网络的输出,消除了设计anchor box的需要。我们的方法受到Newell等人提出的联想嵌入方法的启发。[27],他们在多人人体姿态估计的背景下检测和分组关键点。图1示出了我们的方法的整体流水线。
图1。我们将一个目标检测为一对分组在一起的边界框角。卷积网络输出所有左上角的热图、所有右下角的热图以及每个检测到的角的嵌入向量。该网络被训练以预测属于同一目标的角点的相似嵌入。
什么是热力图heatmap?
可以参考以下大佬的理解:
HeatMap的理解与生成
卷积网络回归目标中心的热图(heatmap),训练过程是怎样的?
为什么要选择热图而不是坐标回归,
参考这位大佬的说法:
2D多人姿态估计指南(1):热图回归与坐标回归流程指南
CornerNet的另一个新颖组件是corner pooling,这是一种新型的池化层,有助于卷积网络更好地定位bounding boxes的角。边界框的一个角通常在目标之外——考虑圆的情况以及图2中的例子。在这种情况下,不能基于局部证据来定位角。相反,为了确定在一个像素位置是否有一个左上角,我们需要水平地向右看目标的最上面的边界,垂直地向底部看最左边的边界。这激发了我们的corner pooling层:它接受两个特征图;在每个像素位置,它最大限度地汇集第一个特征图右侧的所有特征向量,最大限度地汇集第二个特征图正下方的所有特征向量,然后将两个汇集的结果相加。图3中示出了一个示例。
图二。通常没有局部证据来确定边界框角的位置。我们通过提出一种新型的池化层来解决这个问题。
图3。Corner pooling:对于每个通道,我们从两个方向(红线)取最大值(红点),每个方向来自一个单独的特征图,然后将两个最大值相加(蓝点)。
我们假设了两个原因,为什么检测角会比边界框中心或建议区域更好。首先,框的中心可能更难定位,因为它依赖于目标的所有4个边,而定位角依赖于2个边,因此更容易,对于corner pooling来说更是如此,corner pooling编码了关于角的定义的一些显式先验知识。第二,角提供了一种更有效的密集离散化盒子空间的方法:我们只需要 O ( w h ) O(wh) O(wh)个角来表示 O ( w 2 h 2 ) O(w^2h^2) O(w2h2)个可能的anchor box。我们在MS COCO上证明了CornerNet的有效性[24]。CornerNet实现了42.1%的AP,优于所有现有的单级检测器。此外,通过消融研究,我们表明,corner pooling是关键的优越性能的角网。
两阶段方法是由R-CNN[12]首次引入并推广的。两级检测器生成一组稀疏的感兴趣区域(ROI),并通过网络对每个ROI进行分类。R-CNN使用低级视觉算法生成ROI[41,47]。然后从图像中提取每个区域,并由ConvNet独立处理,这产生了大量冗余计算。后来,SPP[14]和Fast-RCNN[11]通过设计一个特殊的池化层来改进R-CNN,该池化层将特征图中的每个区域池化。然而,两者仍然依赖于单独的提议算法,并且不能进行端到端的训练。Faster-RCNN[32]通过引入区域提议网络(RPN)来消除低级提议算法,该网络从一组预定的候选框(通常称为anchor box)中生成提议。这不仅使检测器更有效,而且允许检测器被端到端地训练。R-FCN[6]通过用全卷积子检测网络取代全连接子检测网络,进一步提高了更快RCNN的效率。其他工作集中在合并子类别信息[42],用更多的上下文信息生成多尺度的目标建议[1,3,35,22],选择更好的特征[44],提高速度[21],级联过程[4]和更好的训练过程[37]。
另一方面,YOLO[30]和SSD[25]推广了单阶段方法,该方法消除了RoI池化步骤,并检测单个网络中的目标。单级检测器通常比两级检测器计算效率更高,同时在不同的挑战性基准测试中保持有竞争力的性能。
SSD将anchor box密集地放置在多个比例的特征图上,直接对每个anchor box进行分类和细化。YOLO直接从图像预测边界框坐标,后来在YOLO9000[31]中通过切换到anchor box进行了改进。DSSD[10]和RON[19]采用了类似于沙漏网络[28]的网络,使他们能够通过跳过连接结合低级和高级特征,以更准确地预测边界框。然而,在引入RetinaNet[23]之前,这些一级检测器仍然优于两级检测器。在[23]中,作者认为密集的anchor box在训练过程中造成了正负anchor box之间的巨大不平衡。这种不平衡导致训练效率低下,因此表现不佳。他们提出了一种新的损失,焦点损失,以动态调整每个anchor box的权重,并表明他们的一级探测器可以优于两级探测器。RefineDet[45]建议过滤anchor box以减少负样本的数量,并粗略调整anchor box。
DeNet[39]是一种两阶段检测器,无需使用anchor box即可生成ROI。它首先确定每个位置属于边界框的左上角、右上角、左下角或右下角的可能性。它通过枚举所有可能的角组合来生成RoI,并遵循标准的两阶段方法来对每个RoI进行分类。我们的方法与DeNet非常不同。首先,DeNet不识别两个角是否来自相同的目标,而是依靠子检测网络来拒绝差的ROI。相比之下,我们的方法是一个阶段的方法,使用单个ConvNet检测和分组角点。第二,DeNet在相对于区域的手动确定的位置选择特征进行分类,而我们的方法不需要任何特征选择步骤。第三,我们引入了corner pooling,一种新型的层来增强角点检测。
我们的方法受到Newell等人的启发。关于多人姿态估计环境中的关联嵌入的工作[27]。纽维尔等人。提出一种在单个网络中检测和分组人类关节的方法。在他们的方法中,每个检测到的人类关节都有一个嵌入向量。关节根据其嵌入之间的距离进行分组。据我们所知,我们首先将目标检测任务表述为同时检测和分组角点的任务。我们的另一个新颖之处是corner pooling层,有助于更好地定位角。我们还显著修改了沙漏架构,并添加了我们新的焦点损失变体[23],以帮助更好地训练网络。
在CornerNet中,我们将一个目标检测为一对关键点——边界框的左上角和右下角。卷积网络预测两组热图来表示不同目标类别的角的位置,一组用于左上角,另一组用于右下角。该网络还预测每个检测到的角点的嵌入向量[27],使得来自同一目标的两个角点的嵌入之间的距离很小。为了产生更紧密的边界框,网络还预测偏移,以稍微调整角的位置。利用预测的热图、嵌入和偏移,我们应用简单的后处理算法来获得最终的边界框。
图4提供了CornerNet的概览。我们使用沙漏网络[28]作为CornerNet的主干网络。沙漏网络之后是两个预测模块。一个模块用于左上角,另一个用于右下角。每个模块都有自己的角池化模块,在预测热图、嵌入和偏移之前,汇集沙漏网络中的特征。与许多其他目标检测器不同,我们不使用不同尺度的特征来检测不同大小的目标。我们只将这两个模块应用于沙漏网络的输出
图4。CornerNet概述。主干网络后面是两个预测模块,一个用于左上角,另一个用于右下角。使用来自两个模块的预测,我们定位和分组角。
我们预测了两组热图,一组用于左上角,一组用于右下角。每组热图都有 C C C通道,其中 C C C是类别,尺寸为高×宽。没有后台通道。每个通道都是一个二进制掩码,指示一个类的角的位置。
对于每个角,有一个地面真实正位置,所有其他位置都是负位置。在训练过程中,我们不是平等地惩罚负位置,而是减少对正位置半径内负位置的惩罚。这是因为一对假角点检测,如果它们接近它们各自的地面真实位置,仍然可以产生与地面真实盒充分重叠的盒(图5)。我们通过目标的大小来确定半径,方法是确保半径内的一对点将生成一个具有至少 t t t IoU的边界框,并带有地面真实标注(我们在所有实验中将 t t t设置为0.7)。给定半径,惩罚量由非归一化2D高斯函数 e ? x 2 + y 2 2 σ 2 e^{\frac{?x2+y2}{2σ^2}} e2σ2?x2+y2?给出,其中心位于正位置, σ σ σ为半径 r r r的1/3。
图5。用于训练的“Ground-truth”热图。角在正位置(橙色圆圈)半径内的框(绿色虚线矩形)仍然与地面真实注释(红色实心矩形)有很大的重叠。
关于对正样本半径内负样本的惩罚的理解,强烈推荐大家看这位大佬的文章
HeatMap的理解与生成
设 p c i j p_{cij} pcij?是预测热图中c类在位置 ( i , j ) (i, j) (i,j)的分数,设 y c i j y_{cij} ycij?是用非标准化高斯函数增强的“地面真实”热图。我们设计了一种焦点损失的变体[23]:
其中
N
N
N是图像中目标的数量,
α
α
α和
β
β
β是控制每个点贡献的超参数(在所有实验中,我们将
α
α
α设置为2,将
β
β
β设置为4)。利用
y
c
i
j
y_{cij}
ycij?编码的高斯凸点,
(
1
?
y
c
i
j
)
(1-y_{cij})
(1?ycij?)项减少了地面真实位置周围的惩罚。
许多网络[15,28]涉及下采样层,以收集全局信息并减少内存使用。当它们完全卷积地应用于图像时,输出的大小通常小于图像。因此,图像中的位置 ( x , y ) (x, y) (x,y)被映射到热图中的位置 ( ? x n ? , ? y n ? ) (? \frac{x}{n} ?, ?\frac{y}{n} ?) (?nx??,?ny??),其中n是下采样因子。当我们将位置从热图重新映射到输入图像时,可能会损失一些精度,这会极大地影响小边界框及其基本事实的IoU。为了解决这个问题,我们预测位置偏移,以便在将corner位置重新映射到输入分辨率之前稍微调整它们。
其中 o k \mathcal{o}_k ok?是偏移量, x k x_k xk?和 y k y_k yk?是角k的x和y坐标。特别是,我们预测所有类别的左上角共享一组偏移量,右下角共享另一组偏移量。对于训练,我们在地面真实角位置应用平滑L1损失[11]:
多个目标可以出现在图像中,因此可以检测到多个左上角和右下角。我们需要确定左上角和右下角的一对是否来自同一个边界框。我们的方法受到Newell等人提出的联想嵌入方法的启发。Newell等[27]用于多人姿态估计任务。检测所有人体关节,并为每个检测到的关节生成嵌入。他们根据嵌入之间的距离对关节进行分组。
关联嵌入的思想也适用于我们的任务。该网络为每个检测到的角预测嵌入向量,使得如果左上角和右下角属于同一边界框,则它们的嵌入之间的距离应该很小。然后,我们可以根据左上角和右下角的嵌入之间的距离对基于角进行分组。嵌入的实际值并不重要。只有嵌入之间的距离用于对角进行分组。
我们参考Newell等[27]并使用1维嵌入。设 e t k e_{t_k} etk??是目标k左上角的嵌入, e b k e_{b_k} ebk??是右下角的嵌入。与[26]中一样,我们使用“pull”损失来训练网络以分组角点,使用“push”损失来分离角点:
其中
e
k
e_k
ek?是
e
t
k
e_{t_k}
etk??和
e
b
k
e_{b_k}
ebk??的平均值,我们在所有实验中将
?
?
?设置为1。与偏移损耗类似,我们仅在地面真实角位置应用损耗。
如图2所示,通常没有角的存在的局部视觉证据。为了确定一个像素是否是左上角,我们需要水平地向右看目标的最上面的边界,垂直地向底部看最左边的边界。因此,我们提出角池化,通过编码显式先验知识来更好地定位角。
假设我们想要确定位置 ( i , j ) (i, j) (i,j)处的像素是否是左上角。设 f t f_t ft?和 f l f_l fl?是作为左上角池图层输入的特征图,设 f t i j f_{t_{ij}} ftij??和 f l i j f_{l_{ij}} flij??分别是 f t f_t ft?和 f l f_l fl?中位置 ( i , j ) (i, j) (i,j)处的向量。对于H × W特征映射,角池化层首先将 f t f_t ft?中 ( i , j ) (i, j) (i,j)和 ( i , H ) (i, H) (i,H)之间的所有特征向量最大池化得到特征向量 t i j t_{ij} tij?,
同时,最大池化将 f l f_l fl?中 ( i , j ) (i, j) (i,j)和 ( W , j ) (W, j) (W,j)之间的所有特征向量汇集到特征向量 l i j l_{ij} lij?。最后,它将 t i j t_{ij} tij?和 l i j l_{ij} lij?加在一起。这种计算可以用以下公式表示:
我们应用元素最大运算。
t
i
j
t_{ij}
tij?和
l
i
j
l_{ij}
lij?两者都可以通过如图6所示的动态规划有效地计算。
图6。左上角的池化层可以非常有效地实现。我们从左到右扫描水平最大池化,从下到上扫描垂直最大池化。然后,我们添加两个最大池特征映射。
我们以类似的方式定义右下角池化层。在添加汇集的结果之前,它最大限度地汇集 ( 0 , j ) (0, j) (0,j)和 ( i , j ) (i, j) (i,j)之间的所有特征向量,以及 ( i , 0 ) (i, 0) (i,0)和 ( i , j ) (i, j) (i,j)之间的所有特征向量。在预测模块中使用角池化层来预测热图、嵌入和偏移。
预测模块的结构如图7所示。模块的第一部分是残差块[15]的修改版本。在这个修改的残差块中,我们用角池化模块替换第一个3 × 3卷积模块,该角池化模块首先通过两个具有128个通道的3 × 3卷积模块1处理来自主干网络的特征,然后应用角池化层。在残差块的设计之后,我们将汇集的特征输入到具有256个通道的3 × 3 Conv-BN层中,并添加回投影快捷方式。修改后的残差块之后是具有256个通道的3 × 3卷积模块和3个Conv-ReLU-Conv层,以产生热图、嵌入和偏移。
图7。预测模块从修改后的残差块开始,其中我们用角池模块替换第一个卷积模块。修改后的残差块之后是卷积模块。我们有多个分支用于预测热图、嵌入和偏移。
CornerNet使用沙漏网络[28]作为其主干网络。沙漏网络首先被引入用于人体姿态估计任务。它是一个完全卷积的神经网络,由一个或多个沙漏模块组成。沙漏模块首先通过一系列卷积和最大池化层对输入特征进行下采样。然后,它通过一系列上采样和卷积层将特征上采样回原始分辨率。由于细节在最大池化层中丢失,因此添加了跳过层以将细节带回上采样要素。沙漏模块在一个统一的结构中捕获全局和局部特征。当多个沙漏模块堆叠在网络中时,沙漏模块可以重新处理特征以捕获更高层次的信息。这些特性也使得沙漏网络成为目标检测的理想选择。事实上,许多当前的探测器[35,10,22,19]已经采用了类似于沙漏网络的网络。
我们的沙漏网络由两个沙漏组成,我们对沙漏模块的架构做了一些修改。我们没有使用最大池化,而是简单地使用stride 2来降低特征分辨率。我们将特征分辨率降低了5倍,并增加了特征通道的数量(256,384,384,384,512)。当我们对特征进行上采样时,我们应用2个残差模块,然后进行最近邻上采样。每个跳过连接还包括2个残差模块。在沙漏模块的中间有4个具有512个通道的残差模块。在沙漏模块之前,我们使用具有步幅2和128通道的7 × 7卷积模块,然后使用具有步长2和256通道的残差块[15],将图像分辨率降低4倍。
继[28]之后,我们还在培训中增加了中级监督。然而,我们没有将中间预测添加回网络,因为我们发现这会损害网络的性能。我们将3 × 3 Conv-BN模块应用于第一个沙漏模块的输入和输出。然后,我们通过元素相加来合并它们,随后是一个ReLU和一个具有256个通道的残差块,然后将其用作第二个沙漏模块的输入。沙漏网络的深度是104。与许多其他最先进的检测器不同,我们只使用整个网络最后一层的特征来进行预测。
我们在极具挑战性的MS COCO数据集上评估CornerNet[24]。MS COCO包含80k图像用于训练,40k用于验证,20k用于测试。训练集中的所有图像和验证集中的35k图像用于训练。验证集中残差的5k图像用于超参数搜索和消融研究。测试集上的所有结果都提交给外部服务器进行评估。为了提供与其他检测器的公平比较,我们在测试开发集上报告了我们的主要结果。MS COCO使用不同IOU的平均精度(AP)和不同目标大小的AP作为主要评估指标。
们在PyTorch[29]中实现了CornerNet。网络在PyTorch的默认设置下随机初始化,没有对任何外部数据集进行预训练。当我们应用焦点损失时,我们遵循[23]来设置预测角落热图的卷积层中的偏差。在训练过程中,我们将网络的输入分辨率设置为511 × 511,这导致输出分辨率为128 × 128。为了减少过度拟合,我们采用了标准的数据扩充技术,包括随机水平翻转、随机缩放、随机裁剪和随机颜色抖动
它包括调整图像的亮度、饱和度和对比度。最后,我们将PCA[20]应用于输入图像。
我们使用Adam[18]来优化完全训练损失:
其中 α α α、 β β β和 γ γ γ分别是pull、push和偏移损失的权重。我们把 α α α和 β β β都设为0.1,把 γ γ γ设为1。我们发现α和β的1或更大的值会导致较差的性能。我们使用49个批处理大小,并在10个Titan X(PASCAL)GPU上训练网络(主GPU上有4个图像,其余GPU上每个GPU有5个图像)。为了节省GPU资源,在我们的消融实验中,我们以2.5 × 104的学习速率训练网络25万次迭代。当我们将我们的结果与其他检测器进行比较时,我们训练网络进行额外的250k次迭代,并将最后50k次迭代的学习率降低到 2.5 × 1 0 ? 5 2.5 × 10^{?5} 2.5×10?5。
在测试过程中,我们使用简单的后处理算法从热图、嵌入和偏移中生成边界框。我们首先通过在角热图上使用3 × 3最大池化层来应用非最大抑制(NMS)。然后,我们从热图中选择左上角的前100个和右下角的前100个。角位置通过相应的偏移进行调整。我们计算左上角和右下角嵌入之间的L1距离。距离大于0.5或包含来自不同类别的角的对被拒绝。左上角和右下角的平均分数用作检测分数。
我们不是将图像调整到固定的大小,而是保持图像的原始分辨率,并在将图像输入CornerNet之前用零填充图像。原始图像和翻转图像都用于测试。我们结合原始图像和翻转图像的检测,并应用软nms[2]来抑制冗余检测。仅报告前100个检测。在Titan X(PASCAL)GPU上,平均推理时间为每张图像244毫秒。
Corner pooling是CornerNet的一个关键组成部分。为了了解它对性能的贡献,我们训练了另一个没有Corner pooling但具有相同数量参数的网络。
表1表明,增加corner pooling会带来显著的改善:AP为2.0%,AP50为2.1%,AP75为2.2%。我们还看到corner pooling对中型和大型目标特别有帮助,分别提高了2.4%和3.7%的AP。这是意料之中的,因为中型和大型物体的最顶端、最底部、最左边、最右边的边界可能离角落位置更远。
我们减少了对正位置周围负位置的惩罚,在由物体大小决定的半径内(Sec. 3.2)。为了理解这如何帮助训练CornerNet,我们训练一个没有惩罚减少的网络和另一个固定半径为2.5的网络。我们将它们与验证集上的CornerNet进行比较。
表2表明,固定半径使AP比基线提高2.7%,APm提高1.5%,APl提高5.3%。依赖于目标的半径进一步将AP提高了2.9%,APm提高了2.6%,APl提高了6.5%。此外,我们看到惩罚的减少尤其有利于中型和大型目标。
CornerNet同时输出热图、偏移和嵌入,所有这些都会影响检测性能。一个目标将被遗漏如果任何一个角被遗漏;需要精确的偏移来生成紧密的边界框;不正确的嵌入将导致许多错误的边界框。为了了解每个部分如何导致最终误差,我们通过用地面真实值替换预测的热图和偏移量来执行误差分析,并评估验证集的性能
误差分析。我们用地面真实值替换预测的热图和偏移。单独使用地面真实热图将AP从38.5%提高到74.0%,表明CornerNet的主要瓶颈是检测角。
表3表明,单独使用地面真实角热图将AP从38.5%提高到74.0%。APs、APm和APl也分别增长了43.1%、40.9%和30.1%。如果我们用地面实况偏移替换预测偏移,AP进一步增加13.1%到87.1%。这表明,尽管在角点检测和分组方面仍有很大的改进空间,但主要的瓶颈是角点检测。图8示出了预测角的两个定性示例。
图8。覆盖在预测的角热图上的边界框预测示例。
我们在MS COCO testdev上将CornerNet与其他最先进的检测器进行了比较(表4)。通过多尺度评估,CornerNet实现了42.1%的AP,是现有一阶段方法中最先进的,与两阶段方法具有竞争力。
表4。CornerNet与其他MS COCO测试开发。CornerNet的性能优于所有单级检测器,其结果可与两级检测器相媲美
我们提出了CornerNet,这是一种新的目标检测方法,它将边界框检测为成对的角。我们在MS COCO上评估了CornerNet,并展示了竞争结果。
另外强烈推荐大家看这两篇分析文章帮助理解