论文阅读笔记4:CornerNet:Detecting Objects as Paired Keypoints
论文链接:https://arxiv.org/abs/1808.01244
代码链接:https://github.com/umich-vl/CornerNet
Abstract
我们提出了一种新的目标检测方法,使用单个卷积神经网络将目标边界框检测为一对关键点(即边界框的左上角和右下角)。通过将目标检测为成对关键点,我们消除了现有的one stage检测器设计中对一组anchors的需要。除了上述新颖的构想,文章还引入了corner pooling,这是一种新型的池化层,可以帮助网络更好地定位边界框的角点。CornerNet在MS COCO上实现了42.1%的AP,优于所有现有的one stage检测器。
Introduction
基于卷积神经网络的对象检测器(ConvNets)已经在各种具有挑战性的基准测试中取得了最新成果。现有技术方法的一个共同组成部分是anchor boxes,它们是包含各种尺寸和宽高比的矩形框,是用作检测的候选框。anchor boxes广泛用于one stage检测器,它可以获得与two stage检测器高度相当的结果,同时效率更高。 one stage检测器将anchor boxes密集地分布在图像上,通过对anchor boxes进行评分,并通过回归来改进其坐标来生成最终的边界框预测。
但anchor boxes的使用有两个缺点。 首先,我们通常需要一组非常大的anchor boxes,例如: 在DSSD中超过4万,在RetinaNet中超过10万, 这是因为训练器被训练以分类每个anchor boxes是否与ground truth充分重叠,并且需要大量anchor boxes以确保与大多数ground truth充分重叠。 结果,只有一小部分anchor boxes与ground truth重叠; 这在正负样本之间造成了巨大的不平衡,减慢了训练速度。
其次,anchor boxes的使用引入了许多超参数和设计选择。 这些包括多少个box,大小和宽高比。 这些选择主要是通过ad-hoc启发式方法进行的,并且当与多尺度架构相结合时可能会变得更加复杂,其中单个网络在多个分辨率下进行单独预测,每个尺度使用不同的特征和它自己的一组anchor boxes。
在本文中,我们介绍了CornerNet,这是一种新的one stage目标检测方法,可以消除anchor boxes。 我们将一个目标物体检测为一对关键点——边界框的左上角和右下角。 我们使用单个卷积网络来预测同一物体类别的所有实例的左上角的热图,所有右下角的热图,以及每个检测到的角点的嵌入向量。 嵌入用于对属于同一目标的一对角点进行分组——训练网络以预测它们的类似嵌入。 我们的方法极大地简化了网络的输出,并且无需设计anchor boxes。我们的方法受到Newell等人在多人姿态估计上下文中关联嵌入的启发。
CornerNet的另一个新颖组件是corner pooling,这是一种新型的池化层,可帮助卷积网络更好地定位边界框的角点。 边界框的一角通常在目标之外,参考圆形的情况以及图2中的例子。在这种情况下,角点不能根据当前的信息进行定位。相反,为了确定像素位置是否有左上角,我们需要水平地向右看目标的最上面边界,垂直地向底部看物体的最左边边界。 这激发了我们的corner pooling layer:它包含两个特征图; 在每个像素位置,它最大池化从第一个特征映射到右侧的所有特征向量,最大池化从第二个特征映射下面的所有特征向量,然后将两个池化结果一起添加
我们假设了两个原因,为什么检测角点会比检测边界框中心或proposals更好。首先,盒子的中心可能更难以定位,因为它取决于目标的所有4个边,而定位角取决于2边,因此更容易,甚至更多的corner pooling,它编码一些明确的关于角点定义的先验信息。 其次,角点提供了一种更有效的方式来密集地离散边界框的空间:我们只需要用$O(wh)$角点来表示$O(w^2h^2)$可能的anchor boxes。
Related Works
Two-stage object detectors
Two-stage目标检测由R-CNN首次引入并推广。Two-stage检测器生成一组稀疏的感兴趣区域(RoIs),并通过网络对每个区域进行分类。R-CNN使用低层次视觉算法生成(RoIs)。然后从图像中提取每个区域,由ConvNet独立处理,这将导致大量计算冗余。后来,SPP-Net和Fast R-CNN改进了R-CNN,设计了一个特殊的池化层(金字塔池化),将每个区域从feature map中池化。然而,两者仍然依赖于单独的proposals算法,不能进行端到端训练。Faster-RCNN通过引入区域生成网络(RPN)来去除低层次的proposals算法,RPN从一组预先确定的候选框(通常称为anchor boxes)中生成proposals。这不仅使检测器更加高效,通过RPN与检测网络的联合训练,可实现端到端训练。R-FCN将全连接子检测网络替换为完全卷积子检测网络,进一步提高了Faster R-CNN的检测效率。其他的工作主要集中在结合子类别信息,用更多的上下文信息在多个尺度上生成目标的proposals,选择更好的特征,提高速度,并行处理和更好的训练过程。
One-stage object detectors
另一方面,YOLO和SSD推广了one-stage方法,该方法消除了RoI池化步骤,并在单个网络中检测目标。One-stage检测器通常比two-stage检测器计算效率更高,同时在不同的具有挑战性的基准上保持着具有竞争性的性能。
SSD算法将anchor boxes密集地放置在多个尺度的feature maps之上,直接对每个anchor boxes进行分类和细化。YOLO直接从图像中预测边界框坐标,后来在YOLO9000中,通过使用anchor boxes进行了改进。DSSD和RON采用了类似沙漏的网络,使它们能够通过跳跃连接将低级和高级特性结合起来,从而更准确地预测边界框。然而,在RetinaNet出现之前,这些one-stage检测器的检测精度仍然落后于two-stage检测器。在RetinaNet中,作者认为密集的anchor boxes在训练中造成了正样本和负样本之间的巨大不平衡。这种不平衡导致训练效率低下,从而导致结果不佳。他们提出了一种新的loss,Focal Loss,来动态调整每个anchor boxes的权重,并说明了他们的one-stage检测器检测性能优于two-stage检测器。RefineDet建议对anchor boxes进行过滤,以减少负样本的数量,并对anchor boxes进行粗略的调整。
我们的方法受到Newell等人在多人姿态估计上下文中关联嵌入的启发。Newell等人提出了一种在单个网络中检测和分组人类关节的方法。在他们的方法中,每个检测到的人类关节都有一个嵌入向量。这些关节是根据它们嵌入的距离来分组的。本文是第一个将目标检测任务定义为同时检测和分组角点的任务。我们的另一个新颖之处在于corner pooling layer,它有助于更好定位角点。我们还对沙漏结构进行了显著地修改,并添加了新的focal loss的变体,以帮助更好地训练网络。
CornerNet
Overview
在CornerNet中,我们将物体边界框检测为一对关键点(即边界框的左上角和右下角)。卷积网络通过预测两组热图来表示不同物体类别的角的位置,一组用于左上角,另一组用于右下角。 网络还预测每个检测到的角的嵌入向量,使得来自同一目标的两个角的嵌入之间的距离很小。 为了产生更紧密的边界框,网络还预测偏移以稍微调整角的位置。 通过预测的热图,嵌入和偏移,我们应用一个简单的后处理算法来获得最终的边界框。
我们使用沙漏网络作为CornerNet的骨干网络。 沙漏网络之后是两个预测模块。 一个模块用于左上角,而另一个模块用于右下角。 每个模块都有自己的corner pooling模块,在预测热图、嵌入和偏移之前,池化来自沙漏网络的特征。 与许多其他物体探测器不同,我们不使用不同尺度的特征来检测不同大小的物体。 我们只将两个模块应用于沙漏网络的输出。
Detecting Corners
我们预测两组热图,一组用于左上角,另一组用于右下角。 每组热图具有C个通道,其中C是分类的数量,并且大小为H×W。 没有背景通道。 每个通道都是一个二进制掩码,用于表示该类的角点位置。
对于每个角点,有一个ground-truth正位置,其他所有的位置都是负值。 在训练期间,我们没有同等地惩罚负位置,而是减少对正位置半径内的负位置给予的惩罚。 这是因为如果一对假角点检测器靠近它们各自的ground-truth位置,它仍然可以产生一个与ground-truth充分重叠的边界框(图5)。我们通过确保半径内的一对点生成的边界框与ground-truth的IoU ≥ t(我们在所有实验中将t设置为0.7)来确定物体的大小,从而确定半径。 给定半径,惩罚的减少量由非标准化的2D高斯$e^{-\frac{x^2+y^2}{2\sigma^{2}}}$给出,其中心位于正位置,其$\sigma$是半径的1/3。
$p_{cij}$为预测热图中$c$类位置$(i,j)$的得分,$y_{cij}$为用非标准化高斯增强的“ground-truth”热图。我们设计了一个局部损失(focal loss)的变体:
其中N是图像中目标的数量,$\alpha$和$\beta$是控制每个点的贡献的超参数(在所有实验中我们将$\alpha$设置为2, $\beta$设置为4)。利用$y_{cij}$中编码的高斯凸点,$(1-y_{cij})$项减少了ground-truth周围的惩罚。
许多网络涉及下采样层以收集全局信息和减少内存使用。当它们完全卷积应用于图像时,输出的尺寸通常小于图像。因此,图像中的位置$(x,y)$被映射到热图中的位置$(\lfloor\frac{x}{n}\rfloor,[\lfloor\frac{y}{n}\rfloor)$,其中n是下采样因子。当我们将热图中的位置重新映射到输入图像时,可能会丢失一些精度,这会极大地影响小边界框与ground-truth之间的IoU。 为了解决这个问题,我们预测位置偏移,以稍微调整角位置,然后再将它们重新映射到输入分辨率。
其中$o_{k}$是偏移量,$x_{k}$和$y_{k}$是角点$k$的x和y坐标。特别是,我们预测所有类别的左上角共享一组偏移,另一组由右下角共享。对于训练,我们在ground-truth角点位置应用平滑的L1损失:
Grouping Corners
图像中可能出现多个目标,因此可能检测到多个左上角和右下角。我们需要确定左上角和右下角的一对角点是否来自同一个目标边界框。我们的方法受到Newell等人提出的用于多人姿态估计任务的关联嵌入方法的启发。Newell等人检测所有人类关节,并为每个检测到的关节生成嵌入。他们根据嵌入之间的距离将节点进行分组。
关联嵌入的思想也适用于我们的任务。 网络预测每个检测到的角点的嵌入向量,使得如果左上角和右下角属于同一个边界框,则它们的嵌入之间的距离应该小。 然后,我们可以根据左上角和右下角嵌入之间的距离对角点进行分组。 嵌入的实际值并不重要。 仅使用嵌入之间的距离来对角点进行分组。
我们关注Newell等人并使用1维嵌入。$e_{tk}$成为对象k的左上的嵌入,$e_{bk}$为右下角的的嵌入。如中所述,我们使用“pull”损失来训练网络对角点进行分组,并且用“push”损失来分离角点:
其中$e_{k}$是$e_{tk}$和$e_{bk}$的平均值,我们在所有实验中将$\Delta$设为1。与偏移损失类似,我们仅在ground-truth角点位置应用损失。
Corner Pooling
如图2所示,通常没有局部视觉证据表明存在角点。要确定像素是否为左上角,我们需要水平地向右看目标的最上面边界,垂直地向底部看物体的最左边边界。因此,我们提出corner Pooling通过编码显式先验知识来更好地定位角点。
假设我们要确定$(i,j)$位置是左上角。设$f_t$和$f_l$为左上角池化层的输入特征映射,$f_{t_{ij}}$和$f_{l_{ij}}$分别为$(i,j)$位置中$f_t$和$f_lf$的向量$H×W$的特征映射,corner pooling层首先最大池化$f_t$中在$(i,j)$与$(i,H)$之间所有的特征向量,使之成为特征向量$t_{ij}$,还有,最大池化$f_l$中在$(i,j)$与$(W,j)$之间所有的特征向量,使之成为特征向量$l_{ij}$。最后,把$t_{ij}$和$l_{ij}$加在一起。这个计算可以用以下公式表示:
在这里,我们应用了一个elementwise最大化操作。动态规划可以有效地计算$t_{ij}$和$l_{ij}$。我们以类似的方式定义右下角池化层。最大池化$(0,j)$与$(i,j)$之间所有的特征向量、$(i,0)$与$(i,j)$之间所有的特征向量,然后将池化结果相加。Corner pooling层用于预测模块,用于预测热图、嵌入和偏移量。
预测模块的结构如图所示。模块的第一部分是残差模块的修改版本。在这个修改后的残差模块中,我们将第一个3×3的卷积模块替换为一个corner pooling模块。这个残差模块,首先通过具有128个通道的2个3×3卷积模块的主干网络处理特征,然后应用一个corner pooling层。残差模块之后,我们将池化特征输入具有256个通道的3×3的Conv-BN层,然后加上反向projection shortcut。修改后的残块,后跟一个具有256个通道的3×3的卷积模块,和256个通道的3个Conv-ReLU-Conv层来产生热图,嵌入和偏移量。
Hourglass Network
CornerNet使用沙漏网络作为其骨干网络。沙漏网络首次被提到是用于人体姿态估计任务。它是一个完全卷积神经网络,由一个或多个沙漏模块组成。沙漏模块首先通过一系列卷积层和最大池化层对输入特性进行下采样。然后通过一系列的上采样和卷积层将特征上采样回原来的分辨率。由于细节在最大池化层中丢失,因此添加了跳过层用来将细节带回到上采样的特征。沙漏模块在一个统一的结构中捕获全局和局部特征。当多个沙漏模块堆积在网络中时,沙漏模块可以重新处理特征以获取更高级别的信息。这些特性使沙漏网络成为目标检测的理想选择。事实上,许多现有的检测器已经采用了类似沙漏网络的网络。
我们的沙漏网络由两个沙漏组成,我们对沙漏模块的结构做了一些修改。我们不使用最大池,而是使用步长2来降低特征分辨率。我们减少了5倍的特征分辨率,并增加了特征通道的数量(256,384,384,384,512)。当我们对特征进行上采样时,我们应用了两个残差模块,然后是一个最近的相邻上采样。每个跳跃连接还包含两个残差模块。沙漏模块中间有4个512通道的残差模块。在沙漏模块之前,我们使用128个通道7×7的卷积模块,步长为2,4倍减少的图像分辨率,后跟一个256个通道,步长为2的残差块。
在基础上,我们还在训练时增加了中间监督。但是,我们没有向网络中添加反向中间预测,因为我们发现这会损害网络的性能。我们在第一个沙漏模块的输入和输出,应用了一个3×3的Conv-BN模块。然后,我们通过元素级的加法合并它们,后跟一个ReLU和一个具有256个通道的残差块,然后将其用作第二个沙漏模块的输入。沙漏网络的深度为104。与许多其他最先进的检测器不同,我们只使用整个网络最后一层的特征来进行预测。
Experiments
Training Details
我们在PyTorch中实现了CornerNet。网络是在默认的PyTorch设置下随机初始化的,没有在任何外部数据集上进行预训练。当我们应用focal loss时,我们遵循来设置卷积层中的偏差来预测角点热图。在训练期间,我们设置了网络的输入分辨率511×511,导致输出分辨率为128×128。为了减少过拟合,我们采用了标准的数据增强技术,包括随机水平翻转、随机缩放、随机裁剪和随机色彩抖动,其中包括调整图像的亮度,饱和度和对比度。 最后,我们将PCA应用于输入图像。
我们使用Adam来优化完整的训练损失:
其中$\alpha$,$\beta$和$\gamma$分别是pull,push和offset的权重。我们将$\alpha$和$\beta$都设置为0.1,将$\gamma$设置为1。我们发现,1和更大的$\alpha$和$\beta$值会导致性能不佳。我们使用49的batch size,并在10个Titan X(PASCAL)GPU上训练网络(主GPU 4个图像,其余GPU每个GPU 5个图像)。 为了节省GPU资源,在我们的 ablation experiments(即模型简化测试,去掉该结构的网络与加上该结构的网络所得到的结果进行对比)中,我们训练网络,进行250k次迭代,学习率为$2.5×10^{-4}$。当我们将我们的结果与其他检测器进行比较时,我们额外训练网络,进行250 k次迭代,并到最后50 k次迭代时,将学习速率降低到$2.5×10^{-5}$。
Testing Details
在测试期间,我们使用简单的后处理算法从热图,嵌入和偏移生成边界框。我们首先通过在角点热图上使用3×3最大池化层来应用非极大值抑制(NMS)。然后我们从热图中选择前100个左上角和前100个右下角。角点位置由相应的偏移调整。我们计算左上角和右下角嵌入之间的L1距离。距离大于0.5或包含不同类别的角点对将被剔除。左上角和右下角的平均得分用作检测分数。
我们不是将图像大小调整为固定大小,而是保持图像的原始分辨率,并在将其输入给CornerNet之前用0填充。原始图像和翻转图像都用于测试。我们将原始图像和翻转图像的检测结合起来,并应用soft-max来抑制冗余检测。仅记录前100个检测项。Titan X(PASCAL)GPU上的每个图像的平均检测时间为244ms。