KinectFusion:用运动的深度相机进行实时3D重建及交互 |
您所在的位置:网站首页 › kinectfusion三维重建 › KinectFusion:用运动的深度相机进行实时3D重建及交互 |
KinectFusion的GPU Pipeline实现, 涉及到的两篇原理和实现中的一篇,两年前翻译的,那时候多数不理解,再拿出来整理一下,也是加深理解,配图来自原论文,文字为本人翻译,如有不正,敬请指出。 本文最重要的算法都在第四章:GPU实现,也是最难理解的部分,本文的第四章是自己反复阅读过后的理解,也建议想要学习KinFu的同学仔细阅读,源码已经在13年在PCL开放,后来在Microsoft的 SDK上也可用, 如何配置kinectFusion可以运行的PCL环境请点击链接。 下面给出原文下载链接>>>>>>> KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera 摘要 KinectFusion使用户可以手持Kinect移动,仅用Kinect的深度信息来追踪传感器的3D姿态,实时重建室内场景的详细3D模型。 本文详细描述了KinectFusion的作用性能和新提出的基于GPU的流水线。 我们展示了这个低成本手持扫描设备,几何感知增强现实,实物交互的核心系统。 此核心GPU流水线的新扩展论证了:不降低摄像头追踪和重建的精确度,直接在设备前和用户交互,物体分割。这些扩展可以使在任何平面或三维重建物体表面都可以实时多点触控交互。 ACM 分类: H5.2 [Information Interfaces and Presentation] : User Interfaces. 用户界面 I4.5 [Image Processing and Computer Vision ] : Reconstruction. 重建 I3.7 [Computer Graphics]: Three-Dimensional Graphics and Realism. 3D图形实现 常规术语:算法,设计,人为因素。 关键词: 3D GPU 表面重建 追踪 深度摄像头 AR 物理 几何感知交互
同样,每个GPU thread中,每个顶点对应的法向量用相邻投影点通过中作如下运算 在时刻i,6维摄像头方位是一个刚体变换矩阵
2. Camera Tracking 摄像头跟踪 ICP(Iterative closest point)是在3D配准上广泛应用的算法(详见【24】)。而KinectFusion将ICP扩展到跟踪 摄像头位姿(每新输入的深度图对应的c amera pose),其实这一步是通过ICP估计出一个把上一帧变换到当前帧摄像头位置的一个变换矩阵, (再直观点就是上一时间点i-1输入的点云通过上一小节提到的矩阵 我们用一个线性近似来解决这个系统,即假定在帧和帧之间只存在一个增量变换【3,17】。此线性系统采用树规约方法(tree reduction)在GPU上并行运算并求和。 然后,这个6*6线性系统的解决方案在CPU上运用乔利斯基分解(Cholesky decomposition)解决。 我们基于GPU的摄像头跟踪实现的新的贡献主要是,ICP是在640*480 Kinect深度图所提供的所有的测量值上运行的。没有对点进行稀疏采样,或者明确的特征提取(尽管ICP确实暗含把深度特征合并)。此种密集追踪目前只在我们新提出的GPU实现中可行,并且在KinectFusion中分割物体和用户交互有重要作用,正如后文描述。 3. Volumetric Representation 通过用ICP预测摄像头的全局方位,所有深度测量值都能从二维图像坐标转化到一个单一连续的全局坐标空间。我们基于论文【5】的体表示方法整合这些数据。一个固定分辨率的三维体(映射到一个特定尺寸的3D实体空间)预先确定,再被均匀细分成一组体元组成的网格。运用一系列符号距离函数(SDF)把全局3D顶点整合到体元中。在SDF中,值表示到实际表面的相对距离;在实际表面前面,值为正;在实际表面后面,值为负;在表面交界上,值定义为零,交界处变号。 实际上只存储实际表面附近一段截短的区域【5】——本文称作TSDF截短的符号距离函数。我们发现这种表示方法存储Kinect传感器数据与其他方法尤其是mesh网眼方法相比有很多好处:它暗含了实物测量数据的不确定性,高效处理多样的测量值,新值计入时及时填补孔洞,适应摄像头移动,且暗中存储了表面几何体。 4. Volumetric Integration 为达到实时运算速度,我们新提出了GPU实现的体表现的TSDF。GPU给3D体元网格整体分配了对齐的线性内存。虽然我们系统有时明显内存效率不足(一个512^3大小的体积包含需要512MB内存存储的32bit体元),但是运算速度很高效。由于内存排列对齐,并行线程可以合并使用这些内存以增加内存吞吐量。 算法保证了能同时取得体元网格的存储数据,同时整合了深度数据的投影。算法实时的更新体积内的TSDF数值(速度达到每2ms更新512^3大小体积),而且连续表面(从点云表示的深度图得来)的预测离散成体元网格。此外,本方法的实现比层次法(如【29】)更简单。而且随着GPU内存的增加,本方法甚至可以为一整个房间建模。 列表2中伪码表示这个算法的主要步骤。考虑到一个体积内的体元数量之大,为每个体元创建一个GPU线程不可行。为保证能同时存取内存,每个GPU线程分别分配给体积前表面薄片上的点(x,y)。沿着z轴上的每个薄片移动,这些GPU线程就能并行扫过整个体积。已知一个体积的分辨率,和这个体积所映射的实物尺寸,每个离散的3D网格位置可以转化为全局坐标系内的一个顶点。这个顶点到摄像头中心(全局摄像头变换的平移矢量)的度量距离是可以计算的。也可以把这3D顶点透视投影回原来的图像坐标上以找到沿着射出光线的实际深度值。测量值和计算得到的差给出了体元的一个新SDF值(第7行);标准化到TSDF(第9行,11行);用简单运行加权平均与前一个存储值平均(第13行)【5】。新权重和平均TSDF都存储在体元中。 5. Raycasting for Render and Tracking 本文实现了GPU-based raycaster (光线跟踪是渲染的主要方法) 是用来渲染上一步中的volume内暗含的表面(如原论文Listing3中伪码)。每个GPU thread并行投射一条ray,渲染 输出图像中的一个pixel。给出一个起始位置和光线投射的方向,每个GPU thread沿着光线 穿过体元,通过监测TSDF值的符号改变(过零点)交界处来提取暗含表面的位置。最终表面交界处的点是在零点交界处左右两边分别由三线取样点用线性内插法取得的。若梯度与接触面正交,曲面法线直接能从TSDF在零点交界处求导得出。因此,每个找到一个曲面交界点的GPU thread可单独计算一个内插点和法线,计算结果可作为输出像素点的(lighting)光线计算的参数,用于渲染。 图12是渲染流水线:在光线投射的视角下,使传统基于多边形的图形,以正确的遮挡处理技术blending (图像中常用的融合手段)了虚拟和现实场景,如图6。 a),基于mesh的场景以相机参数(等同于物理全局摄像头方向矩阵Ti和内部校准矩阵K)被渲染; b),曲面向量和未使用的颜色数据不是存在frame buffer和vertex buffer中,而是单独分别存储在与显示无关的称作vertex,normal,color的单元里;c),在体绘制时用于输入。每一个GPU线程中,mesh顶点到摄像头中心的距离都被转化到grid坐标系中(列表3,第7,8行)。这个距离作为一个额外终止条件:沿着每条光线上(19行),在体积和网面几何中作精确的遮挡检测。 环境光,漫反射,和镜面反射的光效可以通过重建和虚拟的几何结构计算而得(图6)。更先进的明暗度计算可以通过沿着每条光线的第二次(或更多)反射来实现。阴影是在第一道光束打在体元或网格表面后(列表3,第13,19行),再从表面到光源走了二次射线计算得到得(在grid坐标系下)。若在光线在截止之前打到表面上,那么该顶点上就附有阴影。对于反光,一旦第一道光线射到表面上,新的射线方向就将基于曲面法线和初始射线方向生成。 本系统中体绘制的贡献是,在同一个算法中实时进行,同时处理以下各部分:在重建的3D模型中得出并绘制暗含的表面,把传统的多边形几何与适当的遮挡处理相结合,并给出先进的需要光线跟踪的明暗度计算。任何一个6维图像摄像头变换都可以被用来绘制物体,任意第三方都可允许作为3D模型的用户导航。然而,另一个更重要贡献在于为ICP摄像头跟踪部分生成高质量数据。当光线投射摄像头等于实物摄像头方位时,所提取的顶点和法线映射到深度和法线单元(从相同角度出发的实物相机),此结果中噪音相较原始kinect数据将大大减小。如【21】所示,通过直接跟踪光线投射的模型相较于帧到帧ICP追踪更能缓和偏移,减少ICP出错。 6. Simulating Real-World Physics 模拟真实世界的物理原理 进一步合并真实和虚拟的几何形状,GPU流水线可以扩展到支持虚拟物品和重建的场景之间的物理上真实的碰撞。基于【9】【10】,以粒子仿真的实验已在GPU上实现。仿真实验内的场景外形由一组静态颗粒表示(图13)。这些相同大小的球体虽然保持静止,但仍然可能和其他动态的模拟颗粒碰撞。虽然只是近似,但此技术实时地在目标体积内为每一个分立表面的体元建模,并取得令人瞩目的成就:即使非常微小或者任意形状的物品,如书的边缘或茶壶的把手也有很好效果,如图7(右下)和13。 静态粒子是在体合成的时候被创建的。随着扫描过体积,TSDF值即在一个接近零的自适应阈值内被提取出来,其中零值表示表面界面或零等高集合。对每一个表面体元,都有一个静态粒子被实例化。每一个颗粒在全局度量空间中包含一个3D顶点,一个速度向量(静态粒子为空),和一个ID。一个关键问题就是碰撞检测。我们使用一个在空间上细分的均匀网格来区分临近的颗粒【9】。网格中的每个单元都有一个唯一的ID。通过将颗粒的全局顶点转换为网格坐标,每个动态或静态的颗粒都分配到一个网格单元ID。 我们的系统保有两个列表——一个存储静态颗粒,另一个存储动态的。在两个列表中,粒子都通过按它们当前网格ID排序(用基于GPU的基数排序)后,被挑选进网格单元格中。在每个模拟步骤,每出现一个动态粒子,就启用一个GPU线程。每个线程通过检测(3^3)临域内的单元处理碰撞(先处理动态-动态的碰撞,再处理动态-静态的碰撞)。离散单元法(DEM, Discrete Element Method)【10】被用于计算两个粒子碰撞时的速度矢量。粒子的全局速度基于临近碰撞,重力,和包围体的相互作用而累加。 然后,每个粒子都基于每个仿真步骤累积的速度重新定位。 图7所示为上千个颗粒和重建场景的交互情况。我们基于GPU流水线的一大主要贡献是: 在物理模拟取得突破性进展的同时依然保持互动速率,还同时进行摄像头实时跟踪和重建。默认情况下,在光线投射过程中只有动态颗粒被渲染,于是可以再次被重建的几何体正确的遮挡(图7)。 五 . 场景互动 目前为止,我们所描述的核心系统都基于场景保持合理静止状态这样一个假设。显然,在一个互动环境中,用户希望在显示器前自由运动并与场景交互。这样就产生了两个主要挑战。 第一,ICP追踪假定每一帧都会产生由于摄像机运动而引起的刚性变换。用户在显示器前进行交互会引起独立于摄像机运动的场景运动,而这种运动使之前的假设不再成立。因为我们的ICP追踪是密集的(即用户所有可用点集),因此我们的系统在处理瞬时的场景运动时是有弹性的。例如,在图5中,即使当用户移动这个茶壶时,仍有足够多的背景点供ICP汇聚。但是,过大或太长的场景运动会造成追踪失败。 第二,而我们的系统支持实时重建,表面预测将会随着时间细化,这是利用一个连续的加权平均的距离值实现的。考虑到获得更快的模型更新通过调整权重,新的TSDF值将获得更高的优先级,但是这种权衡折中的代价是额外的噪声被引入重建当中。在实际运行中,权重的选择要对重建的质量以及基于场景内变化的重建定期更新这两个方面进行平衡。但是,这并不支持连续移动的场景。通常,用户自由地在场景中移动会造成相关的深度数据只能被部分的并入人体的范围。由于摄像机追踪直接依赖于这个模型,而这个模型在这种情况下与实时数据不一致,错误也就随之发生了。 ICP异常值分割 这里为核心GPU流水线提供了一种新扩展,用来着手探讨用户与重建场景之间的动态交互(图14)。这项技术采用了一种密集ICP追踪的独特的性质。当所有的深度测量都开启的时候,投影数据关联中的异常值会形成一个强有力的初步预测,这个预测关于部分独立于摄像机运动的场景运动——条件是有足够的刚性背景点足以使ICP仍旧收敛。我们的解决方案稳健地将一个移动中的前景物体从背景中分离出来,使追踪错误减少,并且使用户可以在场景中直接进行交互。 这种GPU流水线假定至少要刚性场景的一部分已经利用核心重建流水线初步重建完成(标记为a)。初始扫描过后,进入场景中的运动物体包含着定向点,这些点与已经重建的表面之间有着显著的差别。这些错误的ICP投影数据关联被复制到一个异常值映射(标记为b)。接下来,一个深度感知关联的组成分析开始在异常值映射上运行,来聚集大的相关的碎片并删除较小的由传感器噪声引起的异常值(标记为c)。在侦测到有前景场景运动处,大的相关的碎片被掩盖在输入深度映射用来核心“背景”重建(标记为d)。这会阻止在核心流水线中相关的前景深度测量被用于重建或追踪。大块的异常值可以利用第二个区块(潜在运行于一个有着不同重建设定的独立GPU)被另外重建。最后一步光线投射到两个独立的区块并且将两者的输出合成(标记为f),使用与图12相同的方法。 总的来说,我们的技术在稳定跟踪方面得到了引人瞩目的成果,而且因此提高了对于静态背景的重建质量,即使当场景的部分区域持续在镜头前运动时又能达到以上的效果。此外,这个技术可以健壮地分离出一个前景物体,并且潜在地独立于背景重建。 检测在任意曲面的触摸 流水线可以通过观察前景和背景之间的交叉部分进一步扩展到支持多点触摸输入。我们扩展背景体积的默认的光线投射,输出一个触摸地图,伪代码如列表4所示。使用光线投射的前景顶点地图作为输入,每个GPU线程再次沿光线通过背景体积。若过零点可以定位,则相应的前景顶点(沿相同的射线)将被检测(第6行)。若前景和背景在可变范围之内,则该前景位置是在触摸地图的输出上。触摸地图的深度关联的成分分析法不仅抑制了噪声,也随着跟踪时间的加长标注了图像域中的疑似指尖。在平面和非平面的表面上应用多点触摸的例子如图10和图16。 建立动态场景建模 目前已经可以从背景中稳定的区分出移动的前景,这提出了个有趣的问题:如何最好地重建这样的移动表面。面临的主要挑战就变成了如何把前景数据整合到第二个体积里面,这样表面测量值之间的对应关系就可以随着时间加长有所确保了。作为一个初步的探索,我们在另一个ICP实例中已经试验了单独预测前景对象的姿势。这次同样也是以密集ICP进行,但只使用前景有向点(从实时深度图和用光线投射的第二个体积得来)。在实践中,我们发现,即使前景的微小部分非刚性运动,密集ICP也收敛。一个令人信服的例子是即使手指的移动非刚性,用户的手臂(图15)的刚性部分ICP收敛。这提供了一个相对于全局摄像头变换,预测前景对象的姿势的粗糙方法。 使用此预测的姿势,可以对齐排列深度测量值并将其融合到所述第二体积。 前景的表面预测随着时间增加可以建立起来,并逐渐变得更加精细完整。由于前景表面可能会被移动,我们给予整合进来的新的测量值更多的权重。一个简单的扩展使用每体素的权重,该权重基于TSDF(整合之前)的导数的动态平均值不断调整。 这使我们能够调整单个表面体素的权重,当变化率 高的时候(如手指或手部)给新的测量值高权重,若TSDF测量值稳定(如前臂)降低其权重。 图16和图15中展示了基于前景ICP跟踪和每体素的自适应加权的初步结果。可以看出结果中比原Kinect的数据相当大的降低了噪音——用户的手臂,手和手指都清晰可辨——而这个前景重建发生在侧摄像机跟踪和背景重建的完善过程中。 对于我们的物理模拟,我们现在可以把整个前景重建表示为静态颗粒,使移动的用户和动态粒子之间的碰撞一帧一帧(如图9中所示)进行建模。这重建移动的前景的方法,也可以是纯粹用来跟踪,持在用户手中的刚性物体的姿势——使跟踪不依赖摄像机运动,并且无标记或该对象的先验知识。一个例子如图1(右一)所示是已经重建的茶壶(图5),六维自由度被跟踪并以真实的物理对象重新登记。 六 . 结论 我们提出了KinectFusion——用一个移动的标准Kinect实现实时三维重建交互系统。我们的贡献有三。 首先,详细描述了一个新的GPU流水线,只使用一种商用摄像头和图形硬件就可实时实现3D追踪,重建,分割,渲染和互动; 第二,已经验证了本系统核心的新应用方法:低成本的对象扫描和先进的AR和基于物理属性的交互; 第三,描述了同时进行分割,跟踪和重建动态用户和背景场景的新方法,使在任何室内场景任意曲面的几何形状上多点触控成为可能。 我们相信,这是第一次重建系统的用户在场景中直接交互达到这个级别。我们希望进一步扩展系统,重建更大的场景,在该场景中可能需要更有效的内存表示方法,如八叉树[29]。受我们的初步结果的鼓舞,我们也希望探索更细粒度的方法来跟踪和重建移动变形表面,包括用户。我们希望的是,无论是在底层技术,还是互动可能性上,KinectFusion都能打开许多新的课题研究。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |