基于非参数化模型的三维人体重建-RGBD Fusion类

本文对采用RGBD Fusion类的传统三维人体重建的三个算法流程,即self 3D Self-Portraits[1],DoubleFusion[2],PIFuFusion[3],做个简单的记录,不涉及细节,感兴趣的读者可自行阅读原始论文。


一.简介

场景均为相机固定人体转动,也就是算法的输入为多视角下的人体RGBD图,核心在于配准算法。

二.具体流程

1.3D Self-Portraits[1]

图1.算法[1]整体流程

简介

无任何先验,将重建问题看作是一个纯纯的配准问题,也可适用于一般物体。

  • 扫描

    多视角无需多说,而在单视角情况下,论文利用了kinect v1的马达采集了多张RGBD图,为的是覆盖更多的人体区域,因此也就多了下面单视角融合一步。

  • 单视角融合与分割

    1)对单个视角下的多帧点云进行刚性ICP配准,然后进行泊松重建得到单视角下的完整人体点云。

    2)首先根据大致的bbox分割出来大致的人体点云,然后删掉与原始帧不重叠的部分点云(消除泊松重建带来的杂点),接着根据法线在滤除一些平面区域的点,最后移除多个视角下不动的(因为背景在人体自转时是不动的)和小的不连接离群的点云。

  • 逐帧刚性配准

    刚性ICP配准:两次逐帧的ICP配准,第一次是以第一帧为基准,第二次是最后一帧为基准。

  • 全局非刚性配准

    1)寻找对应点对:首先进行相邻两帧之间的NICP配准(Embeding Graph[5]那套方法,下面介绍的两篇论文也是这种方法),然后查找最近点对并记录下来。

    2)全局非刚性NICP配准,和相邻帧NICP的能量项一样,只不过这里是对所有帧同时进行优化,一次优化得到所有帧的非刚性变化(全局只要是可以消除累积误差,最明显的效果就是第一帧和最后一帧可以闭合上)。

式1.全局NICP配准

  • 点云重建

    对配准后的点云进行泊松重建。另外由于单相机视角的限制,像人头顶部的孔洞仅靠泊松重建修补的效果比较差,因此又利用visual hull[4]计算出了一部分点云,与原始点云合并在一起后进行泊松重建。

  • 纹理贴图

    首先利用SIRFS算法[6]对原始RGB图进行处理用于减少光照变化的影响,然后利用泊松融合用于产生很好的纹理过渡。

2.DoubleFusion[2]

图2.算法[2]整体流程

简介

利用smpl模板作为先验,smpl模板作为内层人体辅助外层人体的配准。

  • 初始化

    1)利用首帧深度图初始化TSDF,同样的利用首帧深度图和smpl模型进行配准初始化内层smpl形状和姿态参数;

    2)初始化NICP配准的节点图,含内外两层,其中内层节点为由smpl定义,外层节点为距离内层节点一定距离的外层模型上采样得到。

  • 联合运动跟踪

式2.联合运动跟踪总损失项

式3.数据项

式4.姿态绑定项

式5.正则项

式6.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融合,从中提取的即外层模型。

  • 形状、姿态优化

式7.内层模型总能量项

式8.数据项

式9.时序一致项

1)优化内层smpl模型与外层模型更相似;

2)式8)为数据项, W(∗)W(*)W()为smpl的计算过程, D(∗)D(*)D()为根据smpl点插值得到的TSDF值(这里直接取的TSDF值,避免了从TSDF中提取网格的操作);

3)式9)就很常见了,用于确保相邻帧之间的smpl形状姿态参数不至于变化太大。

3.PIFuFusion[3]

图3.算法[3]整体流程

简介

同样是双层模型,不过此时内层模型由RGBD-PIFu提取(与smpl区别是无法利用姿态先验了),另外多了一步BA操作(我理解其实就是全局配准操作,这也就回到了论文[1]的操作)。

  • 初始化

    利用首帧深度图初始化TSDF,利用RGBD-PIFu提取的内层人体网格初始化NICP配准的节点图。

  • RGBD-PIFu

    作者在PIFu[8]的基础上,额外加入了深度信息,利用首帧RGBD图重建得到内层的人体网格。

  • PIFusion

