【目标检测论文3】——CornerNet

论文:CornerNet: Detecting Objects as Paired Keypoints
论文链接:https://arxiv.org/abs/1808.01244
代码链接:https://github.com/umich-vl/CornerNet

Introduction

本文提出了一种新的目标检测方法,即不使用Anchors框进行辅助,直接使用角点信息进行确定目标的位置。

我们知道目前大部分常用的目标检测算法都是基于anchor的,比如Faster RCNN系列,SSD,YOLO(v2、v3)等,引入anchor后检测效果提升确实比较明显(比如YOLO v1和YOLO v2),但是引入anchor的缺点在于:1、正负样本不均衡。大部分检测算法的anchor数量都成千上万,但是一张图中的目标数量并没有那么多,这就导致正样本数量会远远小于负样本,因此有了对负样本做欠采样以及focal loss等算法来解决这个问题。2、引入更多的超参数,比如anchor的数量、大小和宽高比等。这篇论文与他们最大不同就是省去了Anchors框的选择。他的具体结构如下图(1):


【目标检测论文3】——CornerNet

 单从这个整体的框架图中,我们可以看到里面有几个特殊的结构,Hourglass Network, Corner pooling, Embedding等,下面我们根据这几个名词,作出解释,当然是一孔之见,如果有不对的,欢迎指正!

1 Hourglass Network

论文:《Stacked Hourglass Networks for Human Pose Estimation》

论文链接:https://arxiv.org/pdf/1603.06937.pdf

论文代码:github 有各种版本实现

他的网络结构由于像沙漏,所以就叫做沙漏网络,具体结构如图(2):

【目标检测论文3】——CornerNet

 看起来像是几个编码-解码器的堆叠,其实他设计的时候并不是这样的。

这个网络设计初衷是要用在人体姿态估计中,因为在人体中包含很多的部位,头,肩膀,胳膊,腿等,如果只是依靠神经网络产生最终的Feature Map去做姿态估计,其实会丧失掉很多局部信息,所以沙漏网络被设计出来,目的是为了通过重复自底向上和自顶向下并联合中间结果的监督用在人体姿态估计中可以很好地利用身体不同部位的空间关系。有些人可能会问,为什么不用FPN等技术进行多尺度操作呢?我认为一是FPN的速度慢,另外是FPN只考虑了局部信息(通过卷积操作得来的Feature Map)【如有更好的见解,欢迎指正】。

那么沙漏网络具体是怎么样的呢?我们一起来看看。这篇文章的源码里体现的是模块化的组网过程,残差模块->子网络->完整网络的设计思想。

1.1  Residual模块

【目标检测论文3】——CornerNet

我们知道卷积层和pooling层的属性是: 核尺寸(kernel)决定了特征的尺度;步长(stride)决定了降采样的比例;算子的通道数(channel)决定了输出数据的层数/深度。

第一行为卷积路,由三个核尺度不同的卷积层(蓝色)串联而成,间插有Batch Normalization(浅黄)和ReLU(浅黄); 
第二行为跳级路,只包含一个核尺度为1的卷积层;如果跳级路的输入输出通道数相同,则这一路为单位映射。 
所有卷积层的步长为1,pading为1,不改变数据尺寸,只对数据深度(channel)进行变更。 
Residual Module由两个参数控制:输入深度M和输出深度N。可以对任意尺寸图像操作。

注意:Residual模块提取了较高层次的特征(卷积路),同时保留了原有层次的信息(跳级路)。不改变数据尺寸,只改变数据深度。可以把它看做一个保尺寸的高级“卷积”层。

1.2 沙漏网络的子模块

Hourglass是论文中的的核心部件,由Residual模块组成。根据阶数不同,有不同的复杂程度。

先来看看一阶Hourglass子网络。

【目标检测论文3】——CornerNet
上下两个半路都包含若干Residual模块(蓝色),逐步提取更深层次特征。但上半路在原尺度进行,下半路经历了先降采样(绿色/2)再升采样(绿色*2)的过程。 
降采样使用max pooling,升采样使用最近邻插值,当然升采样也可以使用反卷积的方法。【具体是在FCN:Fully Convolutional Networks for Semantic Segmentation中有涉及】

二阶Hourglass子网络

