KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera
KinectFusion采用了基于深度信息的方法来实现相机的姿态追踪,并在实时生成室内场景的三维模型方面展现出良好的性能。本文详细阐述了该系统的主要功能以及一个基于GPU的新流水线方案。通过扩展这一核心基于GPU的数据流处理架构,在不牺牲相机追踪与重建精度的前提下,在摄像头之前实现了物体分割与用户的交互操作。
Kinect能够实时捕获三维实体环境中的采样点,并将这些采样值投影到相应的离散3D点集合(即点云)。由于 Kinect 传感器特性导致的数据噪声可能会引起观测数据出现轻微振荡,并在最终生成的深度图中形成未探测到的空间区域。
旨在实现实时构建高精度三维模型的目标,
本系统持续监测相机在六自由度空间中的运动状态,
并实时整合来自摄像头获取的深度信息构建全局三维结构。
当摄像头发生移动时,
新增观测区域被纳入当前三维模型,
随着引入新的深度测量数据,
三维重建模型逐步补充细节信息,
从而消除潜在空白区域以提升整体质量。
这种优化后的方法还可以通过搭配微软Kinect RGB摄像头实现纹理填充。
法线贴图:在其凹凸表面上每个点施加法线矢量,在RGB三元组中指定其方向;当光源被安置于特定位置时,则可使低细节表面呈现高精度的理想照明方向与反射特性。
KinectFusion通过首先构建起完整的环境,并指导目标物体的移动以实现精准分离。
GPU实现:
主流水线包括4个阶段:
Depth Map Conversion:通过将实时深度图从相机坐标空间转换为2D image coordinates,并在3D points和normals中生成对应的投影。
2.相机追踪(ICP):在追踪阶段中采用基于ICP算法的GPU加速技术,在追踪过程中通过GPU加速实现该算法来计算出六元刚体变换量,并使得当前所有有向点与前一帧对应点之间紧密配准。随后将所有相关联的变换依次应用到同一个综合变换中以确定Kinect的整体姿态。
Volumetric Integration:采用基于[5]所提出的体积表面表示方法来确定相机的姿态;通过此方法可将对应的有向点即可转换至全局坐标系;每个体素网格均被重新计算其新的三维信息;而每个体素单元则存储从该单元到假设物体表面位置的距离平均值。
4.Raycasting(3D Rendering):为了向用户展示三维场景细节,在Raycasting算法中通过光线投射机制生成隐式表面的视图。基于相机的姿态信息输入后,该合成深度图将等价于生成一个综合深度图,并可作为下一轮ICP迭代过程中的全局一致基准参考帧。基于此基础下完成目标:将当前实时捕捉到的深度数据与模型预设下的低噪光线投射视图进行精确配准以完成目标追踪任务。
以上每一步都是在GPU上使用CUDA并行执行的。
1. Depth Map Conversion
在时间单位i时,每一个CUDA线程独立处理输入深度图Di(u)中的单一像素u=(x,y),其中u代表二维坐标。
基于Kinect相机内部参数化的校准矩阵K,在GPU层面上的每个线程将单个深度测量值转换为相机坐标系中的三维顶点vi(u),计算公式为vi(u)=Di(u)乘以K的逆矩阵取第[u,1]元素。
这样的方式实现了所有三维顶点Vi的并行计算。
每个顶点对应于其位置处的一个单位法向量ni(u),该向量是通过在GPU上的线程采用邻近的投影点进行计算而得到的:ni(u)=(vi(x+1,y)-vi(x,y))×(vi(x,y+1)-vi(x,y))(经过归一化处理后的结果为ni/||ni||)。从而实现了对整个几何体表面梯度信息的有效并行提取,并构建了完整的法线图Ni。
在时刻i时的六个自由度(6DOF)相机姿态信息由一个刚性变换矩阵Ti=[Ri|ti]表示,在其中Ri是3×3的旋转矩阵部分而ti则是3D平移分量。经过这样的变换后,在全局坐标系中能够实现顶点和法线的相应转换。
2. Camera Tracking
在KinectFusion算法中使用ICP方法时会估计出一个6自由度的变换矩阵用于追踪每一新增深度帧对应的相机姿态这一过程随后会对当前处理中的定向点集与前一处理阶段记录下来的点集实现精确配准通过这种方式系统会逐步获得并累积起一系列相对于不同时间点的相机姿态信息最终完成对全局相机姿态Ti值的有效更新
ICP算法的第一则是计算当前时刻i与前一个时刻i-1之间定向点对应的几何变换参数。在本文所述系统中,则采用了投影数据关联(projectivedata association)这一技术手段来确定各关键点的空间位置关系。这部分基于GPU并行计算框架的技术方案可用如下的伪代码实现:
基于上一时刻的全局相机姿态信息Ti-1,在计算机视觉系统中实现三维空间中的一个参考点vi-1被独立地转换至相机局部坐标系,并随后将其透视投影至对应的图像平面位置。接着,在当前顶点Vi与法向图Ni之间沿着相同图像坐标的射线上寻找对应的二维特征索引。最后阶段,在完成匹配后,在同一个全局坐标框架下统一各关键点的空间位置关系,并对找到的所有候选匹配点进行一致性检验和异常值筛选工作。其中初始变换矩阵T_i通常基于前一次迭代的结果T_{i−1}构建,并在每次迭代中采用增量变换矩阵ΔT_i来进行更新
考虑这些带有方向性的点集,在每一次ICP迭代过程中都会产生一个使得各点与其前一迭代阶段对应点在切平面上距离平方和最小的变换矩阵T;并且我们将其定义为:即定义该变换矩阵T为各当前阶段中的每一点与其前一阶段对应点在各自切平面上的距离平方和(1)。
为了求解这一系统,在各帧之间的变换仅包含一个增量的情况下,我们采用了线性近似的策略。该线性系统通过树规约方法(Tree Reduction)实现了对GPU的并行计算和累加操作。针对6×6大小的系统,在CPU上采用了乔利斯基分解法进行处理。
本文中基于GPU相机追踪所实现的一个关键贡献为:ICP算法基于640×480分辨率的Kinect深度图所提供的全部数据点执行。研究未进行稀疏采样处理,并未采取显式的特征提取方式(尽管ICP隐含地依赖于深度特征整合)。该密集追踪方法仅限于本文所述的新GPU实现方案,并在KinectFusion系统中的物体分割和人机交互方面发挥了重要作用。
3. Volumetric Representation
基于ICP算法预测相机的姿态后,在将所有深度测量值从图像坐标系转换至一致的全局坐标空间的过程中,我们采用基于[5]文献中提出的体表示方法来整合数据。为此,在预先定义一个固定分辨率的三维网格体时,将其映射至特定尺寸的三维物理空间中,并对该三维体进行均匀细分至3D体素网格结构中。随后采用一种变种符号距离函数(SDFs)将全局3D顶点嵌入到该体素网格中进行处理。这种SDFs值不仅代表了各点与实际表面之间的相对距离,在点位于表面前方时取正值,在后方时取负值,并在表面交界处定义为零值。
具体而言,在实际应用中我们仅限于存储实际表面周围的小范围截取范围[5]。研究表明,在Kinect扫描数据中这一表示方法具有显著的优势,并且尤其体现在与其他如网格等表示方法相比。通过隐式编码的方式保留了距离数据的不确定性,并且其高效性体现在能够处理多种测量值;随着更多测量值的到来则逐步填充这些空白区域;这种表示方法还表现出良好的相机运动适应性,并且还实现了对物体表面几何特性的有效保留。
3.1 Volumetric Integration
为了使运算效率达到实时水平, 我们采用了基于GPU的新数据表示方法来实现TSDFs. GPU为整个体素网格分配了连续内存空间. 然而, 内存占用仍存在较大问题(一个包含32位体素的512³体积单元将占用约512MB的空间), 但这并未影响整体运行效率. 尽管存在这些限制, 但运行速度仍能满足需求. 由于内存空间是连续分配的, 在处理多个线程时可以通过优化访问顺序来提升吞吐量.
该算法实现了对体素网格访问的整合,并融合了投影深度数据。该算法持续地更新体内TSDF值(其更新速度为每2毫秒处理512³体积),同时也支持将基于点阵的数据源如Kinect深度图中的连续表面估计离散化为体素网格表示。此外, 与层次法相比, 本方法更加易于实现, 并且随着计算设备内存资源的增长, 能够扩展至构建整个房间的空间模型
算法主要步骤的伪代码如图:
由于体积内通常包含大量的体素,所以不能给每个体素都创建一个GPU线程。为了保证合并内存访问,一个GPU线程被分派给每个体积前表面薄片的(x,y)点。然后GPU线程沿着z轴在每个薄片上移动,就并行地扫过整个体积。已知体积的分辨率,以及这个体积映射到的物理尺寸,每个离散的3D网格就能够被转化为全局坐标系的一个顶点。从相机中心(全局相机变换的平移向量)到这个顶点的度量距离是能够被计算出来的。这个3D顶点也能够被透视投影回图像坐标系以查找沿着射线的实际深度测量值。测量距离值和计算距离值的差值得出了一个新的体素SDF值(line 7)。将其标准化为一个TSDF(lines 9&11),并用一个简单的连续加权平均值(line 13)与之前存储的值做平均。新的权重和平均TSDF都存储在体素中。
3.2 Raycasting for Rendering andTracking
本文开发出了一种基于GUP的光线追踪系统(raycaster作为实现图形渲染的关键技术之一),该系统用于完成上一步体内的隐式表面绘制工作。伪代码见下文
多个GPU并行处理时会同时沿各自的射线下方处理输出图像中的像素分布情况
渲染流水线如图所示:
渲染管道将传统基于多边形的图形学方法整合到光线投射视角中进行处理,并通过正确的遮挡处理技术实现虚拟与现实场景的有效结合。
在第一步(a)中利用与物理全局相机姿态Ti和内置校准矩阵K相关的图形相机参数设置网格场景进行渲染。
未着色数据不直接写入帧缓存(Framebuffer)和顶点缓存(Vertex Buffer),而是分别存储于屏幕外独立的空间中用于后续处理。
在光线投射过程中作为输入使用(c),并在计算过程中引入距离值作为额外终止条件,在体积与网格表面几何之间实现了精确的遮挡检测。
对于每个GPU线程计算从关联网格顶点到相机中心的距离时,在网格坐标系下进行处理。
沿着射线方向行进时引入的距离值作为额外终止条件,在体积与网格表面几何之间实现了精确的遮挡检测。
环境光照、漫反射与镜面反射等光效可通过建立虚拟几何图形进行建模与计算;更为复杂的着色效果则可借助沿每条射线进行二次及以上反射来实现;阴影现象通常出现在当第一束光线照射到体素或网格表面时,并通过从表面出发至光源区域的二次射线(基于网格坐标系)进行模拟获得;若光线在到达表面之前就被终止,则该顶点将被赋予阴影;对于反光效果而言,则需根据初始入射光线方向及表面法线方向来确定新的出射方向
该方法通过实时渲染技术实现了对复杂曲面模型的可视化显示。该系统能够通过精确计算遮挡关系实现了对多边形结构的正确呈现,并结合高级光照模拟技术实现了对细节区域的高精度着色效果。所有效果均在同一算法框架下高效实现,并保证了实时性。该系统支持任意第三人称视角下的三维物体投影变换方案,并支持第三人称视角下的三维场景导航功能。针对ICP相机定位系统设计了一套高精度数据采集方案。当光束投射方向与物理相机姿态一致时,所提取的数据点与深度图具有相同的几何特性,在相同视角下呈现出一致的结果特征。相较于原始Kinect数据,在此方法中减少了噪声干扰、投影阴影问题以及空洞区域的影响。如[21]所示,通过逆向跟踪ICP框架下的光束投射过程,从而有效降低了传统ICP框架下的定位误差和跟踪偏差问题。
4. Simulating Real-World Physics
将真实与虚拟的几何形态进一步整合,在流水线架构设计下实现对虚拟物体及其重建场景中真实物理碰撞过程的有效模拟。参考文献[9]与[10]的基础上,在GPU平台上实现了对动态粒子系统的仿真实验。场景的空间结构通过一系列静态模拟案例来描述;这些等大小球体处于静止状态,并能与其他动态模拟粒子进行碰撞互动;尽管这种建模方法具有简化的性质(尽管这种建模方法具有简化的性质),但其在目标体积内每个离散表面体素单元上的应用表现良好(其在目标体积内的每个离散表面体素单元上均表现出良好的应用效果),并且这种建模方法对于不规则形状物体同样适用(例如书本边缘或茶壶把手部位)。
静态粒子是在体积合成的时候创建的。随着体积被扫描过,在一个接近于零(定义表面交界处或零水平集)的自适应阈值内的TSDF值被提取出来。对每一个表面体素,都有一个静态粒子被实例化。每个粒子包含全局(度量)空间中的一个3D顶点,一个速度向量(对静态粒子来说是空),和一个ID。一个关键问题是碰撞检测。我们使用一个空间细分统一网格来区分相邻粒子。网格中的每个单元都有一个唯一的ID。通过将粒子的全局顶点转化到网格坐标系,每个动态或静态粒子被分配一个网格单元ID。我们系统中有两个列表:一个容纳静态粒子,另一个容纳动态粒子。在两个列表中,通过按照粒子当前的网格ID(使用基于GPU的基数排序)对粒子排序,将粒子被放入网格单元中。在每个模拟步骤中,为每个动态粒子创建一个GPU线程。每个线程通过检测(33)单元邻域(首先处理动态-动态的碰撞,然后处理动态-静态碰撞)来处理碰撞。离散元素法(DEM,Discrete Element Method)被用来计算一个当两个粒子碰撞时的速度向量。粒子的全局速度基于邻近碰撞、重力以及和包围体的碰撞而增加。然后每个粒子基于每个模拟步骤的累加速度重新定位。
该文基于GPU流水线设计的主要贡献体现在:在物理模拟方面取得了显著进展的同时实现了较高的交互速度;此外还支持实时相机追踪与三维重建。光线投射过程中仅动态生成可渲染粒子,并且所有可被重建的几何体均正确实现了遮挡处理。
5. Interacting in The Scene
目前所描述的核心系统均遵循基于场景处于动态平衡状态的假设。
在一个互动环境中,
用户能够自由地在相机前活动,并与之进行交互。
这导致了两个主要的问题。
首先,在每一帧中都会产生因相机运动而产生的单一刚性变换。相机前用户的交互活动会带来不依赖于相机运动的场景运动。这种现象违背了原有假设条件。鉴于我们的ICP追踪采用密集计算的方式(即利用所有可用点集),因此该系统在处理瞬时场景运动方面具备良好的适应性能力。例如,在图5所示的情景中,即使用户移动了物体对象,在背景有足够的点可供ICP算法进行计算融合的情况下仍能正常工作。然而需要注意的是,在过大或视角过长导致的大规模场景运动中可能会引发追踪失效的问题。
在我们的系统中,在支持实时重建的同时
如图8所示
如果该模型与实时数据之间存在不一致性就可能导致追踪误差出现
5.1 ICP Outliers for Segmentation
为了深入研究用户与重建场景之间的实时互动,并对核心GPU流水线增加了新的功能模块。如图所示
该技术基于密集ICP追踪技术的独特性质展开工作。当所有深度测量值被充分利用时,在投影数据关联过程中产生的异常值将生成一个强有力的初始预测;如果存在足够的刚性背景点来吸引ICP收敛,则这一预测将会成为与相机运动无关的场景运动的一部分;我们的解决方案能稳定健壮地实现从背景中分离出运动前景物体,并显著降低追踪错误率,在用户操作时提供更加便捷的操作体验。
该流水线基于假设,在初始扫描之后,在场内出现了一个包含定向点的运动物体。这些定向点显示出明显的差异与已经重建的表面。这些错误的ICP投影数据随后被复制至一个异常值映射(标记为b)中。随后,在异常值映射上执行了一个深度感知连接组件分析过程——该过程负责收集大量的连接碎片(connected patches),并除去由相机噪声(标记为c)所导致的小幅异常值。当检测到场内存在前景场景运动时——这将影响核心'背景'重建(标记为d)——大量连接碎片未能纳入输入深度图中。这使得相关前景深度测量值无法在核心流水线上实现有效的重建或追踪功能。与此同时——由于存在大量异常值干扰——剩余部分能够通过第二个体积块(标记为e)进行重新建模处理,并潜在地应用于具有不同配置参数的一个独立GPU系统中。最后一步光线投射两个独立体积块以完成计算,并将结果合并处理——采用与图12相同的技术方案完成整个流程
总体而言,在稳定追踪方面的表现令人满意,并进一步提升了静止背景重建的质量。即使某些场景在相机前持续移动时也能实现较好的效果。此外,该技术能够可靠地分离出前景物体,并独立完成背景重建。
5.2 Detecting Touch on Arbitrary Surfaces
该流水线通过分析前景与背景的交叉区域来进一步扩展其功能以支持多点触控输入。我们采用了一种将背景体积默认光照效果延伸至生成一个触图的方法(见附录4):
每个GPU线程接收经由光线投射生成的前景顶点图作为输入数据,并随后沿同一光线路径穿过背景介质。当检测到零交叉点后,则会触发相关前景顶点的探测(line 6)。若前景与背景位于其预设范围内,则前景位置即为触摸图输出结果。通过深度感知连接进行处理,并基于时间信息追踪手指触控。
6. Towards Modeling of DynamicScenes
目前我们已经在背景中成功辨识出移动的前景,并由此提出了一个有趣的问题:如何最有效地重建这种移动表面?核心困难在于如何将前景数据整合到第二体积中,并使表面测量值之间的关联能随着时间得到保证。在另一个ICP实例中我们已经尝试了单独预测前景对象的姿态。这次实验则是仅使用前景有向点(来自实时深度图和光线透视第二体积)运行密集ICP算法。我们的研究表明:即使面对前景中的微小非刚性运动密集ICP也能实现收敛。这为一种粗略的方法来估计全局相机变换并预测前景物体的姿态提供了依据。
通过这个姿态预测方案的应用,在第二个体素层中实现了深度测量值的有效对齐与整合过程。鉴于前景表面预测能够随着时间逐步形成,并愈发细致完善这一特性,在刚被整合进来的测量数据上赋予更高的权重系数。A straightforward extension采用每个体素自适应分配的方式实现这一目标:具体而言,在TSDF(整合之前)计算其导数的基础上进行动态平均处理以获得每个体素对应的权重参数。这种动态调整机制使得我们在面对表面变化率较高的情况(如手指部位)时能够更灵活地更新权重参数——例如,在手部区域赋予新采集到的数据更高优先级;而在相对稳定的区域(如上臂部分),则适当降低其权重系数以减少不必要的更新频率。The results demonstrated in Figure 16 and Figure 15 showcase the preliminary outcomes achieved through this adaptive weighting mechanism based on incremental ICP tracking of the scene horizon. Compared to the original Kinect data, these results exhibit a significant reduction in noise levels, with clear and distinct features observed in the hand, arm, and fingers.
对于我们的物理仿真系统而言,在实现前景重建时我们采用了离散的静止点来模拟整体效果。通过连续帧捕捉动态过程的方式实现了移动用户的实时碰撞检测功能(如图9所示)。该方法不仅适用于上述场景还能够应用于纯粹地追踪用户手持的刚性物体的姿态这一特定需求。其特点在于完全不受相机运动的影响并且无需依赖物体先验知识就能完成精确追踪任务。
