CornerNet论文简析

0 Links

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

1 论文标题

在这里插入图片描述
第一,CornerNet是一个AnchorFree的网络,为什么不使用AnchorBox呢?

因为AnchorBox具有以下两个缺点:

①设置大量AnchorBox后会导致正负样本严重不均衡,效果差,效率低。

②AnchorBox会引入大量的超参数(如AnchorBox的形状、尺寸、个数)和设计技巧,如果是多尺度预测将会变得更加复杂,这是由于每个尺度都需要独立设计。

第二,CornerNet是将目标检测作为一对关键点的检测,也就是左上角点和右下角点。这里作者是参考了人体姿态估计(pose estimination)的Bottom-Up framework的方法,经过Top-Left和Bottom-Right这两个模块后得到三个输出,最后在得出BoundingBox。

知道个大概后,先提出以下5个Questions:

在这里插入图片描述

2 整体流程图

在这里插入图片描述
我们先从大致流程图入手,一步步分析,找到问题的答案。

从图中可以看出图片输入后经过一个卷积网络,然后再进入Top-Left Corners和Bottom-Right Corners,同时输出Heatmaps和Embeddings。Heatmaps的作用是预测所有左上角点和右下角点的位置,Embeddings的作用是将属于同一目标的两个角点配对。

在这里插入图片描述
再看这张更加细致的图。图片进入主干网络(Stacked Hourglass Networks),内含两个沙漏模块,然后分成两路,一路进入Top-left Corners,这一整个模块要先经过Corner Pooling后有三个输出,Heatmaps、Embeddings和Offsets。另一路进入Bottom-right Corners,也和Top-left Corners类似。

3 backbone–Hourglass网络结构图

在这里插入图片描述
首先,这是单个的Hourglass模块,可以看出它像沙漏一样是中心对称的。原始图片先经过预处理,在进入主干网络。

原始的图片是511 x 511 x 3的,经过预处理后缩小了4倍。具体是先经过一个kernel为7 x 7的卷积核(stride=2,padding=SAME,channel=128),然后再经过一个stride=2的残差块。这样输入Hourglass的就是128 x 128 x 256,然后经过两个Hourglass模块后输出 128 x 128 x 512的特征图。从输入到输出分辨率并没有变化,这是由于输入先经降采样提取各层次的特征后,又经上采样恢复原来的分辨率,在这同时还将特征与原来同层次的相融合。

4 Hourglass初级模块–Residual Module

接下来将Hourglass Network分解,首先是它最基础的模块–Residual Module,即残差模块。
在这里插入图片描述
如上图所示,残差模块由两路组成,上面一路卷积路,由三个kernel不同的卷积层串联而成,其间还以BN和ReLU相连。下面一路为跳级路,只包含一个kernel=1的卷积层。所有卷积层的stride为1,padding为1,不改变数据尺寸,只对数据深度(channel)进行变更。

在这里插入图片描述
上图是CornerNet中具体的Residual模块的参数,三个kernel分别为3、3、1(其中一个是skip跳级路的)。

在这里插入图片描述
Residual模块是这样前向传播的。

5 四阶Hourglass子网络

在这里插入图片描述
上图是更加细致的一个Hourglass网络。每个绿色表示一个残差块。可以看到输入到输出只有channel改变了。

6 Corner Pooling

在这里插入图片描述
从两个Hourglass出来后的特征图会经过Corner Pooling处理。上图是top-left的corner pooling,它是将行和列的最大值“推”到左上角,先从下至上遍历,再从又向左遍历,最后相加得到输出。同样bottom-right也类似,它是从上至下,从左到右遍历,将最大值推到右下角,最后也相加。

在这里插入图片描述
上面的图(Top-left Pooling)能很清楚的展现Corner Pooling的过程。

具体就是遇到比前一个大的数,就会把较小的数覆盖掉。输出的红框内是左边两红框内的值直接相加得到的。

7 Top-Left Corners

在这里插入图片描述
这张图是Top-Left Corners的处理过程。经过Corner Pooling后再经3 x 3的Conv-BN后与经Backbone出来的经过1 x 1Conv-BN层的特征再次融合,最后会有三个输出。(Bottom-Right Corners也一样)

Heatmaps:预测角点位置,用C x W x H的特征图表示,C为目标的类别(无背景类),这个特征图的每个通道都是一个mask,mask的每个值表示该点是角点的分数。

Embeddings:将角点配对,如果一个左上角点和一个右下角点属于一个目标,那么它们的embedding vector之间的距离应该很小。

Offsets: 输出从输入映射到特征图的误差信息。

8 Loss

在这里插入图片描述

这是总的Loss,由三部分组成,如图所示。

8.1 Heatmaps Loss

在这里插入图片描述

如图,值得注意的是,ycij是对应位置的ground truth,当ycij=1时,其损失函数为focal loss(α用来控制难以分类样本的损失权重),而对于其他情况,ycij表达式如下:

在这里插入图片描述
这是由高斯函数计算的值,因此距离ground truth较近的(i,j)点的ycij值接近于1,这部分通过β控制权重。

在这里插入图片描述
为什么对不同负样本点的损失函数采用不同的权重呢?

如上图,红框为ground truth,而绿框为预测框,可见这两个框已经十分接近了,因此对于这样的预测框要有一定的权重的损失返回。

而橘色的圆圈是根据gt的左上角角点、右下角角点和设定的半径画出来的。半径是根据圆圈内角点组成的框和gt的IoU值>0.7设定的,且圆圈内的点自圆心向外呈二维正态分布。

8.2 Embeddings Loss

在这里插入图片描述
embeddings loss由两部分组成,分别是L pull(缩小属于同一目标的两角点vector的距离)和L push(扩大不属于同一目标的两角点的vector的距离)。

8.3 Offsets Loss

在这里插入图片描述
Offset是在向下取整计算时丢失的精度信息。这尤其影响小尺寸目标的回归。

在这里插入图片描述
Faster RCNN中的ROI Pooling也有类似的精度丢失问题,所以SmoothL1Loss函数监督学习offset参数。

关于SmoothL1Loss函数

L_2(x)=x^2\tag{1}

L_1(x)=|x|\tag{2}

\mathrm{smooth}_{L_1}(x)= \begin{cases} 0.5x^2& \text{if } |x|<1\ |x|-0.5& \text{otherwise} \end{cases}\tag{3}

L1是绝对值函数,下方有个尖角,L2是二次函数,将这两函数融合成smooth L1函数。
smooth L1在 x 较小时,对 x 的梯度也会变小,而在 x 很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。 smoothL1 完美地避开了 L1和 L2 损失的缺陷。其函数图像如下:

img

由图中可以看出,它在远离坐标原点处,图像和 L1 loss 很接近,而在坐标原点附近,转折十分平滑,不像 L1 loss 有个尖角,因此叫做 smooth L1 loss。

另外,其实smoothL1函数是Huber Loss函数的特殊情况。统计学中,Huber损失是用于鲁棒回归的损失函数,与平方误差损失相比,对数据中的游离点较不敏感。 也有时使用分类的变体。

9 Q&A

这样,最开始的五个问题也得到了解决:

在这里插入图片描述

10 Reference

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值