计算机系统应用教程网站

网站首页 > 技术文章 正文

目标检测算法之CornerNet

btikc 2024-09-06 18:02:19 技术文章 10 ℃ 0 评论

前言

Anchor-Free 系列相比于 Anchor-Based 的发展是较慢的,在 2018-2019 年才开始火起来。今天为大家介绍一下 ECCV 2018 的 CornerNet,全称为:Detecting Objects as Paired Keypoints 。

  • 提出通过检测 bbox 的一对角点来检测出目标。
  • 提出 Corner Pooling,来更好的定位 bbox 的角点。

介绍

Anchor-Based 的目标检测算法相信看了公众号目标检测栏目的话已经了解了很多算法了,这些算法都是基于成千上万个 Anchor 框来进行预测,无论是 one-satge 还是 two-stage 的 Anchor-Based 目标检测算法,都取得了巨大的成功。但是 Anchor-Based 目标检测算法有两个缺点,其一是 Anchor boxes 的数量需要非常大,如在 DSSD 算法中超过了 40000,在 RetinaNet 中超过了 100000,当然最后只有一小部分 anchor boxes 会和 GT 框重合,这就带来了严重的正负样本不均衡问题,针对这一问题也有很多方法被提出如 OHEM,Focal Loss, GHM Loss 等等。而另外一个缺点是 Anchor-Based 的算法引入了很多超参数和设计选择,如 Anchor 的个数,宽高比,大小等等,当于多尺度结合的时候网络会变得更加复杂。

因此,针对以上缺点,这篇论文提出了 CornerNet,这是一种新的 one-stage 的 Anchor-Free 目标检测算法。论文将对一个目标的检测看成一对关键点(左上和右下)的检测。具体来说,论文使用单个卷积神经网络来预测同一物体类别的所有实例的左上角的热力图,所有右下角的热力图,以及每个检测到的角点的嵌入向量。嵌入向量用于对属于同一目标的一对角点进行分组,本方法极大的简化了网络的输出,并且不需要设计 Anchor boxes,下图展示了本方法的整体流程:

而 CornerNet 的另外一个创新点是 Corner Pooling,这是一种新型的池化层,可以帮助卷积神经网络更好的定位边界框的角点。如 Figure2 所示,目标边界框的一角通常是在目标之外。

因此,以 top-left 角点为例,对每个通道,分别提取特征图对应位置处水平和垂直方法的最大值,然后求和。如下图所示。

CornerNet

概述

下图展示了 CornerNet 网络的大致结构,论文使用 Hourglass(沙漏)网络作为 CornerNet 的 Backbone 网络。沙漏网络之后是两个预测模块,一个模块用于预测左上角,一个模块用于预测右下角。每个模块都有自己的 Corner Pooling 模块,在预测热力图、嵌入和偏移之前,池化来自沙漏网络的特征。和其它的目标检测器不同,论文不使用不同尺度的特征来检测不同大小的目标,只将两个模块用于沙漏网络的输出。

检测角点

我们预测两组热力图,一组用于左上角角点,一组用于右下角角点。每一组热力图有C个通道,其中C是类别数(不包括背景),并且大小为H×W。每个通道都是一个二进制掩码,用于表示该类的角点位置。对于每个角点,有一个 ground-truth 正位置,其他所有位置都是负位置。在训练期间,我们没有同等地惩罚负位置,而是减少对正位置半径内的负位置给予的惩罚。这是因为如果一对假角点检测器靠近它们各自的 ground-truth 位置,它仍然可以产生一个与 ground-truth 充分重叠的边界框,如下图所示。我们通过确保半径内的一堆点生成的边界框和 ground-truth 边界框的IOU>=t(在所有实验中把tt设置为0.7)来确定物体的大小,从而确定半径。给定半径,惩罚的减少量由非标准化的 2 维高斯分布给出,其中心位于正位置,σ 是半径的1/3。

pcij为预测图中cc类位置(i,j)的得分,ycij为用非标准化高斯分布增强的 ground-truth 热力图。论文设计了一个 Focal Loss 的变体损失:

其中N表示图像中目标的数量,α和β控制每个像素点贡献的超参数(在所有实验中将α设为 2,β设为 4)。利用ycij中编码的高斯凸点,(1?ycij)这一项减少了 ground-truth 像素点周围的惩罚权重。同时,图像中的位置(x,y)被映射到热力图中的位置为([xn],[yn]),其中n表示下采样因子。当我们将热力图中的位置重新映射回输入图像时,可能会存在像素偏移,这会极大影响小边界框和 ground-truth 之间的 IOU 值。为了解决这个问题,论文提出预测位置偏移,以稍微调整角点位置,然后再将它们映射回输入分辨率,如公式 (2) 所示:

