论文阅读 CenterNet: Keypoint Triplets for Object Detection
论文地址:
代码地址:https://github.com/Duankaiwen/CenterNet
arXiv 20190417,Kaiwen Duan,中科院计算所
1.背景
基于关键点的目标检测CornerNet:
CornerNet将目标检测转化为检测物体的左上角和右下角两个顶点(如上图),开始了anchor-free的时代。
同时,CornerNet存在的问题:
- 通过两个角点配对来确定目标框,没有anchor限制,对算法性能要求高;
- 由于上面的缺陷,在缺乏全局信息的情况下,会产生很多错误配对
- 角点对边界框敏感,也就导致在背景处生成很多角点
如图2,对cornernet取top 100个候选框(蓝色为GT;红色为预测框),可以发现CornerNet产生大量错误的预测框,很多通过长宽比就能过滤掉。
为了说明上述问题,量化CornerNet的问题,作者提出FD(False discovery rates),错误边界框所占的比例,即:FD = 1 - AP。通过图3,FD5 = 32.7% 表示100个边界框中有32.7个边界框和ground-truth的IoU<0.05,说明CornertNet的候选框还是挺不靠谱的。
2. Our approach
2.1 主要思想
本文在CornerNet基础上,将目标转化为三个点:左上角+右下角+中心点。
原理:如果预测的边界框与ground truth有较高的IoU,则中心关键点预测出相同类别的概率要高,反之亦然。
思路:
- 预测目标框,即左上角和右下角点;
- 计算目标框的中心区域;
- 判断目标框的中心区域是否含有中心点,有则保留,否则删除目标框
如图4:左边马产生两个候选框,大框的中心区域不包含中心点,所以被剔除,只留下一个候选框(右图)
2.2 网络结构
网络结构和CornerNet相似:
主干网+两个分支:
- 主干网都是hourglass;
- Cornert的分支:cornert + embedding + offsets;上面Cornert的分支和cornernet原文的一样,只是把corner pooling 换成 cascade corner pooling;
- Center分支:生成中心点的HeatMap;采用center pooling。
实现步骤:
4. 根据cornertnet分支选取top k个目标框;
5. 根据center分支选取top k个中心点;
6. 将k个中心点映射回原图;
7. 计算k个目标框的中心区域;
8. 判断每个目标框的中心区域是否含有中心点,有则保留,否则删除目标框
2.3 怎么定义中心区域?
中心区域大小?
太小:无法召回正确的小目标框;
过大:无法剔除错误的大目标框。
本文提出一种自适应的方法:n是奇数。
其实,就是将候选框分成n*n个格子,取中间那个格子作为中心区域,本文n的设置:对于边界框小于150的设置n为3,大于150的设置n为5。
2.4 网络改进
引入两个模块:
- Center pooling:针对中心区域;
- Cascade corner pooling:针对角点
回顾下Corner pooling: - 做水平方向从右向左的max pooling得到水平方向的特征图
- 做从下到上的max pooling得到垂直方向的特征图
- 将这2个特征图element-wise相加,得到最终的pooling 结果
Center pooling:每个点的值 = max(水平点) + max(垂直点)
实现方式:水平corner pooling + 垂直corner pooling
Cascade corner pooling:
- 沿着边界寻找边界上的最大值;
- 沿着最大值的位置向里看,找到内部的最大响应值;
- 将两者相加
实现方式:
Top corner pooling:left pooling + top pooling
和cornertnet相比,在top pooling之前先left pooling;其它方向的pooling类似
2.5损失函数
和cornerNet一样,
3. 实验结果
结论:1.效果最好,在coco数据集上,多尺度检测mAP达到47%,2. 对小目标提升很明显