本文主要用于介绍Hei Law团队于2018年提出的一种新的目标检测算法CornerNet。本笔记主要为方便初学者快速入门,以及自我回顾。
论文链接:https://arxiv.org/pdf/1808.01244.pdf
Github源码地址:https://github.com/umich-vl/CornerNet
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
我们提出了一种新的目标检测算法,称为“CornerNet”。该算法通过单一的卷积神经网络预测一组关键点(左上角和右下角)来确定物体的包围盒。因为我们是直接去预测的关键点,所以无需再跟其他单阶段模型一样事先设计一系列的anchor box。另外,我们还提出了一种新的corner pooing来提升网络对于关键点预测的准确性。在MS COCO上,我们的Corner Net表现的比其他单阶段的目标检测算法都要优秀。
------------------第二菇 - 核心思想------------------
2.1 Anchor Box的缺陷
先来聊一下Anchor机制缺陷。主要包含2方面,
1)数量巨大,DSSD中超过40k,RetinaNet超过100k。数量巨大不仅仅会影响时间,最重要的是会造成严重的数据不均衡问题。虽然有一系列巧妙设计的损失函数在一定程度上规避这个问题,但依然无法完全避免。
2)可调参数的增大,加大了网络的训练难度(These include how many boxes, what sizes, and what aspect ratios)。
因此,本文提出的Corner Net其实就是想规避掉对Anchor的使用。简单来讲,整一套Corner Net就是用一套卷积神经网络,分成2个分支去分别预测左上角点和右下角点,每一个预测出的点都会有一个对应的embedding vector,而整个网络就要去训练使得左上角点和右下角点预测出的embedding vector 相似,于是就能够组合成一个bbox。因此,整体的网络架构十分简单,如下图所示,
CornerNet网络架构.jpg当然很有细节,接下来,我们一一细聊。
2.2 Detecting Corners
如上图所示,整体的网络架构会预测2组热图,一组用于预测左上角点,一组用于预测右下角点,每一组热图()都有 个通道数,其中就是类别的个数。每一个通道其实就是一个二分蒙版(binary mask),用于预测当前位置是否是某一个类别的角点。
值得一提的是,用于训练的GT对于一个类别往往只有1个位置是正样本,其余的位置都是负样本。因此,这里面就会存在着巨大的样本不均衡的问题。为了解决这个问题,作者通常会在正样本边上圈定一个范围,在这一圈范围内的点的损失计算会被减少( we reduce the penalty given to negative locations within a radius of the positive location)。之所以这样是合理的,是因为靠近真值点的部分依然能够生成一个合理的包围框来检测出物体,如下图所示,
示意图.jpg文中解释到用于圈定这个范围的方法就是,在这个范围的内点,能够生成的包围盒与真实包围盒的IOU大于一定的阈值(实验设置0.3)。
至于减少损失的具体数值,是用一个高斯分布来拟合的,
中心点就是真实的位置,就是半径大小的。
具体的损失计算如下,假设是在位置预测出的属于类别的分数,是用上面这个公式计算得出的“ground-truth”,那么套入进Focal Loss(不了解的可看我之前的笔记)的公式,我们能得到损失函数为,
损失函数.jpg就是图片中目标的个数,就是上面提到的用于减少损失的。
2.3 Location Offsets
很多时候,我们在提取特征的过程中,尤其是池化操作,都会有像素的误差产生,越到后面,产生的偏差对应到真实图片上就会有很大的误差,尤其是对于小物体的定位来说,经常会因为量化操作(取整),而最终导致定位的不准确。因此,本文提出的网络还特地去预测了一个offset,用于细微调节角点的位置,
offset预测.jpg值得一提的是,我们预测的偏差调节对于所有的类别的左上角点和右上角点均有效(可能就是一起训练的,共享参数,并不需要区分),所以最后的损失函数也就是,
偏差损失函数.jpg2.4 Grouping Corners
一张图片中往往会有很多目标需要去预测,因此我们也得有一个机制用于将左上角点和右下角点进行匹配预测。本文的做法就是对于每一个角点,我们都会去预测一个embedding vector,然后两两计算距离。这个向量本身的值并不重要,关注的就是计算出的距离。
训练的时候,采用的损失函数如下,
距离损失函数.jpg其实蛮好理解的,就是希望预测出的俩个值近可能的相近,就是希望不同类别预测出的值尽可能的远,这样才能制造出差异性~
2.5 Corner Pooling
角点示意图.jpg如上图所示,我们可以发现其实很多角点的位置并没有什么明显的特征,相反在其水平线或者是纵轴线上来看,却都有目标的边缘特征,因此,本文作者提出了一种新的池化方法,就是Corner Pooling。
这种池化方法其实很简单,就是在横竖俩个方向上分别取极值,然后再将其相加,直接看如下的示意图,
Corner Pooling示意图.jpg论文中还有一张代入具体数值的示意图,
Corner Pooling示意图2.jpg不知道能否看懂,相加的操作应该都能看懂,。看一下第二张图的第一排,,看那个方向比如0对应的就是,那自然对应的位置的值就是。
然后再贴一张预测时候的架构图,
预测架构图.jpg其中虚线框就是执行上面说的Corner Pooling。具体的网络架构的改进就是对残差模块进行升级,将其改为2个的卷积,再加1个Corner Pooling层。
2.6 Hourglass Network
肩负基础特征提取的网络(backbone)就是在人体关键点预测上很流行的Hourglass Network,不熟悉的同学可以看我的另一篇笔记。本文对其做了一点点改进,就是不再采用最大池化操作来降维,而是将步长改为2。其他有关网络的细节这里就不展开了,有兴趣的还是看源代码更深刻。
值得一提的就是,对于预测出的点,都会做NMS(non-maximal suppression),最终左上角点和右下角点分别只有100个入选,然后再计算后面的embedding等,用于确定最后的bbox。
其他有关整个网络的训练细节及结果这里就不多说了,总之个人认为是一次比较大胆的尝试,对目标检测这个问题有一个新的思路的转变,对于这个领域的推动也是极好的~
------------------第三菇 - 总结------------------
3.1 总结
到这里,整篇论文的核心思想已经说清楚了。本论文主要是提出了一种用于目标检测算法的新的思路,通过直接预测左上角点和右上角点来确定目标的bbox。作者还巧妙的设计了一种新的Corner Pooling方法,并随之嵌套进整个Corner Net,并实验证明了该网络的可行性,为后续发展奠定了基础
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,自己对整个CornerNet网络架构的理解。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁
网友评论