《CenterNet: Keypoint Triplets for Object Detection》发表于CVPR2019
代码地址:https://github.com/Duankaiwen/CenterNet
它是之前一篇《CornerNet: Detecting Objects as Paired Keypoints》文章的改进版,与CornerNet相同的是它们都是one-stage的方法,没有引入anchor的操作。CornerNet是通过预估框的左上角点和右下角点来得到物体的预测框,但centernet认为只预测物体的角点位置并没有很好的利用框内的信息,这样容易导致误检。所以文章提出一种新的检测方式,通过预测出物体的左上角点右下角点和物体的中心点,进而来预测出物体的位置。
下面来看看文章的具体做法
一、网络结构
网络结构和CornerNet一样,采用的是hourglass作为backbone,整体流程如下图所示
1.png
关于backbone的问题不在具体描述,可以参考《CornerNet: Detecting Objects as Paired Keypoints论文详解》
,或者查看作者公开的代码。下面只讨论一下文章的新思路。
1.1 使用三点表示一个检测框
文章采用的是左上角点,右下角点,中心点表示物体的检测框,所以文章的处理流程与CornerNet不太一样。但是角点和中心点的表示和估计方法和CornerNet一致,这里不重复说明,可以先看看《CornerNet: Detecting Objects as Paired Keypoints论文详解》。
处理流程描述如下:
- 根据网络的输出,选取分数在前k的中心预测点
- 根据中心点的offset的估计,将中心点在原图中的精确定位计算出来
- 根据预先定义的物体框中心区域,查看中心区域里是否包含上面预测的中心点。(这里提到的中心区域下面会详细说明)
- 如果满足3)条件,就保留预测的物体框。
上面提到一个中心区域的问题。看看如何定义这个中心区域,因为对于大框来说预测的中心点更大概率能落在框的中心区域,对于小框来说落在中心区域的概率更小。为了更好的适应框的大小,预测的中心点保证大小框的概率差距不那么大,这里做了如下操作。类似于roi pooling,将预测的框按照和两种情况等分,其中边框小于150的用划分,大于150的用划分。这里说的150,代码采用的是边框的长宽相乘是否大于22500来表示。
划分操作如下图所示。
1.2 丰富角点和中心点的信息
对于角点和中心点的信息丰富操作采用的是如下图的方式
3.png
中心点
通过backbone的输出的中心点预测的featuremap,为了更好的确定哪些是真的得中心点,文章提出了center pooling,如上图的a所示,通过将featuremap上的预测点在其水平和竖直方向都找到最大值,然后将两个方向的最大值相加作为预测中心点的值。
角点
不同于CornerNet,文章提出了cascade corner pooling。如上图的b和c,类似于CornerNet先从预测的角点处找到边界上的最大值,然后根据边界上的最大值在相应的方向再次寻找框内部的最大值,最后将两次的最大值相加得到角点的最终值。上面说的相应方向指的是,对于上边界、下边界、左边界、右边界的最大值点来说,分别搜索的方向是竖直向下、水平向右、竖直向上、水平向左。
从上面的描述可以可以看出这些操作可以很容易的通过CornerNet中提出的Corner pooling来扩展。通过原来的Corner pooling扩展出的两种新的pooling方式如下图所示
4.png
二、损失函数
基本和CornerNet相同,只是多了一个中心点的预测loss和中心点位置偏移的loss计算。公式表示如下:
其中和是focal loss,和同CornerNet是计算角点匹配提出来的loss,和使用的是l1 loss,上式中的分别取0.1、0.1、1。
原理基本就这些,更多的实验结果可以查看原文。
网友评论