本文对采用RGBD Fusion类的传统三维人体重建的三个算法流程,即self 3D Self-Portraits[1],DoubleFusion[2],PIFuFusion[3],做个简单的记录,不涉及细节,感兴趣的读者可自行阅读原始论文。
一.简介
场景均为相机固定人体转动,也就是算法的输入为多视角下的人体RGBD图,核心在于配准算法。
二.具体流程
1.3D Self-Portraits[1]
简介
无任何先验,将重建问题看作是一个纯纯的配准问题,也可适用于一般物体。
-
扫描
多视角无需多说,而在单视角情况下,论文利用了kinect v1的马达采集了多张RGBD图,为的是覆盖更多的人体区域,因此也就多了下面单视角融合一步。
-
单视角融合与分割
1)对单个视角下的多帧点云进行刚性ICP配准,然后进行泊松重建得到单视角下的完整人体点云。
2)首先根据大致的bbox分割出来大致的人体点云,然后删掉与原始帧不重叠的部分点云(消除泊松重建带来的杂点),接着根据法线在滤除一些平面区域的点,最后移除多个视角下不动的(因为背景在人体自转时是不动的)和小的不连接离群的点云。
-
逐帧刚性配准
刚性ICP配准:两次逐帧的ICP配准,第一次是以第一帧为基准,第二次是最后一帧为基准。
-
全局非刚性配准
1)寻找对应点对:首先进行相邻两帧之间的NICP配准(Embeding Graph[5]那套方法,下面介绍的两篇论文也是这种方法),然后查找最近点对并记录下来。
2)全局非刚性NICP配准,和相邻帧NICP的能量项一样,只不过这里是对所有帧同时进行优化,一次优化得到所有帧的非刚性变化(全局只要是可以消除累积误差,最明显的效果就是第一帧和最后一帧可以闭合上)。
-
点云重建
对配准后的点云进行泊松重建。另外由于单相机视角的限制,像人头顶部的孔洞仅靠泊松重建修补的效果比较差,因此又利用visual hull[4]计算出了一部分点云,与原始点云合并在一起后进行泊松重建。
-
纹理贴图
首先利用SIRFS算法[6]对原始RGB图进行处理用于减少光照变化的影响,然后利用泊松融合用于产生很好的纹理过渡。
2.DoubleFusion[2]
简介
利用smpl模板作为先验,smpl模板作为内层人体辅助外层人体的配准。
-
初始化
1)利用首帧深度图初始化TSDF,同样的利用首帧深度图和smpl模型进行配准初始化内层smpl形状和姿态参数;
2)初始化NICP配准的节点图,含内外两层,其中内层节点为由smpl定义,外层节点为距离内层节点一定距离的外层模型上采样得到。
-
联合运动跟踪
1)优化的参数为每个节点的旋转和平移,用于将双层模型配准当当前深度帧上(这里之前应该还有个ICP配准,然后是以上公式所示的NICP配准);
2)式3)数据项包含内层模型与深度图(v^\hat{v}v^为利用smpl lbs变化后点)、外层模型与深度图(v~\tilde{v}v~为Embeding Graph变化后的点)两种距离损失;
3)式4)用于对内层节点进行限制,用于确保Embeding Graph的变化和smpl lbs变化一致,用于约束不正常的姿态;
4)式5)为Embeding Graph中的正则项,式6)为smpl模型的高斯混合模型先验项。
-
几何融合
TSDF融合,从中提取的即外层模型。
-
形状、姿态优化
1)优化内层smpl模型与外层模型更相似;
2)式8)为数据项, W(∗)W(*)W(∗)为smpl的计算过程, D(∗)D(*)D(∗)为根据smpl点插值得到的TSDF值(这里直接取的TSDF值,避免了从TSDF中提取网格的操作);
3)式9)就很常见了,用于确保相邻帧之间的smpl形状姿态参数不至于变化太大。
3.PIFuFusion[3]
简介
同样是双层模型,不过此时内层模型由RGBD-PIFu提取(与smpl区别是无法利用姿态先验了),另外多了一步BA操作(我理解其实就是全局配准操作,这也就回到了论文[1]的操作)。
-
初始化
利用首帧深度图初始化TSDF,利用RGBD-PIFu提取的内层人体网格初始化NICP配准的节点图。
-
RGBD-PIFu
作者在PIFu[8]的基础上,额外加入了深度信息,利用首帧RGBD图重建得到内层的人体网格。
-
PIFusion
之前同样应该有一步ICP配准的步骤,然后就是以上能量项构建的NICP步骤,由于对内外两层模型与当前深度帧进行配准。能量项与Embeding Graph一致。
- 非刚性体变形
同样需要优化内层人体模型与外层人体模型,数据项与doublefusion一致,smooth项与式12)一致。
- BA
1)会将整个人体自转RGBD序列分成几块,并且会在所有RGBD序列中挑选关键帧,该步骤的目标是既要确保序列块之间可以紧密闭合,同时又要求序列块与关键帧要匹配;
2)式16)为全局闭环数据项,作用与论文[1]一样即是消除累积误差, vpv_pvp 、 vqv_qvq为有重叠两个序列块,WWW 为NICP操作(我理解这里同样之前会有ICP步骤);
3)式17)为序列块与当前关键帧的数据损失项, vvv 为序列块, uuu 为关键帧, WWW同样为NICP操作;
4)式18)为序列块与当前关键帧的轮廓损失项,IDTI_{DT}IDT 为当前关键帧的distance-transform图, π\piπ表示利用相机参数对序列块边界的点云投影到图像上的操作,用于约束序列块的轮廓与当前关键帧的轮廓一致。
-
重建
对配准后的点云泊松重建。
-
纹理贴图
利用法线方向做个筛选,然后做加权平均获得纹理像素值。
三.小结
其实这类方法基本上就是DynamicFusion那一套,可以参考之前的文章做个简单的了解[7],理解起来很容易,难点在于雅各比矩阵的推导和CUDA编程实现。
四.参考
[1]Hao, Li, Etienne, et al. 3D self-portraits[J]. ACM Transactions on Graphics (TOG), 2013.
[2]Yu T , Zheng Z , Guo K , et al. DoubleFusion: Real-time Capture of Human Performances with Inner Body Shapes from a Single Depth Sensor[J]. IEEE, 2018.
[3]Li Z , Yu T , Pan C , et al. Robust 3D Self-portraits in Seconds. 2020.
[4][Visual Hull (ulaval.ca)](http://vision.gel.ulaval.ca/~visualhull/)
[5]Sumner R W, Schmid J, Pauly M. Embedded deformation for shape manipulation[M]//ACM siggraph 2007 papers. 2007: 80-es.
[6]Shape, albedo, and illumination from a single image of an unknown object
[7]https://mp.weixin.qq.com/s/QuH_dnD73kr-QZCIDozwvQ
[8]https://mp.weixin.qq.com/s/-r3L71ZdOC0MlKpJ9s0ANQ