CenterNet:Objects as Points--无锚框(anchor-free)系列的目标检测算法

简介

看了很多关于CenterNet:Objects as Points的博文,感觉大多都是将论文中的公式和内容翻译了一遍,所以在通读了论文之后,决定用通俗易懂的语言来介绍给大家,有什么不同观点欢迎讨论,下边进入正题。

论文地址:https://arxiv.org/pdf/1904.07850.pdf
发布时间:2019.4.16
机构:UT Austin,UC Berkeley
代码:https://github.com/xingyizhou/CenterNet

有两个不同CenterNet目标检测算法但是有相同的名称,一个是CenterNet:Objects as Points,另一个是CenterNet:Keypoint Triplets for Object Detection,都是2019年的比较新的目标检测算法,在这里总结的是第一种Objects as Points。第二种CenterNet是完全基于CornerNet改变而来的,在今后更新的博文中会介绍
CenterNet目标检测属于anchor-free系列的目标检测,相比于CornerNet做出了改进,使得检测速度和精度相比于one-stage和two-stage的框架都有不小的提高,尤其是与YOLOv3作比较,在相同速度的条件下,CenterNet的精度比YOLOv3提高了4个左右的点
CenterNet:Objects as Points--无锚框(anchor-free)系列的目标检测算法_第1张图片
CenterNet不仅可以用于目标检测,还可以用于其他的一些任务,如姿态估计或者3D目标检测等等,但是这篇文章重点说的是其对目标检测的部分,模型实现了速度和精确度的最好权衡,以下是其性能:MS COCO dataset, with 28:1% AP at 142 FPS, 37:4% AP at 52 FPS, and 45:1% AP with multi-scale testing at 1.4 FPS

网络结构

CenterNet提到了三种用于目标检测的网络
1.Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS
2.DLA-34 : 37.4% COCOAP and 52 FPS
3.Hourglass-104 : 45.1% COCOAP and 1.4 FPS
每个网络内部的结构不同,但是在模型的最后都是加了三个网络构造分别来输出80个类(文中用的数据集为80类)的置信度、长宽的预测值以及中心点坐标的偏置值

检测过程

论文中用了一堆公式来描述检测过程,整个检测过程的设计简单而巧妙,其实理解以后主要思想可以通过以下过程来描述:
用骨干网络得到图片的特征图之后,通过高斯核函数将关键点分布到特征图上,高斯核函数分布后的值在0~1之间,为了便于理解,下图是高斯核函数分布在特征图后的结果如下所示:
在这里插入图片描述
可以看出通过高斯核函数分布后的特征图,目标中心点的位置值为1,也就是说值越大的地方,越有可能是目标中心点,根据这一思想在得出高斯核分布的值之后,在整个特征图上选出100个大于或者等于周围8个相邻值的点作为初步预测的中心点,然后计算每个预测的中心点对应的80个种类的置信度,和中心点偏置预测值和框的长和宽,最后选择置信度大于0.3的作为最后的预测结果,其余的全部抛弃,这种方法有效的避免了锚框设计的繁琐以及避免了要计算IoU阈值的非极大值抑制的筛选。

损失函数设计

在这里插入图片描述
损失函数由三部分组成,分类损失,框的尺寸损失和中心点偏置损失

Lk为:

CenterNet:Objects as Points--无锚框(anchor-free)系列的目标检测算法_第2张图片
采用Focal loss,其中 α 和 β 是focal loss的超参数,论文实验中两个数分别设置为2和4, N是图像中的关键点个数,除以N主要为了将所有focal loss归一化

在这里插入图片描述
在这里插入图片描述
采用L1loss,设计这个损失的原因是因为,图像下采样时,GT的关键点会因数据是离散的而产生偏差,对每个中心点附加预测了个局部偏移,所有类别 c 共享同个偏移预测

在这里插入图片描述
在这里插入图片描述
同样采用L1损失,其中SK为真实尺寸包括长和宽,另一个为预测尺寸也包括长和宽

效果验证


采用论文中训练好的DLA骨干网络,GeForce GTX 1080 Ti的GPU进行验证,速度为每张图38ms到40ms,检测速度还是很快的,准确度也还行

总结

这篇文章总的来说结构非常的清晰简单,效果也非常的不错,是一篇非常不错的文章。但是其实在论文中是没有提到用分类置信度大于0.3来筛选的(也可能是我没看到), 我是在代码中看到的这么个筛选过程,可能作者也觉得这么鲁莽的选择一个0.3为阈值不太好,所以并没有提。这也可以作为这个算法的一个优化方向了,如果有合理的阈值选择方法,相信精确度会更高一些
我也正在用自己的数据集来训练这个网络,但是结果还没有出来,结果出来之后可能会补上结果

你可能感兴趣的:(CenterNet:Objects as Points--无锚框(anchor-free)系列的目标检测算法)