昨天在arxiv上发现的一篇非常有意思的论文,特来记录一下,惯例发链接
为什么文章叫Single-Stage,首先,针对多人pose这方面,主流的方法分为两类:
- Top-Down solution。先用一个detector检测出来图像上的所有行人,然后针对每一个检测的出来的human box,做单人pose预测,总共需要2步
- Bottom-Up solution。先用一个cnn检测出来图像上所有人的所有关键点,再通过一个聚类算法(或者其它方法)对这些点进行区分,将同一个人的点划分到一起,最后得到所有人的关键点,总共需要2步
以上的方法都是需要经过两个步骤才可以得到最终的multi-person pose,那么有没有一种方法可以一步到位?这就是论文提出的方法,一步到位,一次就可以得到多个人的pose点,所以叫做Single-Stage,具体看下图:
思路和之前anchor-free的Objects as Points很像,具体如下:
-
定义一个中心点,这个中心点就是这个人的box的中心位置,论文里把它叫作root joint
-
root joint回归出来模型需要检测的某一个人的所有pose点的offset(相对root joint)而言,这样网络只需要最后输出一个 root joint heatmap, 然后heatmap上的每一个位置再回归得到N个offset,就可以得到一个人的所有pose点坐标
-
上面2步其实就是Objects as Points里提到的关于检测pose点的方法,这篇文章对这个更进一步,因为如果直接回归一个人的所有点离root joint的offset,对于离root joint比较远的点,回归起来比较困难(称之为long range displacements),所以,论文对一个人的所有关节点做了分层,共分成4个层次:
- root joint 为第一层
- 脖子点、两个肩膀点、两个臀部点为第二层
- 头部点、手肘点、膝盖点为第三层
- 手腕点、脚踝点为第四层
-
分层之后,每个root joint同样还是回归N个点的offset,但这offset不再是直接针对root joint的offset,而是root joint直接回归第二层点的offset,然后第三层点的坐标是通过相对于第二层的点的offset得到,第四层点的坐标是通过相对于第三层点的offset得到,这样,root joint得到的N个offset都是short-range的,有利于网络去学习。形象化如下图所示:
-
图c是直接通过root joint回归出来N个坐标的形象化,图d是论文改进的一个回归方式,可以看出每个offset都变得很短,这样有助于网络去学习这些offset。
论文的做法在不同的数据集上都达到了速度与精度的高度平衡,非常棒,具体图表可以参照论文。但仍然有些不是很清楚的地方:
- 模型的label怎么打?回归得到的N个offset有什么固定顺序吗?是不是右肘只负责回归右手腕的offset?
- 论文说heatmap用l2 loss, 回归的offset用smooth l1 loss,但我尝试过用centernet的做法回归得到17个pose点,效果并不好,里面是不是还有其它trick?
- 期待作者的开源