【目标检测论文3】——CornerNet这个是直接在网上搜的图。 就是把那个蓝色图框的一部分有替换成了一个一阶沙漏(输入通道256,输出通道N)。

两个层次的下半路组成了一条两次降采样,再两次升采样的过程。两个层次的下半路则分别在原始尺寸(OriSize)和1/2原始尺寸,辅助升采样。

同理可以推导出四阶Hourglass子网络

【目标检测论文3】——CornerNet

每次降采样之前,分出上半路保留原尺度信息; 
每次升采样之后,和上一个尺度的数据相加; 
两次降采样之间,使用三个Residual模块提取特征; 
两次相加之间,使用一个Residual模块提取特征。

作用:n阶Hourglass子网络提取了从原始尺度到1/(2^n)尺度的特征。不改变数据尺寸,只改变数据深度。

两个Hourglass子网络的连接细节:

【目标检测论文3】——CornerNet

如上图,N1代表第一个沙漏网络,提取出的混合特征经过1个1x1全卷积网络后,分成上下两个分支,上部分支继续经过1x1卷积后,进入下一个沙漏网络。下部分支先经过1x1卷积后,生成heat map,就是图中蓝色部分.

上图中蓝色方块比其他三个方块要窄一些,这是因为heat map矩阵的depth与训练数据里的节点数一致,比如 [1x64x64x16],其他几个则具有较高的depth,如 [1x64x64x256]

heat_map继续经过1x1卷积,将depth调整到与上部分支一致,如256,最后与上部分支合并,一起作为下一个沙漏网络的输入。

1.3 完整的网络模型

在论文中的实验里,作者采用的是如下形式的沙漏网络级联来进行实验的。

【目标检测论文3】——CornerNet

那他的具体细节是什么呢?

以一个Hourglass(深绿色)为中心的网络模型,可以从彩色图像预测K个人体部件的响应图 

【目标检测论文3】——CornerNet

原始图像经过一次降采样(橙色),输入到Hourglass子网络,【可能有多阶Hourglass子网络】中。Hourglass的输出结果经过两个线性模块(灰色),得到最终响应图。期间使用Residual模块(浅绿)和卷积层(白色)逐步提取特征。

两个Hourglass的网络模型。

【目标检测论文3】——CornerNet

对比上图,二级网络重复了一级网络的后半结构。第二个Hourglass的输入包含三路: 
- 第一个Hourglass的输入数据 
- 第一个Hourglass的输出数据 
- 第一级预测结果 
这三路数据通过串接(concat)和相加进行融合,它们的尺度不同,体现了当下流行的跳级结构思想。

1.4 中间监督计算Loss

传统的识别或者检测网络,loss只比较最后的预测与ground truth之间的差异。因为堆叠沙漏网络的每一个子沙漏网络都会有heat map作为预测,所以将每个沙漏输出的heat map参与到loss中,实验证实,预测精确度要远远好于只考虑最后一个沙漏预测的loss,这种考虑网络中间部分的监督训练方式,就叫做中间监督(Intermediate Supervision)。

对于H×W×3的输入图像,每一个hourglass级都会生成一个H/4×W/4×K的响应图。对于每个响应图,都比较其与真值的误差作为代价。在源码中,整个网络的输出结果包含每个级别的响应图,但在测试中只使用最后一级结果。这是因为torch的代价函数只能绑定在输出数据上。

Corner pooling

这里引入的是一个全新的pooling方法,不同于之前的Max Pooling或者是Average Pooling,Corner Pooling的方法主要是基于从一个框的角点出发,这里假设是在一个框的左上方区域的角点(i,j)那么该框最左侧的横坐标为 i ,最大的纵坐标为 j ,同理,如果右下角的坐标是 (m,n) ,那么该框最大的横坐标是 m,最小的纵坐标是 n 。如图所示:

【目标检测论文3】——CornerNet

那么具体的 Corner Pooling是怎么操作的呢?

【目标检测论文3】——CornerNet

论文里只举了左上角的例子。 我们可以看到,这里是把输出的 top-left feature map 分成了两部分,一部分用来进行从下到上的池化,一个用来进行从右到左的池化。也就是 左上角坐标->(i,j),池化的时候是从下到上:(i,0)->(i,j) 从右到左:(w,j)-->(i,j)。那么如果是右下角的点呢?是从左到右(0,n)->(m,n),从上到下 (m,H)->(m,n)。为了简单起见这里只举左上角Corner Pooling的例子:

