CornerNet算法-初识要点

简介

最近在学习目标检测方面的知识,然后cvpr2019上发布的一篇anchor-free机制的论文之后,anchor-free这个点挺火的,然后就想了解一下这篇最初引入anchor-free机制的算法CornerNet。看了知乎上一篇解释的很好很仔细的文章之后,记录一些自己的想法。想详细了解的建议去这里。

算法摘要介绍

目前的检测算法无论是one-stage的或者two-stage的都还是基于anchor机制提出来的,比如faster-rcnn、RetinaNet、yolo、ssd等等。这些anchor主要是用来定位框的位置,但是这些算法中都在anchor这个东西上面花了太多的代价了。
这种Anchor机制主要有两个缺点:

  1. 这些网络中往往都会生成非常多的anchor,例如RetinaNet就生成了100k左右的anchor,而这些anchor中大多数都是框不到目标的,因此大多数都是负样本,正样本极少,这就产生了正负样本不均衡的问题,也耗费了大量的计算。
  2. Anchor机制为原本就很复杂的网络又引入了很多超参数,而这些超参数的调整往往是非常繁琐的,增加了网络复杂程度。

创新点

基于上述问题,作者就提出了这篇新的算法,引入了anchor-free机制,不通过anchor来预测bounding box而是通过box的左上角和右下角坐标进行预测。如下两点:

  1. 借鉴了人体姿态估计中的bottom-to-top方法和top-to-bottom方法,这两个方法在这里就不具体介绍了,因为CornerNet的作者只是借用了由这个方法而引出来的一种模型hourglass module(滴漏网络),下面会重点介绍一些这个网络。在CornerNet中通过hourglass网络预测目标框的左上角的热点图、右下角的热点图和一个embedding vector map
  2. 另外一个创新点就是引入了corner pooling,作者没有使用max pooling,而是对每个点分别去水平和垂直方向的最大值相加,这个方法后面会仔细说的。
    在这里插入图片描述

模型框架

overview

在这里插入图片描述
可以看到模型首先是一个hourglass network,然后分别得到角点图分别代表左上角的角点图和右下角的角点图,维度是(C * H * W)的,C表示训练集中的类别总数,值的范围是0~1,即每个channel对应一个类别的角点图,各个点分别表示当前点是当前类别的左上角点(右上角点)的概率。紧接着是一个Corner Pooling,分别得到对应的Heat map、Embedding、Offsets。下面具体介绍。

Hourglass Network

Hourglass Module由Residual Module组成,如图
在这里插入图片描述
上述只是一个一阶的 Hourglass Module,而Hourglass Module是可递归的。看如下四阶的Hourglass Module
在这里插入图片描述
特征图大小变化如下:
在这里插入图片描述
可以看到,Hourglass首先是对输入通过最大池化(CornerNet中使用的是一个stride=2来降低分辨率)进行一次下采样,然后通过若干个Residual模块进一步的提取深层次的特征信息,再通过一次最近邻上采样还原到原输入尺寸再与之前低层次的信息进行连接操作,这样即融合了图片的低层次信息和高层次信息,同时还保证了图片的尺度不变,相当于是一次高保真的特征提取操作。

CornerNet中使用了两个Hourglass Module,并且还增加了训练中的监督。但是,没有将中间预测添加到网络中,因为他们发现这会损害网络的性能。作者将3×3 Conv-BN模块应用于第一个沙漏模块的输入和输出。然后,通过元素级的加法将它们合并,然后跟随一个relu和一个256个通道的残差块,将其用作第二个沙漏模块的输入。沙漏网络的深度为104。与许多其他最先进的检测器不同,作者只使用整个网络最后一层的特征来进行预测。

Detecting Corners