式10.双层优化总能量项

式11.数据项

式12.正项

之前同样应该有一步ICP配准的步骤,然后就是以上能量项构建的NICP步骤,由于对内外两层模型与当前深度帧进行配准。能量项与Embeding Graph一致。
  • 非刚性体变形

式13.时序一致项

式14.时序一致项

同样需要优化内层人体模型与外层人体模型,数据项与doublefusion一致,smooth项与式12)一致。
  • BA

式15.BA总能量项

式16.闭环数据项

式17.与当前关键帧数据项

式18.与当前关键帧轮廓项

1)会将整个人体自转RGBD序列分成几块,并且会在所有RGBD序列中挑选关键帧,该步骤的目标是既要确保序列块之间可以紧密闭合,同时又要求序列块与关键帧要匹配;

2)式16)为全局闭环数据项,作用与论文[1]一样即是消除累积误差, vpv_pvpvqv_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

### RGB-D SLAM 的实现方法和技术 RGB-D SLAM 是一种利用彩色图像(RGB)和深度图(Depth)数据来构建环境三维模型并估计相机位姿的技术。它通常用于机器人导航、增强现实等领域。以下是关于其技术细节和实现方式的具体说明: #### 1. 数据源与传感器 RGB-D SLAM 使用的典型设备包括 Microsoft Kinect 或 Intel RealSense 等深度摄像头。这些设备能够提供同步的 RGB 图像和对应的深度信息。通过融合这两种模态的数据,可以更精确地重建场景结构。 - **深度信息的作用**:相比仅依赖于视觉特征的传统 SLAM 方法,深度信息提供了直接的距离测量值,从而减少了对复杂几何计算的需求[^1]。 #### 2. 关键模块分析 RGB-D SLAM 主要由以下几个核心部分组成: ##### (1)前端处理 前端负责实时跟踪相机姿态变化。对于 RGB-D 输入而言,常用的方法有基于 ICP (Iterative Closest Point) 和光度误差最小化的优化策略。 - 基于 ICP 的方法通过对齐当前帧与参考帧之间的点云来进行位置调整; - 而光度法则假设两帧间像素强度差异较小,在此基础上建立目标函数求解最优变换矩阵[^3]。 ##### (2)后端优化 为了提高轨迹估算精度以及解决累积漂移问题,需引入全局一致性约束条件下的非线性优化过程——即所谓的 Bundle Adjustment (BA),或者采用 Factor Graph 表达形式进行概率推断。 - BA 把所有观测到的关键点及其对应关系作为变量集合纳入考虑范围之内,试图找到使重投影误差达到最低的一组参数配置方案;与此同时还能兼顾时间序列上的平滑过渡特性[^2]。 ##### (3)回环检测 当再次访问曾经探索过的区域时,系统应具备识别能力以便消除长时间运行过程中产生的累计偏差现象。此环节可借助词袋模型(Bag-of-Words Model)或其他机器学习算法完成相似子空间检索操作。 - 利用语义标签辅助判断候选匹配项的有效性有助于提升召回率的同时降低误报风险水平。 #### 3. 开源框架推荐 目前存在多个成熟的开源项目可供开发者快速搭建实验平台测试想法效果如何: - ORB-SLAM2 支持多型输入模式(单目/双目/RGBD卡口兼容), 并且内置闭环发现机制等功能组件; - ElasticFusion 提供了一种增量式的表面重建流程设计思路, 特别适合动态环境下作业需求. ```python import numpy as np from scipy.spatial.transform import Rotation as R def align_point_clouds(source_points, target_points): """ Align two point clouds using Iterative Closest Point algorithm. Args: source_points (np.ndarray): Source points array of shape (N, 3). target_points (np.ndarray): Target points array of shape (M, 3). Returns: tuple: Transformation matrix and aligned source points. """ from sklearn.neighbors import NearestNeighbors nbrs = NearestNeighbors(n_neighbors=1, algorithm='ball_tree').fit(target_points) distances, indices = nbrs.kneighbors(source_points) rotation_init = R.from_euler('xyz', [0, 0, 0]).as_matrix() translation_init = np.zeros((3,)) # Perform optimization here... return transformation_matrix, transformed_source_points ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值