Centernet检测
Centernet源码里主要有三个部分的检测代码
- ctdet(目标检测)
- human_pose(人体位姿检测)
- ddd(3D检测)
对三部分解读如下:
论文解读
centernet是anchor-free的算法,本质上是通过检测到物体中心点之后回归bbox来实现目标检测的。
-
首先,Centernet分配锚点单纯依靠在图像中的位置,而不像锚框那样用box的重叠面积。这也不用手动设置阈值来区分前景和背景。
-
其次,Centernet在每个物体上只会设置一个锚点,所以也不需要NMS(非极大值抑制)来选取锚点
-
最后,Centernet输出结果的分辨率要比传统方法高(下采样率为4)
ctdet(目标检测)
在目标检测部分,关键是怎么获取到目标上的锚点。Centernet生成了关键点热力图,热力图尺寸是H*W*C,C是检测目标的类别数,如果是COCO数据集C=80。即针对每一类形成了一张热力图用于训练。Centernet中还用R=4生成了下采样后的热力图。
Centernet中用几个全卷积网络去预测热力图上的像素值Y:
- Hourglass network
- ResNet
- DLA
Centernet用高斯函数对GT值进行处理,距离GT值坐标越远,越接近于0。如果同一类的两个高斯值位置重叠,取值最大的那个
热力图的损失函数如图:
函数里的变量含义可自行查看论文
因为提取热力图时进行了下采样,热力图的GT点会跟原始图像有位置上的偏差。为了克服这个离散误差,对预测点引入关于位置偏差的损失函数:
预测得到中心点坐标之后,通过回归中心点与bbox的距离,得到预测的bbox。
最后将三部分损失函数按照一定的权重加和成最终的损失函数:
推理过程(从中心点到bounding box):
先把每一类热力图中的峰值点提取出来,检测值比它的8个邻接点大或相等的点,保留前100的点,human pose(人体关键点检测)
现阶段人体姿态识别主流的通常有2个思路:
1)Top-Down方法:将人体检测和关键点检测分离,在图像上首先进行人体检测,找到所有的人体框,对每个人体框图再使用关键点检测,这类方法往往比较慢,但姿态估计准确度较高。目前的主流是CPN,Hourglass,CPM,Alpha Pose等。
2)Bottom-Up方法:先检测图像中人体部件,然后将图像中多人人体的部件分别组合成人体,因此这类方法在测试推断的时候往往更快速,准确度稍低。
Centernet中人体关键点检测的方法就是典型的bottom-up方法,对于人体关键点检测,Centernet将人体骨骼划分为17个点,形成的关键点热力图中C=17。
把每个关键点参数化为对于中心点的偏移量,输入网络进行回归。Centernet通过改变loss函数将不可视的关键点忽视了。将预测结果与热力图上最近的点匹配,就能把预测到的关键点分配到最近的人体实例上。
human pose还有很多好玩的玩法,比如改变关键点的个数,将17个关键点改成15个:
ddd(单目3D检测)
Centernet在3d物体检测中对每个中心点添加了深度,3D尺寸和方向。Centernet用L1 Loss训练深度检测器,直接对3D尺寸进行回归,对方向的处理是将其分成两个bin,每个bin有4个scalars,对方向进行编码,在一个bin中,2个scalars用于分类,2个用于回归角度。
相比于其他的3D检测算法,Centernet在3D上并没有亮眼的操作。论文的核心还是ctdet和human pose