DynamicFusion
DynamicFusion是一种基于Canonical TSDF和Mesh以及一个从Mesh中提取中warpNode,本质上是一种基于深度图和ICP算法的稀疏warp场估计的DenseSlam系统。其中最关键是系统能量的wee设计:
是变形场,V是顶点场,也是TSDF值,Dt是输入的深度图像,而为Node之间的连接关系,也即NodeGraph。
其中data项定义为点面距离,也即:
读者继续看到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中能量函数定义为:
其中两边有很多东西定义的不一样,比如data能量项的定义:
在doubleFusion中定义为:
其中存在三个系数函数,这三个函数分别代表是否在最近邻点是否在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权重函数定义:
\delta \end{matrix}\right." class="mathcode" src="http://img.558idc.com/uploadfile/allimg/210622/0QZ54947-0.png" data-cke-saved-src="https://private.codecogs.com/gif.latex?W_%5Cdelta%28a%29%3DL_%5Cdelta%28a%29/%28a%5E2/2%29%3D%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%201%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%7Ca%7C%3C%5Cdelta%5C%5C%20%28%7Ca%7C-%5Cdelta/2%29*%5Cdelta%20/%28a%5E2/2%29%29%20%5C%20%5C%20%5C%20%7Ca%7C%3E%5Cdelta%20%5Cend%7Bmatrix%7D%5Cright." data-cke-widget-data="{}" data-cke-widget-upcasted="1" data-src="https://private.codecogs.com/gif.latex?W_%5Cdelta%28a%29%3DL_%5Cdelta%28a%29/%28a%5E2/2%29%3D%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%201%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%5C%20%7Ca%7C%3C%5Cdelta%5C%5C%20%28%7Ca%7C-%5Cdelta/2%29*%5Cdelta%20/%28a%5E2/2%29%29%20%5C%20%5C%20%5C%20%7Ca%7C%3E%5Cdelta%20%5Cend%7Bmatrix%7D%5Cright.">
绿色是Huber函数,蓝色是 蓝色是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