【目标检测论文3】——CornerNet

Corner pooling是作者在CornerNet中提出的一种新的池化方式,用在prediction modules中。如果读者们仔细思考这种池化方式,会发现Corner pooling设计得十分精妙。

池化方法如图所示(以Top-left为例,Bottom-right与其方向相反)。对于第1组feature maps,对每行feature scores按从右向左的顺序选择已滑动过范围的最大值,对于第2组feature maps,对每列feature scores按从下向上的顺序选择已滑动过范围的最大值。

那么,作者提出corner pooling的动机是什么呢?其实为了更好地适应corner的检测。在目标检测的任务中,object的corner往往在object之外,所以corner的检测不能根据局部的特征,而是应该对该点所在行的所有特征与列的所有特征进行扫描。

举个例子,如果我们能在某行和某列检测到同一个object的边界特征,那么这行和这列的交点就是corner,这是一种间接且有效的找corner的方法。

还有一点值得注意的是,池化时不能直接对整行或整列进行max pooling,当一张图上有多个目标时,这样会导致误检。

 

Embedding

这里使用的 Embedding 技术来自于

论文:《Associative Embedding: End-to-End Learning for Joint Detection and Grouping

论文地址:https://arxiv.org/pdf/1611.05424.pdf

这篇论文里的Associative Embedding同样被应用在CornerNet 中。那么Associative Embedding是指什么呢?他是一项Embedding技术,可以结合任何一种神经网络框架使用。Associative Embedding的出现,图像分割任务中检测像素点和组成分割区域实现一体化完成,之前的分割任务要么是Top-down structure,先识别人。然后再将人进行剪切放缩,进行分割任务;要么是Bottom-up structure,先按像素分割成型,然后再分整体的人。

【目标检测论文3】——CornerNet

【目标检测论文3】——CornerNet

而文章中的Associative Embedding方法则是将检测和分割集成为一体:

【目标检测论文3】——CornerNet 当然这里他使用了前面提到的Hourglass net 用来预测身体的各个部位。其实这个方法就相当于在预测像素点的同时,添加进去了一个标志位,属于同一物体的不同像素对应的标志位是相同的,这样在进行网络检测的时候,可以输出像素的预测热图和Associative Embedding值。然后定义了损失函数如下:

【目标检测论文3】——CornerNet

【目标检测论文3】——CornerNet

为了更明显的看出Associative Embedding的意思,可以看下图,左侧是测试图像,右侧是输出的一个embedding  table,可以清楚地看到,横轴每一个标签代表一个物体。纵轴代表每个物体的不同部位,在实验时候,其结果就是由每张图上的不同物体的每个部位的向量+一个标签向量(one-hot编码的)

【目标检测论文3】——CornerNet

 4 CornerNet

有了上面的知识介绍后,我们可以开始讲一下CornerNet了。

4.1 CornerNet Structure

之前已经提到,CornerNet摆脱了Anchors的概念,直接使用角点来确定目标位置。

【目标检测论文3】——CornerNet

假设某Feature Map的大小为 W*H*C,W,H:宽和高,C:通道数,那么在使用Anchors的情况下,其至少要生成 9*W*H 的 Anchors (这里的9是指3个尺寸下有3个宽高比), 而使用角点则需要使用 W*H 个像素点的信息就够了。具体结构细节如下:【目标检测论文3】——CornerNet

CornerNet是一种one-stage检测方法,主干网采用了Hourglass Network。主干网后紧跟两个prediction modules,其中一个检测top-left corners ,另一个检测bottom-right corners,最后对两组corner进行筛选,组合,修正得到object的一对corners,从而定位object的box。

Heatmaps和Embeddings都是prediction modules最后生成出来的特征图,top-left corners 和bottom-right corners各有一组。Heatmaps预测哪些点最有可能是Corners点,Embeddings用于表征属于相同对象的corner的相似度。它们的通道数都为C,C是object的类别数 (不包括background) 。最后的Offsets用于对corner的位置进行修正。每个corner修正前的坐标位置就是该corner在feature maps上的坐标点映射回原图的位置。

从图中我们可以看出,绿框中两个corner对应位置的Embedding的features分布相似度高,所以代表这对corner属于同一个object,黄框同理。

