跳转至

前言

前天发了一个推文【目标检测 Anchor-Free】CVPR 2019 CenterNet,讲解的是 CenterNet: Keypoint Triplets for Object Detection 这篇论文,今天要讲的这篇论文全名是 Object as Points。这篇论文提出的网络也被叫作 CenterNet,和前面介绍的 CenterNet 重名了,注意加以区别。论文原文见附录。

摘要:目标检测往往是在图像上将目标以矩形框的形式标出。大多数先进的目标检测算法都是基于 Anchor 框来穷举可能出现目标的位置,然后针对该位置进行目标的分类和回归,这种做法浪费时间,低效,并且需要额外的后处理(NMS)。这篇论文使用不同的方法,构建模型时将目标作为一个点,即目标 BBox 的中心点。并且检测器使用关键点估计来找到中心点,并回归其它的目标属性,例如尺寸,3D 位置,方向,甚至姿态。这个模型被论文叫做 CenterNet,这个模型是端到端可微的,更简单,更快速,更准确。下面是其性能:1:Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS 。2:DLA-34 : 37.4% COCOAP and 52 FPS 。3:Hourglass-104 : 45.1% COCOAP and 1.4 FPS。

下面的 Figure2 展示了使用 CenterNet 目标检测器检测目标的一个可视化效果。

在这里插入图片描述

贡献

CenterNet 的创新点如下: - 用 heatmap 预测的目标中心点代替 Anchor 机制来预测目标,使用更大分辨率的输出特征图(相对于原图缩放了 4 倍),因此无需用到多层特征,实现了真正的 Anchor-Free。CenterNet 和 Anchor-Based 检测器的区别如 Figure3 所示。

在这里插入图片描述

  • 网络可拓展性非常强,论文中介绍了实现 3D 目标检测和人体姿态估计任务。具体来说对于 3D 目标检测,直接回归得到目标的深度信息,3D 目标框的尺寸,目标朝向;对于人体姿态估计来说,将关键点位置作为中心的偏移量,直接在中心点回归出这些偏移量的值。例如对于姿态估计任务需要回归的信息如 Figure4 所示。

在这里插入图片描述

  • 由于模型设计简单,因此在运行速度和精度的平衡上取得了很好的结果。

在这里插入图片描述

网络设计

网络结构

CenterNet 的网络结构如 Figure6 所示。对于 2D 目标检测任务来说,CenterNet 输入512×512 分辨率的图像,预测2 个目标中心点坐标和2 个中心点的偏置。以及80 个类别信息。其中 Figure6(a) 表示 Hourglass-104,Figure6(b) 表示带有反卷积做上采样的 ResNet-18,Figure6(c)表示经典的 DLA-34 网络,而 Figure6(d) 表示改进的 DLA-34 网络。

在这里插入图片描述

注意这几个结构都是 Backbone 网络,最后只需要在输出特征图上接卷积层映射结果即可。比如在目标检测任务中,用官方的源码 (使用 Pytorch) 来表示一下最后三层,其中 hm 为 heatmap、wh 为对应中心点的 width 和 height、reg 为偏置量:

(hm): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1))
)
(wh): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1))
)
(reg): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1))
)

前置内容

IRH×W×3 为输入图像,宽为W,高为H。我们的目标是生成关键点热力图ˆY[01]WR×HR×C,其中R 是输出步长(即尺度缩放比例),C 是关键点参数(即输出特征通道数);关键点类型有C=17 的人体关键点,用于姿态估计。C=80 的目标类别,用于目标检测。我们默认R=4ˆYx,y,c=1 表示检测到的关键点,而ˆYx,y,c=0 表示背景。我们采用了几个不同的全卷积编码 - 解码网络来预测图像I 得到的ˆY。我们在训练关键点预测网络时参考了 CornerNet,对于 ground truth 的关键点c,其位置为pR2,计算得到低分辨率(经过下采样)上对应的关键点为:

在这里插入图片描述

我们将 GT 坐标通过高斯核

在这里插入图片描述