其中ok表示偏移量,xk和yk是角点k的x和y坐标。特别地,我们预测所有类别的左上角共享一组偏移,另一组由右下角共享。对于训练,我们在 ground-truth 角点位置应用 Smooth L1 Loss:

分组角点

图像中可能出现多个目标,因此可能会检测到多个左上角和右下角。我们需要确定左上角和右下角的一对角点是否来自同一目标边界框。论文受Newell 等人提出的用于多人姿态估计任务的关联嵌入方法的启发,Newell 等人检测人的关节点,并为每个检测到的关节生成嵌入向量。他们根据嵌入向量之间的距离将节点分组,关联嵌入的思想也适用于我们的任务。 网络预测每个检测到的角点的嵌入向量,使得如果左上角和右下角属于同一个边界框,则它们的嵌入之间的距离应该小。 然后,我们可以根据左上角和右下角嵌入之间的距离对角点进行分组。 嵌入的实际值并不重要,我们仅使用嵌入之间的距离来对角点进行分组。论文和 Newell 他们一样使用 1 维嵌入,etk表示角点k的左上的嵌入,ebk表示右下的嵌入。我们使用 "pull" 损失来训练网络对角点进行分组,并且用 "push" 损失来分离角点。如公式 (4) 和(5)所示:

其中ek是etk和ebk的平均值,我们在所有的实验中将Δ设置为1。和损失偏移类似,仅仅在 ground-truth 角点位置应用这个损失函数。

Corner Pooling

如上图所示,通常没有局部视觉证据表明存在角点。要确定像素是否为左上角,我们需要水平地向右看目标的最上面边界,垂直地向底部看物体的最左边边界。因此,我们提出 Corner Pooling 通过编码显式先验知识来更好地定位角点。假设我们要确定位置(i,j)的像素是不是左上角角点,设ftij和flij分别为(i,j)位置中ftft 和flfl 的特征向量。对于H×WH×W 的特征图,Corner Pooling 时层首先最大池化ft中在(i,j)和(i,H)之间所有的特征值,使之成为特征向量tij。另外,最大池化flfl 中在(i,j)和(W,j)之间的所有特征值,使之成为特征向量lij。最后把tij和fij加在一起,如公式 (6) 和(7)所示:

在这里,我们应用了一个 elementwise 最大化操作。动态规划可以有效地计算tij和lij,如下图所示:

我们以类似的方式定义右下角池化层。最大池化(0,j)与(i,j)之间所有得特征值,(i,0)(和(i,j)之间的所有特征值,然后将池化结果相加。Corner Pooling 层用于预测模块来预测热力图,嵌入和偏移量。

预测模块的第一部分是残差模块的修改版,修改后的残差模块中,将第一个3×3 卷积替换为一个 Corner Pooling 模块。这个残差模块首先通过具有128个通道的2个3×3卷积模块的主干网络进行特征提取,然后应用一个 Cornet Pooling 层。残差模块之后,我们将池化特征输入到具有256个通道的3×3的 Conv+BN 层,同时为这一层加上瓶颈结构。修改后的残差模块后面接一个具有256个通道的3×3卷积模块和256个通道的3个Conv-ReLU-Conv 来产生热力图,嵌入和偏移量。

沙漏网络

CornerNet 的 Backbone 使用 Hourglass 网络,这个网络最早在人体姿态估计任务中被引入。Hourglass 网络是全卷积网络,包含一个或者多个 Hourglass 模块。输入图片的尺寸是511×511×3,经过一个conv(7x7-c128-s2-p3)的卷积模块,以及一个residual(其中卷积层的核为3x3-cl256-s2-p1),因此这个时候特征图大小就变成了128×128×256,这个特征图作为 Hourglass 网络的输入。而在 Hourglass 网络中首先使用一些卷积核池化层对输入特征进行下采样(注意论文指出这里没有使用池化层来做下采样,而是只使用步长为2 卷积层),然后再上采样使得特征图的分辨率回到原始大小,由于 Max-Pooling 层会丢失细节信息,所以增加跳跃连接层将低级特征信息带到上采样特征图中,因此 hourglass 不仅仅结合了局部特征还结合了全局特征,当堆叠多个 hourglass 模块时就可以重复这个过程,从而捕获高级的特征。

Hourglass 网络结构图如下:

实验

训练细节

论文在 Pytorch 上实现了 CornerNet,代码地址见附录。网络是在默认的 Pytorch 设置下随机初始化的,没有在任何外部数据集上预训练,另外因为使用了 Focal Loss,所以应该按照 RetinaNet 论文中指出的方式来对某些卷积层的偏置进行初始化。在训练时,设置了网络的输入分辨率511×511,所以输出分辨率为128×128。为了减少过拟合,论文使用了标准的数据增强技术,包括随机水平翻转、随机缩放、随机裁剪和随机色彩抖动,其中包括调整图像的亮度,饱和度和对比度。 使用 Adam 来优化完整的训练损失:

其中α,β,γ分别是 pull,push 和 offset 的权重。 我们将α和β都设置为0.1,将γ设置为1。batch_size设置成49,并在 10 个 Titan X(PASCAL)GPU 上训练网络(主 GPU 4 个图像,其余 GPU 每个 GPU 5 个图像)。为了节省 GPU 资源,在论文的 ablation experiments(即模型简化测试,去掉该结构的网络与加上该结构的网络所得到的结果进行对比)中,我们训练网络,进行250k次迭代,初始学习率为2.5×10?4。当将论文的结果和其他检测器比较时,论文额外训练网络,进行250k迭代,并到最后50k次迭代时,将学习率降为2.5×10?5。

测试细节

测试时主要有 3 个步骤:

  • 如何判断某个位置是角点?首先执行 nms,对得到的两组热力图(注意热力图就是某个特定位置属于某个类别角点的概率)应用3x3大小并且stride=1,pad=1的maxpooling,不改变特征图大小,保留值保持不变,值改变了的则全部置为 0。然后选择 top N,这个操作是在所有分类下(分类不独立)进行,选择 top N 的时候同时保持这些角点的对应分类。
  • 左上角点和右下角点如何配对?参考分组角点那一节的分析,用嵌入距离来判断。
  • 再次选择 top K 的角点对,并微调坐标位置,得到最后的结果。

MSCOCO

论文在 MSCOCO 数据集上评测了这个算法。MS COCO 包含 80k 图像用于训练,40k 图像用于验证,20k 图像用于测试。 训练集中的所有图像和验证集中的 35k 图像用于训练。 验证集中剩余的 5k 图像用于超参数搜索和 ablation study。 测试集上的所有结果都将提交给外部服务器进行评估。 为了与其他检测器进行公平比较,我们在 test-dev 集上记录了我们的主要结果。 MS COCO 在不同 IoU 上使用平均精度 (AP)、在不同物体尺寸上使用 AP 作为主要评估指标。

消融研究

  • Corner Pooling。Corner Pooling 是 CornerNet 的关键组成部分。 为了理解它对性能的贡献,训练了另一个具有相同数量参数但没有 corner Pooling 的网络。可以看到对中型和大型目标特别有用,它们的 AP 分别提高了 2.4%和 3.7%。 这是预料中的,因为中型和大型目标的最顶部,最底部,最左边,最右边的边界可能更远离角点位置。
  • 减少对负位置的惩罚。(减少对正位置周围目标半径范围内的负位置给出的惩罚)即上面的分组角点,为了探索这个操作对结果的影响,训练一个没有减少惩罚的网络和另一个固定半径为 2.5 的网络。 我们在验证集上将它们与 CornerNet 进行比较。

可以看到,一个固定半径相比于 BaseLine 模型APAP 值提升了 2.7%,APm 提升了 1.5%,APl提升了 5.3%。而基于物体半径可以进一步将AP提高 2.9%,APm增加 2.6%,APl增加 6.5%。此外,我们看到减少惩罚特别有利于大中型目标。

  • 误差分析。 这一节是比较有趣的,上面都在说这个算法的优点和原理,这个实验来分析这个算法的瓶颈。CornerNet 同时输出热图,偏移和嵌入,所有这些都会影响检测性能。 如果错过任何一个角,都将会丢失一个目标;需要精确的偏移来生成紧密的边界框。不正确的嵌入将导致许多错误的边界框。 为了理解每个部件如何影响最终误差,我们通过将预测的热图和偏移替换为 ground-truth,并在验证集上评估性能,以此来执行误差分析。实验结果如 Table6 所示:

可以看到,单独使用 ground-truth 的热力图可以将 AP 从 38.5%提高到 74.0%。而AP,APm,APl分别增长 43.1%,40.9%和 30.1%。 如果我们用 ground-truth 偏移代替预测的偏移量,则 AP 进一步从 74.0% 增加到了 87.1%,这表明 CornerNet 的主要瓶颈是检测角点。下图展示一些错误的例子。

和最先进的目标检测器相比

在 MS COCO testdev 上,将 CornerNet 与其他最先进的检测器进行比较,结果如 Table7 所示:

通过多尺度评估,CornerNet 实现了 42.1%的 AP 值,精度是 one-stage 算法中的 SOTA。下面看一些可视化例子。

结论

这篇论文提出了 CornerNet,这是一种新的目标检测方法,可以将边界框检测为成对的角点。 并且在 MS COCO 上对 CornerNet 进行评估,并展示出了 SOTA 结果。

附录

  • 论文原文:https://arxiv.org/pdf/1808.01244.pdf
  • 参考 1:https://blog.csdn.net/weixin_40414267/article/details/82379793
  • 参考 2:https://zhuanlan.zhihu.com/p/66406815
  • 代码实现:https://github.com/princeton-vl/CornerNet

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表