4.2 CornerNet Detail

【目标检测论文3】——CornerNet

 

  Top-left和bottom-right的prediction modules结构相同,我们以Top-left为例,如图所示。Prediction modules的前半部分类似残差结构。Backbone中的feature maps进入prediction modules后分成三条支路:上面两条支路经过3*3的卷积(灰色部分)后,进行corner pooling,相加汇集成1路,随后再进行3x3的卷积和batch normalization;最下面的支路进行1*1的卷积和batch normalization 后,与上路相加后送入到Relu函数中。随后,再对feature maps进行3*3的卷积,接着分三路3*3的卷积+Relu后产生了Heatmaps, Embeddings, Offsets三组feature maps。

4.3 Train Loss

对于Heatmaps, Embeddings, Offsets三组feature maps,都各自用于一种loss计算。

Heatmaps: detecting corners

【目标检测论文3】——CornerNet

该loss是Focal loss的变体,其中,pcij代表类别C的predicted corner在位置 (i, j) 处的得分,得分越高就越可能是corner。ycij表示ground truth的Heatmaps,使用Gaussian公式:

【目标检测论文3】——CornerNet

中心点是ground truth的位置,σ=1/3,是一个超参数。(1-ycij)可以理解predicted corner到gt corner的距离,只是这个距离被Gaussian非线性化了,使得负样本的惩罚减少了。 

Embeddings: grouping corners

【目标检测论文3】——CornerNet

其中,etk是object左上角的embedding得分,ebk是object右下角的embedding得分,ek代表etk和ebk的均值。N代表gt中的object数量。

Pull loss越小,则同一object的左上角和右下角的embedding得分距离越小,说明是同一物体的可能性增大;Push loss越小,则不同object的左上角和右下角的embedding得分距离越大,说明是不同物体的可能性增大,类似于聚类的思想。

Offsets: correcting corners’ position

【目标检测论文3】——CornerNet

【(Ok)尖】代表Offsets的predicted offset;Ok代表gt的offset;N代表gt中的object数量 

total loss

【目标检测论文3】——CornerNet

 4.4 Train Detail

1) 随机初始化的,没有在任何外部数据集上进行预训练。

2) 遵循Focal loss for dense object detection中的方法设置预测Heatmaps的卷积层的biases。

3) 网络的输入分辨率是511×511, 输出分辨率为128×128。

4) 为了减少过拟合,我们采用了标准的data augmentation,包括随机水平翻转、随机缩放、随机裁剪和随机色彩抖动,其中包括调整图像的亮度,饱和度和对比度。

5) 使用PCA分析图像数据。

6) 使用Adam优化训练损失

4.5 Test

测试时,使用simple post-processing算法从Heatmaps, Embeddings, Offsets生成边界框。首先在heatmaps上使用3*3的max pooling进行非极大值抑制(NMS)。然后从Heatmaps中选择scores前100的top-left corners和前100的bottom-right corners,corner的位置由Offsets上相应的scores调整。 最后,计算top-left corners和bottom-right corners所对应的Embeddings的L1距离。距离大于0.5或包含不同类别的corners pairs将被剔除。配对上的top-left corners和bottom-right corners以Heatmaps的平均得分用作检测分数。

作者没有使用resize的方法保持输入图像的原始分辨率一致,而是维持原分辨率,用0填充缺失和超出的部分。 原始图像和翻转图像都参与测试,并应用soft-nms来抑制冗余检测。 仅记录前100个检测项。 Titan X(PASCAL)GPU上的每个图像的平均检测时间为244ms。使用检测速度top100的测试图片,计算出CornerNet在TitanX(PASCAL)GPU上的平均推断时间为每张图片224ms。

5 Conclusion 

这篇文章提出了一种全新的one-stage目标检测算法,让人耳目一新。不过虽说是one-stage算法,其速度还是比较慢的。文章里面还有好多细节可以抠,比如说Heatmaps, Embeddings, Offsets的输出应该是0~1之间的一个数,可是作者在这里并没有阐明是怎么处理的,具体可以看代码,哎科研努力!!!!

 

https://blog.csdn.net/wangzi371312/article/details/81174452

https://blog.csdn.net/shenxiaolu1984/article/details/51428392

https://blog.csdn.net/weixin_39290638/article/details/84594044