目标检测: CornerNet

本文是 ECCV2018 的工作,创新的在不使用 anchor box 的方法进行目标检测,还是有很多值得学习的地方,尤其是对像笔者这样对目标检测领域目前还不是很熟悉的读者,在 Related works 里面,作者思路很清晰的对当前已经存在的工作进行了一个总结和梳理,对于新手来说是一个很好的学习路线,其次就是从姿态估计等领域的网络及算法中获得灵感用在了目标检测领域,这也给了我们一些启发,要多涉猎不同课题的文章,拓展自己的知识面,才更有可能有所思考和创新。

论文链接:https://arxiv.org/abs/1808.01244v1
文章源码: https://github.com/princeton-vl/CornerNet/blob/master/models/CornerNet.py

1. Introduction

当前的目标检测方法大多是使用 anchor boxes, 这种方法有两个缺点,一个是训练过程中需要产生大量的 anchor ,但是跟真值框重叠的数量又很少,所以造成了anchor正例和负例严重的不平衡,降低训练速度。

第二个缺点就是,需要设定额外的参数,包括 需要多少数量,它们的尺寸,以及长宽比。这个问题在一个单一网络具有多尺度的结构,并且在不同分辨率上进行 anchor 预测时,情况更加严重。

本文 CornerNet 则是只使用一对关键点(左上角和右下角)来预测物体。 从姿态估计的论文中得到的灵感(参考文献 27),目前还没有可以准确定位真值框左上角和右下角的操作,所以本文新提出一个 pooling layer —— corner pooling。

这里文中给出了两个使用 corner 检测优于 bounding box 的理由:

  • 计算bounding box 的中心使用了物体的四边,更难去定位,定位一个角只需要2边
  • corners 更有效的存储位置信息,O(wh),同等信息下 bounding box 需要 O(w2*h2)

通过对比实验,也说明了 corner pooling 的有效性。

2 Related Works

两阶段的目标检测器: 首先介绍此类方法并流行起来的是 R-CNN,先产生一系列的 RoIs, 并对他们使用一个网络进行分类。 RoIs 的产生使用了一些低层次的视觉算法(SS等),然后提取这些区域并用神经网络独立的处理它们,这样产生了很多冗余的计算。 随后 SPP 和 Fast-RCNN 通过设计了一个特殊的 pooling 层来取代分别对每一个 region 进行 pool 的操作。但是它们还是依赖于和神经网络分离的 提取预选框算法,并不能端到端的训练。 Faster-RCNN 提出了 RPN 网络来替代 低层的提取预选框算法, RPN 可以从预先定义好的候选框中产生预选框,也就是 anchor boxes。 这不仅使检测器更有效,也使检测器可以端到端的训练。 R-FCN 通过将全连接的子检测网络替换成全卷积的子检测网络,进一步提升了 faster-RCNN 的效率。 其他方法则是主要关注在如何利用子类信息,通过产生更多尺度的候选框来包含更多的文本信息,选择更优的特征,改善速度,级联过程?,还有就是训练过程。

一阶段的目标检测器: 另一方面,以 YOLO 和 SSD 为首的一阶段方法,它们移除了 RoIs pooling 的步骤,并在一个单一的网络中实现检测物体。 毋庸置疑,通常一阶段方法比二阶段方法更节省计算资源。

SSD 直接将 anchor boxes 集中的放置在不同尺度的特征图上,并直接分类和改善这些 anchor box。 YOLO 则是直接从图片中产生 bounding box 的坐标,随后的 YOLO9000 也使用了 anchor box 来对YOLO方法进行优化。 DSSD 和 RON 采用了类似于 hourglass 的网络,都是使用跨层连接来结合 低层和高层的信息,来让 bounding box 预测的更准确。但是这些一阶段的检测器均没有两阶段的检测器性能好,知道 RetinaNet 方法的提出。 在 RetinaNet 中,作者提出密集的 anchor box 在正负 anchor 样本产生了很大失衡,即 正样本很少,负样本很多。这样的不平衡会影响训练效率,结果也是不好的,所以他们提出了一个新的 loss, Focal loss,来动态调整每一个 anchor box 的权重,并达到了超过两阶段检测器的效果。 RetinaDet 提出通过过滤 anchor box 来降低 anchor box 负样本的数量,并简单地调整这些 anchor。

DeNet 是一个两阶段的检测器,没有使用 anchor box 就产生了 RoIs,它首先确定每个位置属于边界框的左上角、右上角、左下角或右下角的可能性。然后通过列举所有这些角的可能性来产生 RoIs,随后是一个标准的两阶段检测器的方法来处理每一类的 RoI. 本文的方法不同于 DeNet,首先,DeNet 没有判定两个角是否来自同一个物体,并通过一个子检测网络去删除一些差的 RoIs。相反,我们的方法是一个一阶段的方法,检测和对角进行分组都使用同一个卷积神经网络;第二,DeNet 要手动选择每一个 region 的特征来做分类,我们的方法不需要任何特征选择操作;第三,我们提出了 corner pooling,一个新颖的层来增强角检测。

本文工作是基于 Newell 等人的工作(多人姿态估计背景下的关联嵌入),Newell 提出一种在单个网络中检测和分组人体关节,他们的方法中,每一个检测到的 人体关节 都有一个 embedding 向量,这些关节根据它们 embedding 向量之间的距离差异被分成不同的组。 据我们所知,我们是第一个将目标检测任务定义为同时检测和分组角点的任务。 另一个创新点就是,corner pooling 可以帮我们更好的定位角点,我们也使用了 Hourglass 的结构并加入了我们新的 focal loss。