CornerNet的第一个输出是heat maps,也就是预测角点的位置。
Heat Map的维度是 CHW,C是训练集的类别个数,每个channel相当于一个类别mask,范围为0~1,分别表示各个点属于当前类别的角点的可能性,角点的损失函数如下:
在这里插入图片描述
基本上就是focal loss的改良版,Ycij表示的就是标签值,Pcij表示预测值。主要区别在于对于不是ground true的情况下,对不同情况下的负样本额外引入了权重值。论文中的解释是这样的,对于标签中的左上角点和右下角点,并不一定非得是这个点才会预测出正确的bounding box,其一定范围内的其他点也可以很好的预测出bounding box,如图:
在这里插入图片描述
红色的框是label标注的框,绿色的虚线框是在一定的偏移量下预测出来的,但是效果几乎不差。所以论文中值出,在初始训练网络的时候需要指定一个半径r,表示一个容许的范围,橘色圆圈就是根据ground truth的左上角顶点、右下角顶点和设定的半径值画出来的,半径是根据圆圈内的角点组成的框和ground truth的IOU值大于0.7而设定的,圆圈内的点的数值是以圆心往外呈二维的高斯分布设置的
e x p ( − ( x 2 + y 2 ) / 2 σ 2 ) , σ = 1 / 3 exp(-(x^2+y^2)/2σ^2),σ=1/3 exp((x2+y2)/2σ2),σ=1/3
所以在这种设置下,上述的损失函数就会对不同情况下的负样本角点产生不同的损失代价。

Offset

CornerNet的第二个输出是offset,这个值与yolo3中预测的offset虽然都是偏移量,但是意思完全不同,这里的offset主要是用来对下采样时的取整操作所丢失的精度信息作偏移。这样从原始的图像输入到最后的heat map产生的这个过程会累计误差,这些误差在预测小目标的时候往往是无法接受的。
在这里插入图片描述
这里的n表示从输入图像到响应特征图的缩小倍数。然后通过smooth L1损失函数监督学习该参数
在这里插入图片描述

Embedding Vector

CornerNet的第三个输出是embedding,对应文章中group corner的内容。
前面提到了模型会分别预测左上角的角点图和右下角的角点图,这两个图是分开独立预测的,而最终需要通过embedding vector来连接每一对角点形成最终的bounding box
具体步骤如下:首先CornerNet的第一个输出就是heat map,在这里我们已经得到了所有的角点预测信息,而在训练前,我们也已知了各个角点的标签信息,那么我们就可以根据预测的角点信息以及真实的角点信息计算出方差和均值,对于属于同一对的角点让他们的方差尽量低,对于不同对的corner则使刚刚求出来的均值做差取绝对值,尽可能优化使绝对值最大。这里是利用pull和push操作
在这里插入图片描述
公式中的 etk代表k个目标的左上角点的embedding vector,ebk代表k个目标的右下角的embedding ,ek代表均值。pull操作就是让相同目标的左上角点和右下角点的距离尽量下,push就是使不同目标的角点绝对值相差尽量大。这样进行优化之后,最终就会使得相同目标的角点信息的embedding vector基本趋于一致进一步用来进行分类。

最后的网络损失函数是上面的几个相加的形式:
在这里插入图片描述

Corner Pooling

这个点我个人是觉得非常赞非常有价值的。这里因为对于之前的预测中心点的模型,采用max pooling是没有问题的,因为max pooling通常是通过一个3*3的卷积,然后关注于中心位置,可以很好的适用与预测中心点,但是由于Corner Net需要预测的是角点信息,它并不关心目标的中心位置,那么max pooling就不是那么适用了。

那么可以思考一下,对于每个角点,它确定的都是两条边,以左上角为例,它确定上面的边和左边的边,那么对于这个边的位置的限制条件是什么,以上面的边来说那就是目标的最上方所到达的位置,所以最优情况下,上边的位置应该刚好在目标的最上方位置。这就是上边的限制,其余边的限制也是同理。

这里放在特征图上来思考,目标的最上方体现在特征图上就是一个特征点信息,而对于取最大值这个操作,是不是就是把这个特征点信息从原本的位置迁移到了角点上来。这样可以更好的帮助模型预测角点信息。下面可以通过图来体会一下:
在这里插入图片描述
以第一张图为例,左上角橘色点的信息是没有内容的,对于它而言真正有内容有价值的信息分别是它左边的帽子和下面拿着雪橇的手。而Corner Pooling的思想就是很好的把这两个真正有价值的信息通过一个取最大值的操作进行了转移,可以更好的预测角点。
具体的计算过程如下:
在这里插入图片描述

总结

这只是我自己对CornerNet初步的一些理解,其实还有很多疑惑以及没有弄明白的地方,有什么不对的地方希望各位指正,也可以在下方留言一起学习。后续应该还会进一步的学习这一系列的算法,包括最新的 CornerNet-Lite等等,有时间了会在更新。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值