Corner-based对象检测算法三连之——开山鼻祖CornerNet

本文的阅读前提是对对象检测算法的基本概念有所了解。

概述

论文中提出的CornerNet,是一种新的对象检测方法,其使用一个单一的卷积神经网络将对象的边界框检测定义为一对关键点,即左上角和右下角。通过将目标作为成对的关键点进行检测,算法消除了设计anchor box的需要,anchor box通常用于单阶段检测器。除了新方法外,论文还引入了corner pooling,一种新型的池化层,可以帮助网络更好地定位对象的corner。实验表明,在COCO的数据集上,CornerNet实现了42.1%的AP,超过了当时所有的单阶段探测器。

作者指出,基于corner的对象检测方法的好处:
首先,box的中心位置更难定位,因为它取决于对象的所有4个边,而定位一个corner只依赖于两个边,因此更容易,尤其是使用corner pooling,其编码了一些显式定义的先验知识。个人认为,由于缺乏更多的来自对象本身的特征(两个边),这个也可能会造成大量的false positive box(这个也是CenterNet重点改进的方面)。其次,corner提供了一种更有效的方法来密集地表示所有box的空间:只需要个corner来表示个可能的anchor box。

个人感觉论文分支较多,不容易将所有内容以连贯的思路概括起来,从而很难做到框架和细节两抓。这里我尝试使用算法在训练和测试时的流程图(不是软件工程中的流程图)将所有内容串起来,这样我们可以跟着流程图中的前处理、前向传播、后处理和计算loss过程将所有的细节填充进去,从而达到掌握整个算法思想和细节的目的。

CornerNet的流程图如下:

image1.jpg

下面是图中标出的每个点的具体描述:

1

训练

训练时,作者将原图resize到511×511的大小,这样经过前向传播降采样(降采样率固定),最终输出的feature map分辨率为128x128。为了避免过拟合,作者采用一系列的数据增强方法:随机反转、随机放缩、随机裁剪和随机颜色抖动,颜色抖动包括亮度、饱和度和对比度的随机调整。最后,作者还对输入应用了PCA。

测试

作者没有直接将图像大小调整为固定的大小,而是保持图像的原始分辨率。原始图像和翻转图像都用于测试。

2

算法的backbone网络使用的是hourglass network,但是在该网络的基础上进行了修改,由于我们的关注重点是在backbone后面box预测的相关操作上,所以关于修改的细节不再展开。

3

CornerNet只使用了backbone的最后一层输出的特征映射作为后续训练或推理的输入。

4'和4''

通常没有局部的视觉特征能够表示对象box corner的存在。为了确定一个像素是否为corner,作者创新性地提出corner pooling层,以确定top-left corner为例,其通过水平地向右查看(即max操作)对象的最顶部边界,垂直地向底部查看最左侧边界,从而获得表示top-left corner的特征,类似地,通过向上和向左观察获得表示bottom-right corner的特征。下图所示为计算top-left corner特征的corner pooling:

image2.jpg

论文中,top-left corner模块的具体结构,即图1中的top-left corner prediction module的结构如下图所示,相应的我们也可以得到bottom-right corner prediction module的结构图,此处不赘述。

image3.jpg

通过以上两幅图我们就能掌握corner pooling模块的实现方式和具体结构,但是这里有个问题:

We thus propose corner pooling to better localize the corners by encoding explicit prior knowledge.

为什么corner pooling能够帮助模型检测到box的corner,为什作者说这是先验经验,论文中并没有详细说明。我猜测这可能借鉴自传统图像处理算法(如边缘或者角点检测)的思想,现在介绍下我自己的理解。如下图所示是一个含有数字2的灰度图片的数值显示(这是理想情况,一般背景都会含有噪声):

image4.jpg

现在我们假设使用top-left corner pooling提取top-left corner的特征,我们会得到下面的特征图:

image4.jpg

从上面的特征图我们可以看出,黄色区域的特征非常明显,那就是从左上角0位置不管是向右还是向下观察(或右下),特征值都会发生剧烈变化,这其实就是角点检测算法Harris检测对象角点的思想(可以参考这篇文章)。 得到这样的特征后再通过卷积层学习,模型应该就可以识别出431那个点附近就是数字2的top-left corner的特征。

5'和5''

