虚拟现实（VR）和增强现实（AR）背后的核心技术是什么？
AR是人工智能和人机交互的交叉学科，基础技术包括CV（计算机视觉）、机器学习、多模态融合等，借凌老师去年的一篇文章简单科普AR技术。 作者亮风台信息科技首席科学家凌海滨 一、从现实到增强现实 增强现实（AugmentedReality，简称AR）和虚拟现实（VirtualReality，简称VR）概念的出现已经有了几十年的历史了，然而VR/AR大量出现在科技媒体上吸引各方眼球也就是最近的事情。 AR中的R是真实的R，相比之下，VR中的R就是个山寨版的。那么A这个增强的概念就比较广大虚了：笼统的说，凡是能对R有附加额外的信息的都算。再次强调的是，AR里面的信息是叠加到真实的场景里面的，而不是虚拟的场景（即VR）里面的。一个有意思的小众研究方向是将一部分真实场景中的内容叠加到虚拟场景中，学名AugmentedVirtualization，简称AV。 图2中的例子也许能更好地反映AR和VR的区别。上方显示的是典型的VR设备和人眼接收到的VR影像，下方则是AR设备和AR影像。简而言之VR和AR的区别是：VR是趋近现实；AR是超越现实。 接下来我们主要讨论AR，重点讨论AR和VR不同的那一部分。 二、AR中的视觉技术 按照Ronald Azuma在1997年的总结，增强现实系统一般具有三个主要特征：虚实结合，实时交互，和三维配准（又称注册、匹配或对准）。近二十年过去了，AR已经有了长足的发展，系统实现的重心和难点也随之变化，但是这三个要素基本上还是AR系统中不可或缺的。 上图描绘了一个典型的AR系统的概念流程。从真实世界出发，经过数字成像，然后系统通过影像数据和传感器数据一起对三维世界进行感知理解，同时得到对三维交互的理解。3D交互理解的目的是告知系统要“增强”的内容。 在AR的技术流程中，中间的对于环境和交互的精准理解就是目前的瓶颈了。上图中间的基于多模态（简单说就是影像+传感器）的环境和交互理解，是两个充满了各种或明或暗的坑的领域，足以让很多假的猛士知难而退。 那么，真的猛士将会直面什么样惨淡和淋漓的坑群呢？下面我们来共同赏析几个常见坑型： 1、环境坑：据说人的脑细胞里面大多数都是用来处理和理解双眼所获取的视觉信息的，很多我们惊鸿一瞥就能理解和感知的东西得益于我们强大的脑处理能力。各种环境变化对视觉信息的影响我们不但能轻松应对，有时还能加以利用。比如我们的认知能力对光照明暗的变化相当的鲁棒；比如我们可以通过阴影来反推三维关系。而这些对于计算机（确切些说是计算机视觉算法）来说都是不折不扣的坑或者大坑。总的来说，成像环境的变化常常计算机视觉算法以及AR带来很大的挑战，所以我把相关的坑统称环境坑。 2、学术坑：对于环境和交互的理解重建基本上属于计算机视觉的范畴，计算机视觉是一个有着半个世纪积累的领域，和AR相关的学术成果可以成吨来计。夸张一点的说，每篇都有坑，区别只在大小深浅明暗。从实用的解决方案的角度来看学术论文，尤其是新的论文，一定要小心其中的设定和有些话外的信息，多想一下诸如该算法是否对光照敏感，是否可能在手机端达到实时，等等。简单的建议是：对于一篇计算机视觉的论文，未有相关经验的观众请在有相关训练的成熟观众陪伴下谨慎观看。 3、上帝坑：上帝是谁？当然就是用户了。上帝的坑当然得长得有创意，常常激起开发者灵光一动恍然大哭的欲望。比如上帝说，要能判别视频中人的性别，80%的准确度，100万。哇，你是不是感动的热泪盈眶（仁慈的上帝啊），用各种时髦的方法轻松超额10%搞定。可是，交货的时候上帝说你这个系统咋认不出我们家小baby的性别啊！Oh my God，你是不是又激动得想哭了。和环境坑比较像，CV的算法很多时候是需要有假设的，强烈的假设。那怎么办呢？上帝总是正确的，所以唯一的办法就是尽早教育上帝让他更加正确：需要苦口婆心地尽早和用户科普以及尽量明确定义需求，防范坑于未成。还不行的话咋办？上帝啊，请再加点工钱吧。 其实还有其他类型的坑，比如开源代码坑，这里就不详述了。那么，这么一个充满忧患的领域，为什么又会有那么多追随呢？最重要的原因就是巨大的应用前景和钱景了。往小了说，很多具体的应用领域（比如游戏）都已经成功地引入了AR的元素；往大了说，AR的终极形态可能从根本上改变当前的非自然人机交互模式（请脑补微软Win95的成功和现在的HoloLens）。上面说的那些坑，在很多是应用上，是可能避免的或者可能填得不那么深的。总的来说，一个好的AR应用往往是需要算法工程实现、产品设计、内容制作等方面的深度结合。 三维配准是链接虚实的最核心技术，没有之一。大致说来，在AR中配准的目的是对影像数据进行几何上的精确理解。这样一来，就决定了要叠加的数据的定位问题。比如说，在AR辅助导航中如果想把导航箭头“贴在”路面上，就一定要知道路面在哪里。在这个例子中，每当手机摄像头获取到新一帧图像，AR系统首先需要将图像中的路面定位，具体的说就是在某个事先设定的统一的世界坐标系下确定地面的位置，然后将要贴的箭头虚拟地放在这个地面上，再通过与相机相关的几何变换将箭头画在图像中相应的位置（通过渲染模块完成）。 如前所述，三维跟踪配准在技术上存在很多挑战，尤其在考虑到移动设备有限的信息输入和计算能力的情况下。鉴于此，在基于视觉AR的发展历程中，经历了从简单定位到复杂定位的几个阶段，下面简单介绍一下这个发展过程，更多的技术细节在下一节讨论。 在以上提到的技术中，二维码和二维图片的识别跟踪技术已基本上成熟，也已经有了广泛的应用。技术方面的发展目标主要是进一步提高稳定性以及拓宽适用范围。相比而言，三维物体和三维场景的识别理解还有很大的探索空间，即使是目前火爆的HoloLens所展现的令人惊艳的跟踪稳定性，从追求完美的角度还有很多可以提升的空间。 三、单目AR识别跟踪简介 由于识别跟踪的重要性，下面简单介绍一下AR中的二维图片跟踪和三维环境理解。二维码的技术已经很成熟而应用有较受限制，三维物体识别的技术大致上介于二维图片和三维场景之间，所以就偷懒不提了。 一般情况下， AR中二维平面物体的跟踪可以归结为如下问题：给定一个模板图片R，在视频流中时刻检测该图片的（相对相机的）三维精确位置。比如在下图的例子中，R是实现知道的人民币图片，视频是从手机端实时获取的，通常记为It (表示在时间t获得的视频图像），而需要得到的是R在It 中的几何姿态（通常包括三维旋转和平移），记为Pt。换句话说，模板图片R通过由Pt表示的三维变换就可以被贴到它在图像It中的位置。跟踪结果的用途也很显然，既然知道了这个姿态Pt，我们可以用一个美元的图片以同样的姿态叠加到视频中来替换人民币，从而达到6倍以上的炫富效果。好吧，例子中没有那么俗气，而是叠加了一个庄严的视频。 那么，上面例子中的跟踪定位是如何做到的呢？主流的方法大致有两类，一类是直接法（directmethod，有时也称为全局法），另一类叫控制点法（keypoint-based）。 当然，实际操作时候上面三个部分都各有讲究。比如（1）中对于T和R是否相似可能要考虑光照的变化，（2）中如何定义姿态空间的邻域以及合理的邻域大小，（3）中具体用什么样的优化算法来尽量对抗局部极值的干扰而又不能太耗时。不同的处理方式产生出了不同的跟踪算法，其中典型的代表工作之一是ESM算法和它的一些变种。 ESM是EfficientSecond-order Minimization的缩写，源自Benhimane和Malis在2004年在IROS上发表的工作。该算法采用重构误差平方作为衡量R和T相似性的指标，然后对于姿态空间进行了在李群（Lie Group）上的重新构建使得搜索的步长更为理性，在寻优上面使用的二阶近似的快速算法。这个算法的结构清晰，各模块都可以比较容易的独立扩展，所以在其基础上衍生出了不少改进算法，通常是针对实用场景中不同的调整（比如处理强光照或者运动模糊）。 稍微数学一点的解释是这样的：由于姿态Pt是由若干参数（一般是8个）控制的，那么求解Pt的一个办法是弄一个方程组出来，比如说8个线性的方程，那么我们就可以求出Pt了。那么这些方程怎么来呢？我们知道，Pt的作用是把模板R变到图像It中，也就是说R中的每个点经过一个由Pt决定的变换就可以得到它在图像中的位置。那么，反过来，如果我们知道图像中的一个点（比如眼角）和模板中就是同一个点（就是说他们匹配上了），我们就可以用这一对匹配点给出两个方程（X、Y坐标各一个），这样的点就是所谓的控制点。当我们有了足够多的控制点对以后，就可以求解姿态Pt了。 总结起来，控制点法包括三个主要元素：（1）控制点提取和选择，（2）控制点匹配，（3）姿态求解。控制点的基本要求一是要能从周围环境中脱颖而出（减少位置上的歧义），而是要经常而且稳定地出现（易于找到）。各种图像中的角点因此闪亮登场，各种PK。比较知名的有SIFT、SURF、FAST等。注意，上述排名分先后的：按照能力来说越往前越好，按照速度来说越往后越好。实际应用中可以根据用户机型做决定。那么，这些点提取后就可以用了吗？No，一般来说还需要进行取舍：一是要去掉没用的点（即outlier），二是使选取后的点尽量均匀以降低不必要的误差，同时也要防止点太多带来的大量后续计算。控制点匹配的目的是在两个图像的控制点集间找到匹配的点对（鼻尖对鼻尖，眼角对眼角）。通常这个由控制点之间的相似性和空间约束协同完成。简单的方法有紧邻匹配，复杂的基本上二分匹配的各种变种（bipartitematching or two-dimensional assignment）。完成了匹配之后，就可以求解得到姿态Pt了：由于通常使用的点数远多于最小需求（为了稳定性），这里的方程数目远大于未知变量的数目，所以最小二乘法之类的解法在这里会派上用场。 以上三个步骤初看起来泾渭分明，实际使用时却经常是交织在一起的。主要原因是很难保证得到精确无误的控制点。有用的可靠控制点常常夹杂在各种真假难辨的山寨们一起到来，所以经常需要往返迭代在三个步骤之间，比如用RANSAC之类的方法选择控制点来得到服从大多数的姿态。相比直接法，控制点法的基本算法框架比较成熟，工程实现上的细节很大程度上决定了算法的最终效果。 这两类方法的优缺点根据具体实现略有不同，大致上可以总结如下： 这两类方法的优缺点有很明显的互补性，所以一个自然的想法就是二者的结合，具体的方式也有不同变种，这里就不罗嗦了。 对于三维环境的动态的实时的理解是当前AR在技术研究方面最活跃的问题。其核心就是最近火热的“即时定位与地图构建”（SLAM，SimultaneouslyLocalization And Mapping），在无人车，无人机和机器人等领域也起着核心作用。AR中的SLAM比其他领域中一般难度要大很多，主要是因为AR赖以依存的移动端的计算能力和资源比起其他领域来说要弱很多。目前在AR中还是以视觉SLAM为主，其他传感器为辅的局面，尽管这个情况正在改变。下面的讨论主要局限于视觉SLAM。 标准的视觉SLAM问题可以这么描述为：把你空投到一个陌生的环境中，你要解决“我在哪”的问题。这里的“我”基本上等同于相机或者眼睛（因为单目，即单相机，请把自己想象成独眼龙），“在”就是要定位（就是localization），“哪”需要一张本来不存在的需要你来构建的地图（就是mapping）。你带着一只眼睛一边走，一边对周边环境进行理解（建图），一边确定在所建地图中的位置（定位），这就是SLAM了。换句话说，在走的过程中，一方面把所见到（相机拍到）的地方连起来成地图，另一方面把走的轨迹在地图上找到。下面我们看看这个过程大致需要哪些技术。 从图像序列反算出三维环境的过程，即mapping，在计算机视觉里面属于三维重建的范畴。在SLAM中，我们要从连续获取的图像序列来进行重建，而这些图像序列是在相机的运动过程中采集的，所以相关的技术就叫基于运动的重建（SfM，Structurefrom Motion）。题外话，SfX是视觉中泛指从X中进行三维重建的技术，X除了运动以外还可以有别的（比如Structurefrom Shading）。如果相机不动怎么办？很难办，独眼龙站着不动怎么能知道周围三维的情况呢？原理上来说，一旦获取的两张图像之间有运动，就相当与有两个眼睛同时看到了场景（注意坑，这里假设场景不动），不就可以立体了吗？这样一来，多视几何的东西就派上用场了。再进一步，运动过程中我们得到的实际是一系列图像而不只是两张，自然可以用他们一起来优化提高精度，这就是令小白们不明觉厉的集束约束（BundleAdjustment）啦。 那么localization又是怎么回事呢？如果有了地图，即有了一个坐标系，定位问题和前述2D跟踪在目的上基本一致（当然更复杂一些）。让我们考虑基于控制点的方法，那么现在就需要在三维空间找到并跟踪控制点来进行计算了。很巧的是（真的很巧吗？），上面的多视几何中也需要控制点来进行三维重建，这些控制点就经常被共用了。那么可不可以用直接法呢？Yes wecan！但是，如后面会讲到的，由于目前AR中计算资源实在有限，还是控制点法经济实惠些。 从三维重建的方法和结果，SLAM大致可以分为稀疏、半稠密和稠密三类。下图中给出的典型的示例。 由于稀疏SLAM在AR中的流行度，下面我们简单介绍一下PTAM和ORB-SLAM。在PTAM之前，由A. Davison在2003年提出的单目SLAM开创了实时单目SLAM的先河。这个工作的基本思想还是基于当时机器人等领域的主流SLAM框架的。简单地说，对于每一帧新到来的图像，进行“跟踪-匹配-制图-更新”的流程。然而这个框架在移动端（手机）上的效果和效率都不尽人意。针对移动端AR的SLAM需求，Klein和Murray在 2007年的ISMAR（AR领域的旗舰学术会议）展示了效果惊艳的PTAM系统，从而成为单目视觉AR SLAM的最常用框架，暂时还是之一。 PTAM的全称是ParallelTracking And Mapping，上面已经暗示过了，PTAM和之前的SLAM在框架是不同的。我们知道，SLAM对每一帧同时（Simultaneously）进行两个方面的运算：定位（Localization）和建图（Mapping）。由于资源消耗巨大，这两种运算很难实时的对每一帧都充分地实现。那我们一定要每一帧都同时定位和建图吗？先看定位，这个是必须每帧都做，不然我们就不知道自己的位置了。那么制图呢？很幸运，这个其实并不需要每帧都做，因为隔上几帧我们仍然可以通过SfM来感知场景。试想一下，把你扔到一个陌生的场景，让你边走边探索周边环境，但是每秒钟只让你看10眼，只要你不是在飞奔，相信这个任务还是可以完成的。PTAM的核心思想就在这里，不是simultaneously定位和制图，而是把他们分开，parallel地各自奔跑。这里的定位以逐帧跟踪为主，所以就有了tracking。而制图则不再逐帧进行，而是看计算能力而定，啥时候处理完当前的活，再去拿一帧新的来看看。在这个框架下，再配合控制点选取匹配等各项优化组合，PTAM一出场就以其在华丽丽的demo亮瞎观众（这可是近10年前啊）。 故事显然没有这样结束。我们都知道，demo和实用是有差距滴，何况还是学术界的demo。但是在PTAM思想的指引下，研究人员不断的进行改进和更新。这其中的佼佼者就有上面提到的ORB-SLAM。ORB-SLAM由Mur-Artal,Montiel和Tardos在2015年发表在IEEETransaction on Robotics上，由于其优异的性能和贴心的源码迅速获得工业界和学术界两方面的青睐。不过，如果打算通读其论文的话，请先做好被郁闷的心理准备。不是因为有太多晦涩的数学公式，恰恰相反，是因为基本上没有啥公式，而是充满了让人不明觉厉的名词。为什么会这样？其实和ORB-SLAM的成功有很大关系。ORB-SLAM虽然仍然基于PTAM的基本框架，不过，做了很多很多改进，加了很多很多东西。从某个角度看，可以把它看作一个集大成的且精心优化过的系统。所以，区区17页的IEEE双栏论文是不可能给出细节的，细节都在参考文献里面，有些甚至只在源码里。在众多的改进中，比较大的包括控制点上使用更为有效的ORB控制点、引入第三个线程做回环检测矫正（另外两个分别是跟踪和制图）、使用可视树来实现高效的多帧优化（还记得集束约束吗）、更为合理的关键帧管理、等等。 有朋友这里会有一个疑问：既然ORB-SLAM是基于PTAM的框架，那为啥不叫ORB-PTAM呢？是酱紫的：尽管从框架上看PTAM已经和传统SLAM有所不同，但是出于各种原因，SLAM现在已经演变成为这一类技术的统称。也就是说，PTAM一般被认为是SLAM中的一个具体算法，确切些说是单目视觉SLAM的一个算法。所以呢，ORB-PTAM就叫ORB-SLAM了。 尽管近年来的进展使得单目SLAM已经能在一些场景上给出不错的结果，单目SLAM在一般的移动端还远远达不到随心所欲的效果。计算机视觉中的各种坑还是不同程度的存在。在AR中比较刺眼的问题包括： 对AR行业动态有了解的朋友可能会有些疑惑，上面说的这么难，可是HoloLens一类的东西好像效果还不错哦？没错，不过我们上面说的是单目无传感器的情况。一个HoloLens可以买五个iPhone6S+，那么多传感器不是免费的。不过话说回来，利用高质量传感器来提高精度必然是AR SLAM的重要趋势，不过由于成本的问题，这样的AR可能还需要一定时间才能从高端展会走到普通用户中。 四、SMART：语义驱动的多模态增强现实和智能交互 单目AR（即基于单摄像头的AR）虽然有着很大的市场（想想数亿的手机用户吧），但是如上文所忧，仍然需要解决很多的技术难题，有一些甚至是超越单目AR的能力的。任何一个有理想有追求有情怀的AR公司，是不会也不能局限于传统的单目框架上的。那么除了单目AR已经建立的技术基础外，AR的前沿上有哪些重要的阵地呢？纵观AR和相关软硬方向的发展历史和事态，横看今天各路AR诸侯的技术风标，不难总结出三个主要的方向：语义驱动，多模态融合，以及智能交互。遵循业界性感造词的惯例，我们将他们总结成： 即“语义驱动的多模态增强现实和智能交互”。由于这三个方面都还在飞速发展，技术日新月异，我下面就勉强地做一个粗浅的介绍，表意为主，请勿钻牛角尖。 语义驱动：语义驱动在传统的几何为主导的AR中引入语义的概念，其技术核心来源于对场景的语义理解。为什么要语义信息？答案很简单，因为我们人类所理解的世界是充满语义的。如下图所列，我们所处的物理世界不仅是由各种三维结构组成的，更是由诸如透明的窗、砖面的墙、放着新闻的电视等等组成的。对于AR来说，只有几何信息的话，我们可以“把虚拟菜单叠加到平面上”；有了语义理解后，我们就可以“把虚拟菜单叠加到窗户上”，或者邪恶地“根据正在播放的电视节目显示相关广告”。 相比几何理解，对于视觉信息的语义理解涵盖广得多的内容，因而也有着广得多的应用。广义的看，几何理解也可以看作是语义理解的一个子集，即几何属性或几何语义。那么，既然语义理解这么好这么强大，为啥我们今天才强调它？难道先贤们都没有我们聪明？当然不是，只是因为语义理解太难了，也就最近的进展才使它有广泛实用的可能性。当然，通用的对任意场景的完全语义理解目前还是个难题，但是对于一些特定物体的语义理解已经在AR中有了可行的应用，比如AR辅助驾驶和AR人脸特效（下图）。 多模态融合：随着大大小小的AR厂家陆续推出形形色色的AR硬件，多模态已经是AR专用硬件的标配，双目、深度、惯导、语音等等名词纷纷出现在各个硬件的技术指标清单中。这些硬件的启用显然有着其背后的算法用心，即利用多模态的信息来提高AR中的对环境和交互的感知理解。比如，之前反复提到，作为AR核心的环境跟踪理解面临着五花八门的技术挑战，有些甚至突破了视觉算法的界限，这种情况下，非视觉的信息就可以起到重要的补充支持作用。比如说，在相机快速运动的情况下，图像由于剧烈模糊而丧失精准性，但此时的姿态传感器给出的信息还是比较可靠的，可以用来帮助视觉跟踪算法度过难关。 智能交互：从某个角度来看，人机交互的发展史可以看作是追求自然交互的历史。从最早的纸带打孔到如今窗口和触屏交互，计算机系统对使用者的专业要求越来越低。近来，机器智能的发展使得计算机对人类的自然意识的理解越来越可靠，从而使智能交互有了从实验室走向实用的契机。从视觉及相关信息来实时理解人类的交互意图成为AR系统中的重要一环。在各种自然交互中，基于手势的技术是目前AR的热点。一方面由于手势的技术比较成熟，另一方面也由于手势有很强的可定制性。关于手势需要科普的一个地方是：手势估计和手势识别是两个紧密相关但不同的概念。手势估计是指从图像（或者深度）数据中得到手的精确姿势数据，比如所有手指关节的3D坐标（下图）；而手势识别是指判断出手的动作（或姿态）说代表的语义信息，比如“打开电视”这样的命令。前者一般可以作为后者的输入，但是如果手势指令集不大的情况下，也可以直接做手势识别。前者的更准确叫法应该是手的姿势估计。 五、结语 增强现实的再度兴起是由近年来软硬件的进展决定的，是科学和技术人员几十年努力的推动成果。一方面，很幸运我们能够赶上这个时代提供的机会；另一方面，我们也应该警惕过度的乐观，需要脚踏实地得趟过每一个坑。