文章出自2019ICCV,颜水成团队。
提出的SPM算法跳出传统top-down和bottom-up的思路,直接预测每个人的位置和keypoints。
感觉是将yolov3和CSP行人检测的思路进行了融合。
Structured Pose Representation (SPR)
- 将人体实例和身体关节的位置信息进行统一。
- 人体关节分级表示。
先前的方法之所以需要两个阶段,主要是由于关节位姿的表示需要基于人体实例的位置来进行。颜水成团队从这个角度出发,探索了新的关节位姿表达方式SPR。
想要单阶段实现多人位姿估计,就需要一个统一人体位置和关节位置的表达。SPR提出了一个很具有启发的观点,它在常规的关节位置外引入了一个辅助关键位置——基准关节,这个基准关节就代表了人体实例的位置。
-
基本SPR表示
每个人体关键就可以表示为基于这一基准关节的偏移。在这样的表达下,检测问题就被转换为了预测每个人体对应的基准关节以及各个关节相对于基准关节的偏移量,两阶段为题就可以通过统一的关节表达而简化为单阶段问题:
因此,网络只要预测出基准关节的位置和每个关节点相对于基准关节的偏移,即可得到所有关节点的位置。
-
改进的SPR表示
人在运动时,有些关节离中心的基准关节偏移太大,直接从图像中回归出这些关节的偏移量难度较大误差也大。针对这个为题,作者借鉴了人体关节自身的天然结构,将关节的位移分为了四个层级,将相对于基准关节的偏移转换为了相对于上一级关节的偏移。
改进SPR之后,减小了偏移估计的难度同时也充分利用了躯干构造的结构信息。
如何实施
思路非常清晰明了,那么如何构造label和网络的输出呢?
首先从原始SPR表示来讲:
-
root target
-
joint target
以 joint j 的 label map 为例
首先对于第 i 个人,表示关节 j 的label map上根据第 i 个人得到的 (x,y) 点的取值:
其中:
进一步对于图中所有人,若点(x,y)处有多个人的关节表示,则取所有人的均值:
举个例子看一下,以图中只有一个人为例,多人同理:
设root点坐标为(5,5),joint_1坐标为(8,10),joint_2坐标为(6,7),平滑范围设为5,输出feature map大小为10*10.
则root map为: (5,5)处取值
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0 | 0 | 0 |
| 0 | 0 | 0.8 | 0.9 | 0.9 | 0.9 | 0.8 | 0 | 0 | 0 |
| 0 | 0 | 0.8 | 0.9 | 1 | 0.9 | 0.8 | 0 | 0 | 0 |
| 0 | 0 | 0.8 | 0.9 | 0.9 | 0.9 | 0.8 | 0 | 0 | 0 |
| 0 | 0 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
joint_1 的 x map 为(y map同理):
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0.355 | 0.284 | 0.213 | 0.142 | 0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.355 | 0.284 | 0.213 | 0.142 | 0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.355 | 0.284 | 0.213 | 0.142 | 0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.355 | 0.284 | 0.213 | 0.142 | 0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.355 | 0.284 | 0.213 | 0.142 | 0.071 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
joint_2 的 x map 为(y map同理):
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0.213 | 0.142 | 0.071 | 0 | -0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.213 | 0.142 | 0.071 | 0 | -0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.213 | 0.142 | 0.071 | 0 | -0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.213 | 0.142 | 0.071 | 0 | -0.071 | 0 | 0 | 0 |
| 0 | 0 | 0.213 | 0.142 | 0.071 | 0 | -0.071 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
若joint_1为joint_2的父节点,对于改进后的分层SPR,root map 和 joint_1 的 map 同上,joint_2的 x map 变为 (y map同理) :
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | -0.142 | -0.142 | -0.142 | -0.142 | -0.142 | 0 | 0 | 0 |
| 0 | 0 | -0.142 | -0.142 | -0.142 | -0.142 | -0.142 | 0 | 0 | 0 |
| 0 | 0 | -0.142 | -0.142 | -0.142 | -0.142 | -0.142 | 0 | 0 | 0 |
| 0 | 0 | -0.142 | -0.142 | -0.142 | -0.142 | -0.142 | 0 | 0 | 0 |
| 0 | 0 | -0.142 | -0.142 | -0.142 | -0.142 | -0.142 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
之所以中间5*5区域内取值全部为 -0.142 ( ),考虑到在预测时若中心点预测发生偏移,则不会影响后面关节点预测。
网络结构和loss
paper中采用了多stage的Hourglass作为主干网络。
Root joint:L2 Loss
Body joint:smooth L1 Loss
效果
FAQ