CenterNet(Objects as Points):极简Anchor-free目标检测框架

论文地址:http://arxiv.org/abs/1904.07850

GitHub地址:https://github.com/xingyizhou/CenterNet

目录

0、写在前面

1、动机

2、网络结构

3、损失函数

4、实验结果

5、总结


0、写在前面

目标检测通常将目标识别为与坐标轴平行的一个方框。大多数目标检测器都是先列出所有可能的目标位置边框,然后逐个进行分类,这是一种浪费、低效且需要额外后处理的方式。本文提出了一种完全不同的方法:将目标建模为一个点(边框的中心),首先使用关键点估计找到中心点,然后回归所有的其他属性,比如尺寸、3D位置、方向,甚至是姿态。该基于中心点的方法,称为CenterNet,是一种端到端可微的、简单、快速且比Anchor-based模型准确率更高的方法。CenterNet在coco数据集上达到了最佳的速度-性能平衡:142FPS时AP28.1%,52FPS时AD37.4%,多尺度测试时1.4FPS、AP45.1%。此外,同样的方法在KITTI中的3D边框估计、COCO中的人体关键点估计任务上也适用。此方法可与复杂方法一比高下,且可以实时运行。

CenterNet与ConearNet、FCOS类似,均是基于关键点的Anchor-free目标检测框架,不同之处在于其将关键点设定为目标中心点,其他属性通过回归获得,且由于只有一个点,所以不需要对检测到的关键点进行分组。由于这种特性,其框架极其简单,且无NMS后处理(仅通过heatmap峰值topK去重,和NMS功能类似但更快)。与之前模型的对比如图1:

1、动机

之前的Anchor-based的模型,不管是两阶段还是一阶段,都是通过枚举所有可能的目标框,然后对这些目标框进行分类(是属于某个类别还是属于背景),比如RCNN系列,YOLOv2及其之后的系列(YOLOv1属于Anchor-free)。这种枚举并逐一分类的方式是比较浪费计算资源的,因此,本文提出了一个简单有效的建模方法——将目标建模为一个点,其宽高视为该点的属性,如图2所示。而由于这种建模方式,其可以扩展到很多其他任务,比如3D目标检测、人体姿态估计等。

2、网络结构

对于目标检测任务来说,将目标建模为一个点,那么其任务就成了关键点检测。因此,对于一张输入图像,其通过一个ConvNet得到一个heatmap,而heatmap中的峰值则为其检测到的关键点,然后其他属性通过接一个回归头获取。原文没有给出模型结构,但是很简单,就自己画了一个:

简单解析一下:

对于一张图像作为输入,假设其宽高尺寸为N*N(这里忽略通道数,下同),经过一个backbone(如ResNets、DLAs、Hourglass等),就得到了一个分辨率降低32倍的feature maps;

然后需要一个上采样模块,将分辨率恢复到原图的1/4倍,也即进行了8倍上采样;

最后接上三个head:wh、heatmap、offset,分别代表宽高、中心点热力图、中心点偏移。

可以看出,网络非常简单,只需要在选个backbone,然后添加几层转置卷积将分辨率上采样8倍,最后接上三个head即可。

对于backbone,作者提供了三种选择:ResNets、DLAs、Hourglass,其性能对比如表1:

上采样过程是通过转置卷积,也即反卷积来实现的,反卷积和普通卷积的区别可以参考这篇博客

对于三个head,其输出的feature map尺寸都是N/4 * N/4,但是通道数不同:wh和offset都是2通道,heatmap是C通道(C代表类别数)。wh这个head用于回归目标的宽和高;offset用于回归中心点的偏移(由1/4恢复至原分辨率时造成的误差),不影响检测,只会让最终的box与GT稍有偏移;heatmap则是用于获取目标中心点检测的结果了,需要利用topK操作进行去重,得到一些峰值点,各峰值点代表了目标中心点。

3、损失函数

heatmap损失函数:

设输入为:I \in R^{W \times H \times 3},则预测的heatmap为:\hat{Y} \in [0,1]^{\frac{W}{R} \times \frac{H}{R} \times C},其中,R为输出步长(作者使用的是4),C是类别数。

对于I中的任一关键点p \in \mathcal{R}^{2},其对应的输出步幅为R的关键点为\tilde{p}=\left\lfloor\frac{p}{R}\right\rfloor。点p\rightarrow(x, y)对应的热力图通过高斯公式进行计算:Y_{x y c}=\exp \left(-\frac{\left(x-\tilde{p}_{x}\right)^{2}+\left(y-\tilde{p}_{y}\right)^{2}}{2 \sigma_{p}^{2}}\right),其中,\sigma_{p}代表目标大小标准差,是自适应的。

于是,heatmap的损失使用修改后的focal loss定义如下:

L_{k}=\frac{-1}{N} \sum_{x y c}\left\{\begin{array}{cl} \left(1-\hat{Y}_{x y c}\right)^{\alpha} \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^{\beta}\left(\hat{Y}_{x y c}\right)^{\alpha} & \\ \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } \end{array}\right.

offset损失函数:

 α和β是损失函数的超参,作者使用的是2和4。 

为了弥补由于输出步长引起的偏移误差,设置了一个偏移量损失函数。设offset的输出为:\hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2},则损失函数定义为:

L_{o f f}=\frac{1}{N} \sum_{p}\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right|

wh损失函数:

对于一个目标k,设其边框坐标为:\left(x_{1}^{(k)}, y_{1}^{(k)}, x_{2}^{(k)}, y_{2}^{(k)}\right),则其中心点为:p_{k}=\left(\frac{x_{1}^{(k)}+x_{2}^{(k)}}{2}, \frac{y_{1}^{(k)}+y_{2}^{(k)}}{2}\right),其回归的尺寸为:s_{k}=\left(x_{2}^{(k)}-x_{1}^{(k)}, y_{2}^{(k)}-y_{1}^{(k)}\right)

则损失函数定义为:L_{\text {size }}=\frac{1}{N} \sum_{k=1}^{N}\left|\hat{S}_{p_{k}}-s_{k}\right|

那么,总的损失函数就是:

L_{d e t}=L_{k}+\lambda_{s i z e} L_{s i z e}+\lambda_{o f f} L_{o f f}

其中,\lambda_{s i z e}\lambda_{o f f}分别代表尺寸和偏移量损失的权重,作者设的是0.1和1。

4、实验结果

5、总结

CenterNet的创新之处,在于将目标建模为一个点,然后将其宽高作为回归的属性。如此一来, 直接应用关键点检测网络加上检测head即可作为目标检测来用,并可以方便扩展到各类其他任务。该框架简单、有效,且部署方便(方便转到TensorRT等)。

猜你喜欢

转载自blog.csdn.net/oYeZhou/article/details/113350632