CornerNet: Detecting Objects as Paired Keypoints论文详解

《CornerNet: Detecting Objects as Paired Keypoints》发表于ECCV2018

代码地址:https://github.com/princeton-vl/CornerNet

文章认为采用anchor进行目标检测的方式有两个不好的地方:第一,为了确保anchor能够尽可能的覆盖的所有的标注框,往往需要大量的anchor,而其中只有少部分是真正有效的,这样会导致训练时正负样本的不平衡和减慢训练速度;第二,anchor的方式需要引入各种超参数,比如anchor大小、比例、数量等。因此文章提出一种新的目标检测方式,不使用anchor来进行目标检测。文章使用左上角点和右下角点来表示检测框,所以文章提出的网络通过预测框的左上角点,右下角点和角点的嵌入向量(embedding vector)来得到最终的检测框。

下面来详细说明文章的原理

一、网络结构

网络结构如下图所示,可以看出文章采用的是16年用于姿态识别的网络hourglass作为主干网络。该主干网络提取出来的特征输入到两个模块中,一个模块用来预测左上角点,另一个用来预测右下角点。每个预测角点的模块都有自己的corner pooling,最终输出有角点对应的热图(heatmaps)、嵌入向量(embeddings)和角点的偏移信息。

1.png
1.1 hourglass网络

文章使用的网络由文章《Stacked hourglass networks for human pose estimation》提出,用来做人体姿态识别的任务。该网络是全卷积网络,由一个或者多个hourglass模块组成。一个hourglass模块先用一系列的卷积和maxpooling层对输入进行特征提取,同时提取出的特征会有下采样的效果,然后通过一系列的上采样和卷积操作使得特征图又慢慢变大。通过这些操作hourglass模块能将图片的局部信息和全局信息提取出来。通过多个hourglass的堆叠,网络可以更好的获取到一些高维信息,使得网络很适合用于物体检测的任务。因为特征图的先小后大,很像沙漏,网络因此而得名。

文章用了两个hourglass模块堆叠而成,且相对于原始的hourglass模块,文章做了一些小的修改。首先,文章用stride为2的卷积代替maxpooling操作。对输入的分辨率下采样5次,每次输出的特征通道数为(256,384,384,384,512)。在上采样的过程中应用了最近邻上采样接2个残差模块的方式(代码好像并没有,只是简单的上采样,然后和之前的卷积结果相加)。在与上采样相加之前之前的卷积结果会进过两个残差模块。在hourglass模块的中间,也就是512通道处有4个残差模块。输入hourglass之前,图片会进过一个7\times7stride为2的卷积和一个stride为2的残差模块。

同《Stacked hourglass networks for human pose estimation》类似,在两个hourglass模块的连接处,使用了内部监督(intermediate supervision),即将第一个模块的输入经过1\times1Conv-BN和第一个模块的输出也经过1\times1Conv-BN的结果相加后送给ReLU,得到的结果在经过一个残差模块送入第二个hourglass模块。这里大致的结构如下图所示,详细的实现请参考代码。

2.png

1.2角点检测

网络预测的角点输出是左上角点和右下角点的return结果。每种热图有C个通道(C为预测的类别数),热图大小和图片一样大为H\times W。输出的每个通道都是二值的mask图像,用来表示每个像素是否为角点。

对于每一个角点来说,只有一个点是正样本,其他都是负样本,但由于某些错误的点对得到的框仍能和真实的标注框有很高的重叠。所以在训练时靠近正样本的负样本有一定惩罚权重,即越靠近正样本的负样本受到的越小。惩罚权重是通过未归一化2D高斯分布(e^{-\frac{x^2+y^2}{2\sigma^2}})来赋值的。待减少惩罚的负样本,也就是上面所说的正样本附近的负样本(附近的定义就是负样本的位置使得得到的框与groundtruth的IOU小于0.3的点),且这些点是以正样本为中心一定半径内的点,如下图所示。而高斯分布中的\sigma就是半径的1/3。

3.png

因为在全卷积的网络中,往往会有卷积的featuremap的大小比原图小的情况,因此对于原图中坐标为(x,y)的点,对应到featuremap中的坐标为(\lfloor \frac{x}{n} \rfloor, \lfloor \frac{y}{n} \rfloor),其中n为下采样的因子。当我们将特征图上的点还原到原图时会导致精度的损失。为了解决这个问题网络还会预测还原至原图需要的偏移量。偏移量的gt计算如下所示:
o_{k}=\left(\frac{x_k}{n}-\lfloor\frac{x_k}{n}\rfloor, \frac{y_k}{n}-\lfloor\frac{y_k}{n}\rfloor\right)
上式中,o_{k}表示偏移量,(x_k,y_k)表示原图的坐标点。