分散到热力图Y[01]WR×HR×C 上,其中σp 是目标尺度 - 自适应的标准方差。如果某一个类的两个高斯分布发生了重叠,直接取元素间最大的就可以。训练目标函数如下,像素级逻辑回归的 Focal Loss:

在这里插入图片描述

其中αβ 是 Focal Loss 的超参数,实验中分别设为 2 和 4,N 是图像I 中的关键点个数,除以N 主要为了将所有 Focal Loss 归一化。

由于图像下采样的时候,GT 的关键点会因数据是离散的而产生偏差,我们对每个中心点附加预测了个局部偏移ˆORWR×HR×2,所有类别共享一个偏移预测,这个偏移用 L1 损失来训练。

在这里插入图片描述

关键点估计用于目标检测

(x(k)1y(k)1x(k)2y(k)2) 是目标k(其类别为ck) 的 bbox,其中心位置为pk=(x(k)1+x(k)22,y(k)1+y(k)22),我们使用关键点估计ˆY 来得到所有的中心点。此外,为每个目标k 回归出目标的尺寸sk=(x(k)2x(k)1,y(k)2y(k)1)。为了减少 j 计算负担,我们为每个目标种类使用单一的尺度预测ˆSRWR×HR×2,我们在中心点添加了 L1 损失。

在这里插入图片描述

我们不进行尺度归一化,直接使用原始的像素坐标来优化损失函数,为了调节该 Loss 的影响,将其乘了个系数,整个训练的损失函数为:

在这里插入图片描述

实验中,取λsize=1λoff=1,整个网络会在每个位置输出C+4 个值 (即关键点类别C, 偏移量的x,y,尺寸的w,h),所有输出共享一个全卷积的 Backbone。

从点到边界框

在推理的时候,我们分别提取热力图上每个类别的峰值点。如何得到这些峰值点呢?做法是将热力图上的所有响应点与其连接的8 个临近点进行比较,如果该点响应值大于或等于其8 个临近点值则保留,最后我们保留所有满足之前要求的前100 个峰值点。令^Pc 是检测到的c 类别的n 个中心点的集合,每个关键点以整型坐标(xi,yi) 的形式给出。^Yxiyic 作为预测的得到的置信度,产生如下的 bbox:

在这里插入图片描述

其中(δ^xi,δ^yi)=^O^xi,^yi 是偏移预测结果,(^wi,^hi)=^S^xi,^yi 是尺度预测结果,所有的输出都直接从关键点估计得到,无需基于 IOU 的 NMS 或者其他后处理。

3D 目标检测

3D 目标检测是对每个目标进行 3D bbox 估计,每个中心点都需要三个附加信息:depth,3D dimension, orientation。我们为每个信息分别添加 head。对于每个中心点,深度值 depth 是一个维度的。然后 depth 很难直接回归,因此论文参考【D. Eigen, C. Puhrsch, and R. Fergus. Depth map prediction from a single image using a multi-scale deep network. In NIPS, 2014.】对输出做了变换, 即d=1σ(ˆd)1,其中σ 是 sigmoid 函数,在特征点估计网络上添加了一个深度计算通道ˆD[0,1]WR×HR,该通道使用了由 ReLU 分开的两个卷积层,我们用 L1 损失来训练深度估计器。

目标检测的 3D 维度是 3 个标量值,我们直接回归出它们(长宽高)的绝对值,单位为米,用的是一个独立的 head 和 L1 损失:

在这里插入图片描述

目标方向默认是单标量的值,然而这也很难回归。论文参考【A. Mousavian, D. Anguelov, J. Flynn, and J. Kosecka. 3d bounding box estimation using deep learning and geometry. In CVPR, 2017.】用两个 bins 来呈现方向,并在 bins 中做回归。特别地,方向用8 个标量值来编码的形式,每个 bin 有 4 个值。对于一个 bin, 两个值用作 softmax 分类,其余两个值回归在每个 bin 中的角度。

姿态估计