此处以top-left heatmap进行说明,bottom-right的heatmap原理与此类似。heatmap分支输出的top-left heatmap特征尺寸为:WxHxC,论文中实验W和H为128,C为类别数量,没有背景类别(背景被编码到每层heatmap上)。每个通道上是二值掩码数值,表示某个位置(如(w',h'))是否是一个corner,如果是,数值应该尽量接近1,否则接近0,其实就是对特征映射的某个位置进行二分类预测,表示该点是某个对象的top-left(或bottom-right)corner,还是其他(其他包括可能是其他对象的corner或者背景)。heatmap是通过对输入的每个通道上的特征值进行了逐像素的sigmoid计算得到。

6'和6''

由第5'和5''条预测的top-left和bottom-right heatmap都是独立的corner,但最终要求输出box,也就是corner对,所以模型要把各个单独的top-left和bottom-right corner划分成两两一对的组,即文中提出的grouping corners。最终哪两个corner应该是一组,这个当然也得模型说了算,这就是embedding的作用,每个corner对应一个一维的embedding,至于这个embedding代表什么不重要,只要它们能够充分表示两个corner是否应该属于一组。方法是计算两个corner对应embedding的距离(L1距离),小于一定阈值就认为属于一组,否则就不是。这样模型就可以通过embedding将独立的corner划分为corner组,即box。网络输出的embedding特征尺寸与heatmap相同:,论文中。

7'和7''

最终的corner预测是在backbone抽取的feature map上进行的,由于feature map存在降采样的问题,因而在feature map上生成的corner位置坐标与实际原图中位置坐标存在偏差,这种偏差在小尺寸目标上更加严重,因此模型也会回归预测一个offset用来纠正这种偏差,该输出指示了在feature map上预测的corner坐标,映射回原图中应该纠正的偏移量。输出的offset尺寸为WxHx1,所有对象的corner会共用一个offset,所以offset的通道数是1,当然top-left corner的offset与bottom-right offset是并列的 。关于ground truth offset的生成,参考第11条,offset loss计算参考13条。

8

测试推理时,作者首先使用一个3×3最大池化层对corner heatmaps进行池化操作(使用kernel=3, stride=1,padding的方式池化,原heatmap的尺寸不变),从而实现非极大抑制(NMS)抑制的作用。然后从heatmap中选择score前100个top-left corner和100个bottom-right corner。对类别相同的两两top-left corner和bottom-right corner的embedding计算L1距离,距离大于0.5的corner对被丢弃,剩下的就是接受的corner对,也就是初步预测的box。

9

通过第8条生成的box还是原生的box,即坐标准确性还不够,而且还没有满足对象检测的box输出要求:box坐标、box score和box类别。
box坐标调整:通过预测的corner offset调整box坐标。
box score:将top-left和bottom-right corner的heatmap score的平均值作为最终的box score。
box类别:与box相关的corner heatmap的类别就是box的类别。

10

在第9条预测box的基础上,作者再使用Soft NMS去除冗余的预测box,最终产生预测结果。

11

生成ground truth heatmap

依据原图和boxes labels可以生成与backbone输出尺寸和通道数相同的ground truth heatmap,即size为(W,H,C)。当然应该有两个,分别是top-left ground truth heatmap和bottom-right ground truth heatmap。以top-left ground truth heatmap为例,原图中类别C'的某个对象的top-left corner会对应到降采样后的heatmap的某个位置,假设为(W',H',C'),则该位置的值就应该是1,其他位置上如果不是该类某个对象的top-left corner,值就是0。

生成ground truth embeddings

由于作者在文中提到:

The actual values of the embeddings are unimportant. Only the distances between the embeddings are used to group the corners.

所以无法生成与predicted embeddings对应的ground truth embeddings用于loss计算,看过第13条就会发现,只要从ground truth box中确定每个对象的embeddings对位置就可以了,即确定训练时哪对embeddings是属于一个对象的,从而使用pull loss计算loss, 其他的使用push loss即可,具体内容见第13条。

生成ground truth offsets

由于是固定输入尺寸的,也知道网络的降采样因子,所以可以结合ground truth box的corner坐标、降采样因子和下面的公式计算出ground truth offset:

12

本条阅读前提为第11条。