3 CornerNet

3.1 算法总览

在 CornerNet 中,我们首先检测 bounding box 的一对角点,左上角和右下角。一个卷积网络来预测这两个位置的热度图集合来表示不同物体总类的角点位置。一个集合表示左上角,另一个集合表示右下角。这个网络还会预测一个 embedding 向量对每一个检测到的角点,让属于同一类物体的对应角点之间的 Embedding 向量距离更小。为了产生更紧凑的 bounding box,网络也会预测一个 offsets 来微调角点的位置。 基于上面预测的热度图,embedding vector 和 offsets,我们提出一个简单的后处理算法得到最终的 Bounding box.

下图是整体网络的结构图,整体CornerNet 使用 hourglass network 做为网络主题,并跟上两个预测模块,一个预测模块是预测左上角角点,另一个是预测右下角角点。每一个模块都有自己的 corner pooling 模块来对从 Hourglass 网络中输出的特征进行池化,用作热度图,embedding,offsets的预测. 不像其他的检测方法,我们不用来自不同尺度的特征图来检测不同尺寸的物体。我们只对 Hourglass 网络的输出使用这两个预测模块即可。

3.2 检测角点

我们会预测两种不同的热度图,一个对应多上角,一个对应右上角。每一个热度图集都有 C 个通道,这 C 就是类别数,并且每一个通道的尺寸为 H x W. 这里没有背景通道。每一个通道都是一个二值的mask,来表示每一类物体在途中角点的位置。

对每一个角点,都有一个对应的真值位置,其他的位置就都是负样本。训练时,我们会对正样本位置一定半径内的负样本进行一定的损失函数权重调整(不同情况的负样本点采用不同权重)。因为一对角点检测,如果它的位置比较接近真值位置,仍然可以产生一个与真值框有一定重叠区域的预测框。 这个半径是由物体的大小决定的,只要可以确保这里的一对在半径内的角点确定的 box 可以与真值框的 IoU >= t (这里 t 取 0.7) 。至于半径的选择,惩罚减少是基于一个非单位的 2D 高斯分布,这里 center 是 正样本的坐标,方差是 半径的 1/3。

用新的 Focal loss 来预测热度图,为了解决原图映射到热度图,再反映射回原图坐标信息的丢失,尤其是对小的 bounding box,加入了一个 offsets,这里的 Offsets 是被所有种类的物体共享的,用 L1 Loss 来训练这个 offsets。

3.3 角点分组

图片中可能出现多个物体,这时我们需要对左上角和右下角的角点进行分组来判断一组角点(左上角+右下角)是否属于同一个物体的框。 这里方法的灵感来源于 Newell 的工作,这里分组就用到了 embedding vector. 这些vector 的值不重要,我们只需要用它们之间的距离,这里使用了 “pull” Loss 来尽可能缩减所以同一个物体的左上角的差距,和 “push” Loss 来扩大不同类别角点之间的距离。

3.4 角点池化

具体过程,以左上角为例:

依次从右往左改成当前遍历过的行元素中的最大值,下面是从下往上依次改成当前已经遍历过的列元素的最大值,然后将两个特征图对应位置相加得到最后结果。

参考博客 CornerNet 算法笔记 中的理解,Corner pooling 的思想如下:

对 Corner pooling 的理解:

以左图1为例,如果对真值框中的区域进行正常的池化,那么左上角和右下角毫无规律可言,这就无法训练网络了,所以进行一个 corner pooling,以求左上角的坐标为例,与左上角有关的上边缘包含了目标顶端的特征信息(帽子顶部),左边缘则包含了目标左侧的特征信息(左手部分),通过将这两边的特征值的最大值逐步传播到左上角区域,最后叠加,那这一点的坐标的值就会比其他相邻区域的和要大,这样经过 corner 池化后就有利于网络的训练和预测了。

预测模块网络结构:

3.5 Hourglass 网络

Hourglass 网络是被用在人体姿态估计中的,它是由一个或者多个 Hourglass 模块组成的全卷积网络,hourglass 是通过一连串的卷积和最大值池化来下采样的,因为池化会丢失一些细节信息,hourglass 就用了跨层连接来融合局部和全局信息,降低池化层带来的影响。本文则是将 Hourglass 模块中的最大值池化替换成了 stride = 2 的操作,并增加了通道数,等等,采用了上述两个 Hourglasses 模块来构建 backbone。

4 实验

这里主要是测试时候,如何将 heatmap,embedding vector,offsets组合生成bounding box。首先对 heatmaps 使用 3x3 maxpooling 层后,采用非极大值抑制抑制(NMS),从这些热度图中取前 100 个左上角和 100 个右下角,角点的位置通过 offsets 调整。 计算 左上角和右下角的 emmbedding vector 之间的 L1 距离,如果这个距离大于 0.5 的或者两点不是来自一对都不能构成一对。 用 pad 0 来代替 resize 的操作,另外同时测试图像的水平翻转图并融合二者结果,通过 soft-nms 来消除冗余的框。

其他实验设置及结果可以查看原论文。

文中在 Table 3 中,CornerNet 最大的瓶颈还是角点检测问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值