人体姿态估计旨在估计图像中每个人的k 个 2D 关键点位置(如在 COCO 上,k17,即每个人有17 个关键点)。因此,中心点回归分支的维度是k×2 的,然后我们直接回归出关节点的偏移(像素单位)ˆJRWR×HR×k×2,用到了 L1 loss;我们通过给 Loss 添加 Mask 方式来无视那些不可见的关键点(关节点)。此处参照了 Slow-RCNN。为了精细化关键点,我们进一步估计k 个人体关键点热力图ˆΦRWRHR×k,使用的是标准的 bottom-up 多人体姿态估计,我们训练人的关节点热力图时使用 Focal Loss 和像素偏移量,这块的思路和中心点的训练类似。我们找到热力图上训练得到的最近的初始预测值,然后将中心偏移作为一个分组的线索,来为每个关键点(关节点)分配其最近的人。具体来说,令(ˆx.ˆy) 表示检测到的中心点,第一次回归得到的关节点为:

在这里插入图片描述

我们提取到的所有的关键点为(关节点,此处是类似中心点检测用热力图回归得到的,对于热力图上值小于 0.1 的直接略去):

在这里插入图片描述

然后将每个回归(第一次回归,通过偏移方式)位置 lj 与最近的检测关键点(关节点)进行分配:

在这里插入图片描述

注意,只对检测到的目标框中的关节点进行关联。

实现细节

论文实验了 4 个结构:ResNet-18, ResNet-101, DLA-34, Hourglass-104。并且使用用 deformable 卷积层来更改 ResNets 和 DLA-34,按照原样使用 Hourglass 网络。得到的结果如下:

在这里插入图片描述

  • Hourglass 堆叠的 Hourglass 网络通过两个连续的 hourglass 模块对输入进行了 4 倍的下采样,每个 hourglass 模块是个对称的 5 层 下和上卷积网络,且带有 skip 连接。该网络较大,但通常会生成最好的关键点估计。
  • ResNet-18 Xiao et al. [55] 等人对标准的 ResNet 做了 3 个 up-convolutional 来获得更高的分辨率输出(最终 stride 为 4)。为了节省计算量,论文改变这 3 个 up-convolutional 的输出通道数分别为 256,128,64。up-convolutional 核初始为双线性插值。
  • DLA 即 Deep Layer Aggregation (DLA),是带多级跳跃连接的图像分类网络,论文采用全卷积上采样版的 DLA,用 deformable 卷积来跳跃连接低层和输出层;将原来上采样层的卷积都替换成 3x3 的 deformable 卷积。在每个输出 head 前加了一个3×3×256 的卷积,然后做 1x1 卷积得到期望输出。

  • 训练 训练输入图像尺寸:512x512; 输出分辨率:128x128 (即 4 倍 stride);采用的数据增强方式:随机 flip, 随机 scaling (比例在 0.6 到 1.3),裁剪,颜色 jittering;采用 Adam 优化器;在 3D 估计分支任务中未采用数据增强(scaling 和 crop 会影响尺寸);其它细节见原文。

实验结果

可以看到 CenterNet 的精度吊打了 YOLOv3,并且完全的 Anchor-Free 使得我们看到了目标检测更好的思路,这篇论文我觉得应该是 2019 年目标检测领域最有价值的论文之一了。

在这里插入图片描述

在这里插入图片描述

贴一个预测可视化效果图看看。

在这里插入图片描述

在这里插入图片描述

结论

这篇论文可以让我们理解什么是真正的 Anchor-Free,并且另外一个重要点的是这种方法将检测,姿态估计,甚至分割都可以统一起来,做法十分优雅。不过 CenterNet 仍有缺点,例如在图像中,同一个类别中的某些物体的 GT 中心点,在下采样时会挤到一块,也就是两个物体在 GT 中的中心点重叠了,CenterNet 对于这种情况也是无能为力的,可能结果就是只能检测一个目标了,不过这种密集检测的问题本就是这个领域仍未解决的难题,只能期待大牛后续工作了。对我们工程派来说,没有 NMS 后处理以及这种统一多个任务的思想实在是一剂强心针,这个方向的学术研究和工程部署应该会逐渐成熟的。

附录

同期文章


欢迎关注 GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。(• ̀ω•́)✧

有对文章相关的问题,或者想要加入交流群,欢迎添加 BBuf 微信:

在这里插入图片描述


本文总阅读量160