本篇解读两个比较经典的方法,一个是VIBE,一个是PARE,后者现在应该是非常SOTA的方法了。很多博客上来就是复制粘贴VIBE的【震惊】文,既没有对论文的仔细品读,也没有实际跑代码之后给出的使用结论。我一般喜欢看结论,不喜欢看震惊体,不管多么完美方法,从不同的角度总是可以发现它的缺点。
人体3D Pose这几年看上去感觉已经做到头了,这一脉领域的新的东西很少,无外乎就是时序、花式SMPL、各种fitting来降低拟合误差,但不管是哪种方法,放到工业落地上,就会有它的局限性。然而实际上这个方法还是有着巨大的提升空间和潜力,也蕴含着巨大的商业空间,很多做的好的工作既不放paper,也不开源,所以很容易管中窥豹,看不到全貌。本文尝试从VIBE和PARE来做切入点,带你进入元宇宙的大门。
先来看结论吧,VIBE最大的优点就是通过temporal的信息以及AMASS大数据的加成,通过一套对抗的训练方式,让模型具有了更好的泛化性能。
可以看到非常直观的效果对比,VIBE比TemporalHMR的效果更好:
用原论文的话来说,主要的贡献就是:
从VIBE的代码角度来看,其实它里面的东西还挺多的,抛开训练代码不讲,但预测推理部分就做了很多文章,以至于我都怀疑它的效果是否跟后面的cam fitting以及body fitting有很大关系,毕竟这种套路现在在刷榜上很有用,但是无疑是非常慢的。DynBOA也是类似的思路,最终目的也是为了解决wild数据集下模型不可能全部都能预测的很好,有一些domin gap较大的场景基本上是100%跪。
总结起来,VIBE是很经典的工作,在所有尝试使用temporal的方法中,也是比较优秀的存在,但是从代码来看,各种优化骚操作非常之多,使用起来难免有一种“挂羊头卖狗肉”之感,不是特别的clean。
比如说,在做SMPL回归的时候会有类似于这样的操作:
camera_optimizer = torch.optim.LBFGS(camera_opt_params, max_iter=self.max_iter, lr=self.step_size, line_search_fn='strong_wolfe') for i in range(self.num_iters): def closure(): camera_optimizer.zero_grad() betas_ext = arrange_betas(body_pose, betas) smpl_output = self.smpl(global_orient=global_orient, body_pose=body_pose, betas=betas_ext) model_joints = smpl_output.joints loss = temporal_camera_fitting_loss(model_joints, camera_translation, init_cam_t, camera_center, joints_2d, joints_conf, focal_length=self.focal_length) loss.backward() return loss camera_optimizer.step(closure)
不过这种操作倒是无可厚非,但就是速度慢。
同一作者的工作,主要解决的问题是遮挡问题, 遮挡应该是单目RGB做3D Pose估计最大的阻力了。PARE就充分的体现了它的进化的地方:解决遮挡问题。
PARE的核心内容是:
此外PARE提到了一个很重要的观点,也就是在当今的方法范式中,不管是通过2D output经过SMPL得到shapes, poses,verts还是将SMPLify融合进入到训练的循环中,使之实现类似于半监督的学习方式,都存在一个很大的弊端:很难处理遮挡。
PARE提出了一套方法论,如何分析遮挡的敏感性。上图展示了SPIN不同关节点处的遮挡敏感值。
通过对敏感性的分析,PARE提出了一套拆解的方法,利用一个2D的分割i信息,分别提取出P和F,然后通过PartAttention来生成最终合成的参数。
这意味着,PARE的整个流程需要一个2D的分割的作为辅助输入。
从PARE的结果可以看出,效果显著。
一些qualitative results,和SPIN 对比,可以看到拟合的却是更高,而且对遮挡效果显著。
似乎通过不断的把模型复杂化,比如temporal,各种GNN,各种transformer,速度慢的跟屎一样的研究思路,倒不如返璞归真,把问题回归到最本质的问题上,最本质的还是缺数据以及泛化能力,PARE这篇论文思路就很不错,哪怕是增加了一个label,也可以从中得到比较大的收益。这也给我们研究、处事与生活提供了一个思考方式:返璞归真,找到问题的本质去解决,而不是本末倒置,不断的滋生新的问题。