ROMP 仅靠视频,也能实时做到细致的多人动捕?——多人Meh估计(I)
最近,Github上有一项很有意思的工作:ROMP。在一台1070Ti的电脑上,它就足以达到30fps的速度实时地进行人体Mesh模型的捕捉:
注意,这可不仅仅是关键点检测,而是识别出更复杂的SMPL模型(一种经典的人体Mesh模型),这个模型里面包含了体型、动作、性别在内的各种信息。而且更进一步,这个模型还是一个多人的框架。也就是说,即使图片上有多个人体,它也能实时地并行建立起多个Mesh模型:
看起来真的是异常的厉害。今天我们就来讲讲这篇ROMP的前世今生。
一,背景知识
(1)SMPL
首先,没有人体图形学基础的同学可能会困惑:SMPL是什么?为什么要用它?简单来说,SMPL是一种经过学习的人体的Mesh面模型。它的好处在于,学习了大量数据之后,SMPL可以用较少的基础面变量(e.g.142个)驱动细腻复杂的Mesh面变量(e.g.6890个)。这些基础变量里面包含了体型、身高、动作、性别等等因素,SMPL就将其映射到复杂的高维3D空间。
这就大大减轻了我们重构人体时的负担。比如说,原本我可能得在输出端回归大量的Mesh面(6890个变量),才能重构出人体模型。现在有了训练好的SMPL,我只要回归出142个基础变量就能完成任务了。与此同时,SMPL更大的好处在于,它提供了一个标准统一的人体Mesh面表达方式,这使得各类方法之间的比较成为可能。不然你拿出一套Mesh模型,我也拿出一套Mesh模型,这会使得衡量和评估的时候就会很不方便。现在,即使是我们想对SMPL有所改动,比如想要用更细致的手部或者头部模型,这也没有关系。在基准模型的统一的前提下,可以保证文章的基本的性能比较仍然是可能的。
(2)前代方法
好,现在我们了解了SMPL变量,那怎么利用它完成多人的Mesh回归呢?一个取巧的思路是利用相对成熟的3D的多人姿态估计,这样我们就可以在前人的肩膀上做文章。2018年,Zanfir就是通过这个思路,首次给出了多人Mesh估计的神经网络方法。简单来说,就是先做3D的姿态估计,拿到关节的3D坐标。然后对估计结果添加一个Encoder/Decoder,就可以把3D的姿态信息转意成3D的Mesh变量。这是第一个不使用优化(non-optimization)策略的多人Mesh估计方法。相对的,Zanfir采用的是一种较为完整的前馈思路,来逐步解决了这个问题,这是革命性的一步。
又或者,我们再在3D姿态估计的肩膀上退一步,退到再上一级的肩膀——目标检测上去。比如说,对于多人图片,我们在前端加个RCNN之类的目标检测网络,不就把多人问题转化成了单人问题吗?事实上,这就是2020年CRMH的想法。只不过,多人时有多人的考量。单人的mesh模型恢复出来是恢复出来了,但整体组合起来的和谐性呢?比如说,多人的模型合到一起时会穿模吗?他们的深度顺序对吗?这都是我们需要考量的问题。CRMH就针对这个问题提出了一些解决策略。具体来说就是通过在Loss中惩罚穿模,来遏止模型交叉。同时利用2D图像分割数据集,来让模型学习人体的深度和顺序问题:
(3)基于“点”的目标检测办法
上述的模型作为基于神经网络学习(Learning-based)的方法,事实上都取得了不错的效果。然而,在应用到实际时,还有一个重要的衡量标准,那就是速度。因为如果是离线预测,基于优化(optimize-based)的方法一定是效果更优的,所以基于神经网络学习(Learning-based)的优势其实在于它的实时性。但无论是Zanfir的bottom-up方法,还是CRMH的top-down方法,都是multi-stage的,也都不够快。像CRMH只有15fps左右,总不能真的去眨眼补帧。那有没有什么办法可以将multi-stage转换成one-stage处理呢?在目标检测领域,Objects as points提供了一个思路。这也是我们今天要讲的ROMP的主要灵感来源。
这个Object as points是怎么做目标检测的呢?推荐可以看这篇文章,作者写得易懂且详尽。这里主要谈一谈为什么这种表示方法适合于多人mesh回归:
1,显而易见的,Object as points是一个Anchor-free的网络。它直接预测物体的中心点,然后回归框的大小。由于去掉了大量繁琐的边框穷举,因此计算上会快上很多。而性能上看,其结果比起复杂的multi-stage方法也不遑多让。
2,事实上,Object as points不仅适合2D的目标检测,它还能做3D的目标检测,修改的方法也很简单:预测完中心点后,将边框的回归目标从2维改成3维即可。正是这种对多维问题的适应性让其在3D-detection上也有不错的表现,因而其架构天然适合我们的3D mesh识别问题。
3,由于Object as points预测的是“中心点”,这可以很好地解决遮挡时的歧义和模糊的问题。
当两个人高度重合的时候,即使anchor-based的方法检测出两个框,也很可能在识别阶段将其识别成同一个人。而point-based的方法只要识别出了两个中心点,就很可能成功地识别出两个独立的人。
二,ROMP网络架构
介绍完一些相关的基本知识后,我们就可以正式开始学习ROMP的网络架构了。简单来说,ROMP就3是三个并行的Backbone模块,可以都是Resnet,也可以都是HRNet,这三个神经网络分别负责完成不同的任务。完成训练后,再将这三个网络的Output简单地组合利用一下,就能得到最终的结果。那这三个网络分别负责什么功能?最终又怎么组合呢?接下来就对其分别进行讲解。
(1)Body Center Heatmap
作为Object as Points检测方法的延伸,ROMP也用中心点(Center Point)来完成目标检测。网络怎么去检测一个点呢?基于点的网络一般会有两种训练方式:一是直接回归点的坐标,二是使用heatmap。ROMP就是采用的后者。训练时,我们先计算Ground Truth人体的中心点坐标,再在周围建立一个高斯的Heatmap作为训练目标。这种做法在兄弟领域——2D的姿态估计中,也是一种有效的检测关键点的做法。
网络架构可以采用ResNet,也可以用HRNet。过程中,对feature map进行常规的卷积池化和BN,就能得到目标大小的heatmap。最终得到的channel数则为1,这一层张量的数值大小即为预测出来heatmap的值。
值得注意的是,由于采用的是很简单的基础网络架构,因此ROMP的可拓展性是极强的。对最终输出的heatmap取局域最大值,就能作为人体中心的预测点输出啦。
(2)Camera map
先来讲一下Camera map的网络架构,它的架构和上面的Body Center Heatmap几乎一样,只是在输出的Channel上从1变成了3.
虽说架构一致,但是最终的目标其实是很不一样的。简单来说,Camera map的任务就是估计人体的大小 s 和位置偏移 (t_x,t_y) 。比如说,估计出来 s=\frac{1}{2} , t_x=20,t_y=30 。这样的话,一会SMPL估计出来的3D关节点坐标 J 就可以映射到2D的照片 \hat J 上: \hat J_x=s\cdot J_x+t_x , \hat J_y=s\cdot J_y+t_y ,也就是说对标准人体缩小 \frac{1}{2} ,然后横轴上再偏移上20个像素点,纵轴上偏移30个像素点。
可是,这个时候可能有人要发问了:我们最终的目标不是3D的Mesh模型吗?为什么要反过来将3D坐标变回2D呢?这么做其实有两个考量:
- 有了2D关节点的映射方法,我们现在就可以用2D的姿态估计数据集训练我们的模型啦。由于大多数3D数据都是在动捕环境下获取的,因此这样训练出来的模型会不够健壮和普适。而2D姿态估计的数据集大多都是In the wild的,也就是先在室外拍摄,再标注的。这样训练时不仅可以利用到更多数据,还能增强模型对于室外情景的识别能力。
- ROMP缺少一个强有力的深度估计方法。因此,作为补足,这里的人体大小的系数 s可以作为深度估计的一种简单手段。在假设照片中人的体型接近的情况下,其实可以近似地用近大远小的直觉来估计人的深度。也就是说,人体大小的系数s越大,表示人就在越前面的位置,s越小则越后面。
(3)SMPL map
既然的要获得人体的SMPL数据,那怎么能少了一层网络来估计SMPL系数呢?遵循着朴实的网络设计理念,这一模块仍然用的是和上面一致的骨架。Body Center Heatmap/Camera map用什么,SMPL map就也用什么。不过最终的channel则改成了142,对应于SMPL的10个基本体型变量加上22个关节的6D变量:
同样地,尽管backbone保持一致,但这一层功能有所不同。具体来说,最终输出的SMPL map,代表以每个点为中心时的SMPL估计。比如SMPL map[0,0]代表的,就是当feature map最左上角的点为body center时,对应人体的SMPL基础变量。SMPL map[31,31]就代表最中心点为body center时(鉴于W=H=2*32),对应人体的SMPL基础变量。注意,计算出的这些张量并不代表那些地方真的有body center,它做的只是一种假设。只有当Body Center Heatmap正确计算出具体坐标时,我们再利用算出的具体坐标,取出(Sample)SMPL map中对应点的SMPL基础变量。没有Body Center Heatmap时,SMPL map仅仅是在周全地准备好所有可能出现的答案罢了。
(4)整体架构
综合上述的三者,整体网络架构就由三者并行而成,具体如下图所示:
工作时,整个网络先提取出feature map,再用三层并行的ResNet, 获得3个功能各异的Map. 在Map算完后,再以Body Center Heatmap的局部最大值作为body center,取出对应点的3个Camera参数(Map 2)和142个SMPL参数(Map 3)。最后,用142个SMPL参数就可以推算出SMPL模型的6890个总顶点,这就完成了我们最终的目标。
三,CAR:碰撞检测机制
既然Camera map估计出的大小系数可以勉强解决深度的问题,那么就只剩下一个3D mesh的关键问题了:碰撞/遮挡问题。当两个人离得很接近的时候,其高斯核就会离的很近,所以这两个坐标传到SMPL map时,可能只能识别出一个人。为了减轻这种情况下的歧义问题,我们希望识别出的两个高斯核最好保持一段距离,以正确独立地识别出两个个体。
文章中对此采用了一种类似电子互斥的思路。具体来说,如果两个高斯核 c_1 /c_2 及其核半径 k_1/k_2 ,而两个高斯核之间的距离 d_0 又比较小,比如说 d_0<d_1+d_2+1 . 那么这个时候,就可以迫使二者都位移一段距离 d :
d=\lambda\cdot\frac{k_1+k_2+1-d_0}{d_0}(c_1-c_2)\tag1
式子中\lambda 是自定的位移权重,决定斥力的大小,而具体位移的方向则是沿着二者连线的反方向。在距离比较近时,这样就能保证二者相互远离。而且注意观察的话不难发现,高斯核给定时,二者离得越近,这个反冲 d 就会迫使它们位移得越远。这个趋势也是符合我们的希望的。
四,实验结果
结果上讲,得益于one stage和anchor free的优势,ROMP的运行速度几乎是以往模型的两倍。整体计算可以在1070ti上以30fps的速度实时进行。而且,结果上也丝毫不差,在很多benchmark上都取得了相当好的效果。
总的来说,用简单的网络和简单的思想,ROMP不仅加快的网络的运行速度,还达到了近乎SOTA的实验效果。这是十分令人惊喜和钦佩的。
五,小结
最后,在文章的最后作一个简单小结:
- 首先,简单介绍了一下SMPL模型和之前的一些多人Mesh识别方法。同时,Object as points以其轻量高效、适合3D、缓解歧义的特性,适用于多人Mesh的问题的解决。
- 再者,分别介绍了三个主要的Map。三者都使用统一而简单的网络框架,并且很好的实现了各自的功能。Center Heatmap以高斯热图为目标,估计人体中心点;Camera Map也以独特的特性完成了训练集拓展和深度估计的任务;SMPL Map则假设各个点存在着人体中心,并由此对每个点求对应的142个SMPL基础变量。
- 最后,为了解决遮挡带来的歧义问题,CAR(Collision-Aware Representation)模仿静电互斥,给出了中心点的分离模式。
最后,码字不易,喜欢的话可以点个赞或者收藏,作者会很开心的。后续作者也会更新更多关于姿态动作领域的内容,感兴趣的话也可以关注一下哦~