1.3 角点配对(grouping corners)

这部分原文写了几段,包括的loss是怎么计算的,先不管loss的计算,先要弄懂文中写的embedding是什么。
更广义的来说,用来进行角点配对的embedding指的是网络输出的featuremap,这个featuremap大小与预测角点的featuremap大小一样。在对应角点的位置处的feature就认为是这个角点的embedding,文章用的embedding是1维的,也就是说一个角点对应一个预测值,当预测的左上角点和右下角点的embedding值很小时,认为这两个预测点是属于同一个框的。

1.4 Corner Pooling

这个是文章为了更好的预测角点位置提出的一个新的pooling方法。拿左上角点来说,为了更好的判断featuremap中的某一点是左上角点,它需要以它当前的位置向右水平扫视,和向下竖直扫视来得到一个值(可以认为是左上角点的响应值)。对于一张大小为H\times W的特征图,对于特征图上的点(i,j),corner pooling的计算方式为:
t_{i,j}=\left\{ \begin{array}{lr} max(f_{t_{i,j}}, t_{(i+1)j}) \quad if \quad i <H \\ f_{t_{Hj}} \quad otherwise \end{array} \right.
l_{i,j}=\left\{ \begin{array}{lr} max(f_{t_{i,j}}, l_{i(j+1)}) \quad if \quad j <W \\ f_{l_{iW}} \quad otherwise \end{array} \right.
右下角点同理,提取到的两个方向的最大值后相加就是pooling的最终结果。这种pooling方法能够采用动态规划的方式高效的计算,如下图所示

4.png

pooling的最终结果会参与到角点的位置估计、角点的偏移量估计、角点的embedding计算中去,如下图所示


5.png

二、 loss的计算

本文有几种loss,一个是角点估计的loss,一个是角点偏移位置估计的loss,一个是角点组合估计的loss。下面来单个说明一下。

2.1 角点位置估计的loss计算

角点位置估计的loss计算,该loss是focal loss的变式:
L_{det}=\frac{-1}{N}\sum^{C}_{c=1}\sum^{H}_{=1}\sum^{W}_{j=1}\left\{ \begin{array}{lr} (1-p_{c_{ij}})^{\alpha}log(p_{c_{ij}}) \quad if y_{c_ij}=1 \\ (1-y_{c_{ij}})^{\beta}(p_{c_{ij}})^{\alpha} log(1-p_{c_{ij}}) \quad otherwise\end{array} \right.

上式中,N是一张图片中物体的个数,\alpha\beta是两个超参数这里分别取为2和4。p_{c_{ij}}是在预测map中对于c类物体在坐标(i,j)下的概率值,对应位置的gt为y_{c_{ij}},这里注意的是y_{c_{ij}}是根据高斯分布和标定真值求出来用于训练的值(1-y_{c_{ij}})用来作为真值附近的负样本的惩罚项。

2.2 角点位置偏移的loss计算

上面说到由于卷积下采样的操作会产生一定的偏移现象,偏移量用o_{k}表示,偏移量的loss计算采用smooth L1 loss表示:
L_{off}=\frac{1}{N}\sum^{N}_{k=1}SmoothL1Loss(o_{k},\hat{o}_k)

其中o_{k}表示真值的偏移,\hat{o}_{k}表示预测的偏移量。

2.3 角点组合估计的loss

上面提到了角点组合预测用的是embedding值的距离,而embedding值本文用的是1维的,可以认为网络对于每个预测点输出的embedding值是一个值,对于k类物体来说左上角点的embedding值用e_{t_k}表示,对于右下角用e_{b_k}表示,loss计算如下:
L_{pull}=\frac{1}{N}\sum^{N}_{k=1}\left[(e_{t_k}-e_{k})^2+(e_{b_k}-e_k)^2\right]

L_{push}=\frac{1}{N(N-1)}\sum^N_{k=1}\sum^{N}_{j=1,j\neq k} max(0,\delta-|e_k-e_j|)

其中e_k表示e_{t_k}e_{b_k}的均值,\delta本文设置为1.这里一个叫pull loss为了将两个一组的点对中每个点对平均值距离越近,从而loss更小。一个叫push loss,为了将不是一组的点对距离更远从而loss越小

根据上面各个loss,文中总的loss计算为:
L=L_{det}+\alpha L_{pull}+\beta L_{push} + \gamma L_{off}
文中,\alpha\beta都设为0.1,\gamma设为1。

到这里文章原理基本介绍完了,对于一些实验的结果和分析详情可以查看原文。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容