对预测的heatmap计算损失时,作者并没有简单地将其与ground truth heatmap做逐元素的差值,然后用MSE计算误差。而是将heatmap预测看做是分类问题,使用交叉熵损失函数计算误差,但是又没有使用标准的交叉熵损失函数,因为在计算损失时中存在两个问题:其一,虽然groud truth corner位置附近的corner不是ground truth,但是由它们(top-left corner和bottom-right corner)组成的box与ground-truth box也有很大的IoU,那么直接根据ground truth将这些corner判定为彻底的negtive positive corner会造成模型费力地朝与ground truth heatmap相同的方向学习,这有些矫枉过正,这里的问题和GoogLeNet中提出label smooth要解决的问题是类似的,但是作者没有采用label smooth方法,而是对负样本heatmap的损失进行平滑处理的方法,即惩罚衰减(penalty reduction),具体方法下面会介绍;其二,由于一张图片中包含的对象是很少的,这对于heatmap来说,就是每个对象的heatmap中大部分位置都是0,只有极少数几个位置是1,这其实就是典型的正负样本不平衡,为了解决这个问题作者借鉴了Focal loss,在Focal loss基础上结合了惩罚衰减策略,得出下面的heatmap loss公式:

L_{det} = \frac{-1}{N} \sum_{c=1}^{C} \sum_{i=1}^{H} \sum_{j=1}^{W} \left\{ \begin{array}{rcl} (1-p_{cij})^\alpha log(p_{cij}), y_{cij}= 1 \\ (1-y_{cij})^\beta (p_{cij})^\alpha log(1-p_{cij}), otherwise \end{array}\right.
其中,就是由下面的生成方法产生的惩罚衰减(penalty reduction)系数,当时表示该位置为groud truth corner所在的位置,就是heatmap中第c个通道(类别)的(j,i)位置的score值。论文中。

下面介绍惩罚衰减(penalty reduction)策略:
对groud truth heatmap附近的heatmap loss进行平滑处理,需要处理两个问题:一个是多近的附近称为附近,即对groud truth heatmap周围多大范围内的负样本heatmap loss进行平滑处理,超过范围的就应该使用原始loss,这个周围应该是个圆周范围,那么这里就是确定圆周半径的问题;另一个问题是进行怎样的惩罚衰减,直观地说,当然是越靠近groud truth heatmap惩罚越小(即惩罚衰减力度越大),越远离惩罚越大,直到恢复为原始loss。将groud truth heatmap作为中心,从中心一直远离,这是一个衰减力度从1减少到0的过程。这个衰减应该与中心的距离有关,但是具体地应该是以线性方式减少,还是高阶非线性方式,或者是指数方式?

  • 圆周半径
    作者根据对象的大小来确定半径,方法是确保半径内的任意一对corner(top-left和bottom-right)生成的box与ground-truth box的IoU至少是t(论文中将t设置为0.7)。
  • 确定惩罚衰减方式
    确定了半径,惩罚的减少量由非标准化的二维高斯函数确定(万能的高斯),其中心就是ground truth heatmap的位置,其实就是周围某个点到中心距离的平方,为半径的1/3。

13

论文中只计算与ground truth corner相同位置的embedding的loss,如若不然,任意两个embedding都计算loss的话,计算量会很大。举例,假如一个图片中有5个相同类别对象,即有5个ground truth box,那么在预测的top-left embedding中会有5个位置的embedding会被考虑计算loss,同样,在预测的bottom-right embedding中也会有5个位置的embedding会被考虑计算loss。5个top-left的embedding和5个bottom-right embedding会进行两两配对,从而产生25对embedding,并计算loss。其中,属于同一对象的5对embedding(即true positive embedding pairs)的loss会使用pull loss公式计算,因为它们应该尽量相似;剩余的都不应该是同一对象的两个corner的embedding(即false positive embedding pairs),应使用push loss公式计算,因为它们应该尽量相异(即应该远离),此处有些人脸识别中contrastive loss的思想, loss公式如下,关于这个loss为什么有效,可以参考这篇博客。注意,此处每个配对的embedding应该属于同一类别,即它们位于同一embedding通道上,不同类别的embedding对计算误差也没有意义。


其中,是和的平均,论文中为1。

14

作者使用计算offset的损失,公式如下:


其中,为第11条计算的groud truth offset, 为模型预测的offset。与embedding计算损失一样,只对groud truth corner位置的offset计算loss。

15

结合第12、13和14条中的Loss得到最终的综合Loss:

其中,、和是各个任务Loss权重,论文中三个参数分别为0.1、0.1和1。

你可能感兴趣的:(Corner-based对象检测算法三连之——开山鼻祖CornerNet)