DoubleFusion和DynamicFusion解读

DynamicFusion

      DynamicFusion是一种基于Canonical TSDF和Mesh以及一个从Mesh中提取中warpNode,本质上是一种基于深度图和ICP算法的稀疏warp场估计的DenseSlam系统。其中最关键是系统能量的wee设计:

      W_t 是变形场,V是顶点场,也是TSDF值,Dt是输入的深度图像,而\varepsilon为Node之间的连接关系,也即NodeGraph。

                                E(W_t,\mathit{V},D_t,\varepsilon )=E_{data}(W_t,V,D_t)+{\lambda}E_{reg}(W_t,\varepsilon)   

      其中data项定义为点面距离,也即:  

                                 E_{data}(W_t,V,D_t)={\sum_{}^{(v_c,u))\in{P}}}{\tau_1(v_c)*\psi(\widetilde{n}_{v_c}*(\widetilde{v}_c-u))}

       读者继续看到doubleFusion就会发现doubleFusion的data项就是在dynamicFusion的基础上增加了关节的追踪,而不是仅仅有基于Node的非刚性配准,有了关节追踪和人体templete的先验知识可以大大提高了对Node Twist的解空间的约束,进而简化了求解,提高了求解速度和鲁棒性。

       DynamicFusion采用了非线性优化常用的高斯牛顿方法,在一个小邻域进行二次型目标函数线性化,Reg项充当了限制运动的功能,但是由于DynamicFusion的解空间约束很少,因此DynamicFusion适用场景为模型运动范围较小速度较慢,对于较大的运动模糊和追踪较快的运动会导致求解失败。相比较而言,DoubleFusion是一种更加鲁棒的人体重建方法,下面具体介绍。 

 

DoubleFusion

      DoubleFusion是清华大学刘烨斌老师课题组在2018年发表在CVPR上的一篇优秀的动态重建文章,它可以实现单个RGBD摄像头重建实时运动人体的功能,重建结果较好,运行帧率33帧,可以在TitanX及以上电脑上实时运行,鲁棒性较强。 

      读懂这篇文章,首先需要理解Double Layer到底指的是什么? 

      到底是内外两层什么东西,很多人以为是On-body Layer和off-body Layer。实际不是,实际上作者指的是BodyShape和Fused Layer。DoubleFusion与DynamicFusion关键的不同在于Data项中加入了一个人体关节模型 (SMPL),该模型不但可以提供一个人体表面的顶点的蒙皮驱动,也可以实现法向量的蒙皮(LBS),因此也可以加入到深度图找对应点的部分,参与计算Data 能量项。

      因此doubleFusion中能量函数定义为: 

                          E={\lambda}_{data}E_{data}(W_t,V,D_t)+{\lambda}_{bind}E_{bind}(\theta,W_t)+{\lambda}_{reg}E_{reg}(W_t,\varepsilon)+{\lambda}_{pri}E_{pri}(\theta)    

      其中两边有很多东西定义的不一样,比如data能量项的定义:

      在doubleFusion中定义为: 

               E_{data}(W_t,V,D_t,\theta)={\sum_{}^{(v_c,u))\in{P}}}{\tau_1(v_c)*\psi(\widetilde{n}_{v_c}*(\widetilde{v}_c-u))+(\tau_2(v_c)+\tau_3(v_c)*\psi(\widehat{n}_{v_c}*(\widehat{v}_c-u))) ) }

       其中存在三个系数函数,这三个函数分别代表是否在最近邻点是否在fused surface上,是否在body shape上,还是在fused surface但四个最邻近node全在bodyshape上。这样就将SMPL模型的24个关节驱动起来了。也就是data项中包含了对人体模板的约束信息。

        doubleFusion还透露一个细节是他没有用全部的深度图,而是用了采样的深度图。 此外它不仅仅有Node的位置还用了Node的法向量,用于计算data项能量。 这意味着在进行rendering时候,不仅需要对CanonicalFrame进行warp并渲染,还需要对Node Graph进行渲染,获取可见区域的Vmap,进行ICP的Correspondence匹配。 

         binding项是一个显式的直接对NodeGraph Twist和SMPLSkining进行硬绑定的能量项,虽然data项已经能提供部分绑定效果。 这部分的权重与data项一样为1,而Reg项为5。

         对于Reg项,DoubleFusion与DynamicFusion基本一致,都定义为相邻Node的Twist值的误差,只不过在权重方面有些不同,DynamicFusion用了两个Node中较大的作用距离数值作为权重,一般为0.1m,而DoubleFusion中所有Node的有效作用距离都固定为0.07m,但是没有采用作用距离而是采用了SkinningWeight差的Huber权重作为权重,一般为接近于1的数值。而且随着Skinningweight的差距的变大而降低。(注意Huber函数与Huber权重不同,具体区别见下图)

huber函数定义如下: 

Huber权重函数定义: 

 W_\delta(a)=L_\delta(a)/(a^2/2)=\left\{\begin{matrix} 1 \ \ \ \ \ \ \ \ \ \ \ |a|<\delta\\ (|a|-\delta/2)*\delta /(a^2/2)) \ \ \ |a|>\delta \end{matrix}\right.   

      DoubleFusion和DynamicFusion解读_第1张图片          DoubleFusion和DynamicFusion解读_第2张图片   

                 绿色是Huber函数,蓝色是x^2                                    蓝色是Huber权重函数 

       Reg项可以实现一个局部平滑的重建,但是Reg项的效果依赖于KNN场的准确和Node Graph的顶点连接的均一性,均一性意味着每个点经历被四周的个数相当的点约束着,如果Knn不准确,即使Reg项比较强烈,Data项的不光滑性也会导致重建的表面存在问题,比如Knn中设置K=1时候,重建出来的表面会不太准确。如果Reg项太弱,身体表面也会出现较多的褶皱,甚至开始到处飞,求解器趋于崩溃。

SurfelWarp 2019

      2019年MIT的GAO Wei提出了一种基于surfel的动态重建算法,然而不是特别高效,比DynamicFusion而言重点提升了一些内存效率和每个环节的效率。但是每个环节比doubleFusion和Fusion4D的运行效率低一些。整体水平没有达到业界最领先的水平。但是代码是可以参考的,给出了cuda的代码和工程,可以在windows和linux下编译。 

文章:    https://arxiv.org/abs/1904.13073

代码:    https://github.com/chenguowen/surfelwarp

你可能感兴趣的:(C++)