基于神经渲染的下一代真实感仿真
仿真验证一直是自动驾驶研发中一个核心的议题,其在最终的上车部署前发挥着重要的作用,是持续集成中必不可少的一个步骤,可以帮助研发以比路测高成千上万倍的速度验证核心功能或进行回归测试。在现代L4级别自动驾驶系统中,一直难以实现全流程全链条的软件仿真测试。究其原因,核心在于无法有效仿真传感器,尤其是相机传感器的数据。故大多数仿真验证工作均局限于固定感知输入,验证规划控制以及自动驾驶系统的行为。这样的方法虽部分可达到验证的目的,但无法量化感知模块对整体自动驾驶系统性能的影响。
一个最直接的想法就是强行回放路测中的传感器数据,但是这样的想法忽略了自身行为变化导致的传感器视角变化以及对环境影响。换句话说,自身行为可能已经对世界线产生影响,我们将无法直接套用在路测中实际其他交通参与者的行为,也就是说在仿真开始之后,整个世界会裂变成多个“平行宇宙”,我们将无法获得在每个平行宇宙中的传感器真实数据,从而导致这种基于回放的仿真只能在非常短的时间内近似成立。
为了解决这样的问题,业界另一个常用的方法便是使用类似于Unreal的游戏引擎渲染图片作为虚拟传感器的输出。然而这样的方法也有致命的缺陷:由于游戏引擎渲染的图片和实际相机采集到的图片存在domain差异,直接使用在真实数据上训练的深度学习算法在这样的情况下可能导致非预期的性能下降,从而降低仿真测试本身的有效性,因为这样的失效在现实世界的路测中并不可能发生。当然有很多研究试图通过domain adaptation或style transfer这样的技术来弥补这两者之间的差异,但这样的方法虽然可以缓解问题,但其结果仍远差于同样domain中模型的结果,无法反应模型在真实场景中的性能。
基于Unreal引擎的虚拟仿真渲染
故我们借助近两年来迅猛发展的神经渲染(Neural Rendering)技术,试图全部从真实的路测数据中重建世界与车辆,并按需修改我们关心的其他车辆的行为。这样能够最大限度保障模型在实际部署与仿真测试之间的一致性。简单而言,我们将此任务分为背景重建,动态物体重建,以及在线渲染与后处理三大模块。
与传统的NeRF方法不同,在自动驾驶场景中,一般会安装高精度的LiDAR,即可以提供相对准确的稀疏深度信息。而且由于相对完善的感知和定位算法,我们可以较为轻松可靠地去除自身运动和区分场景中潜在的移动物体。这两点均为高质量的背景建模提供了便利。一方面准确的深度信息可以帮助我们更有效地在每一个Ray上采样积分点,这大大提升了建模质量与NeRF模型的训练收敛速度。这使得我们大幅加快了大规模NeRF训练的速度:我们可以在单机8卡2080Ti服务器上在2小时之内重建出1km的背景。辅以分治等策略,我们完全可以在可承担的成本之内在几天之内完成几百公里的路线重建。如下面视频所示。
上:背景重建 下:原始路测
https://www.zhihu.com/video/1531316290030956544
当然,为了满足仿真测试的需求,我们也可以在这段路上自由移动视角。
https://www.zhihu.com/video/1531246026254331904
对于移动物体,由于在路测过程中经常会有车辆从后方超越,借助我们高精度的感知结果,我们便可以获得其多视角的图像和点云数据。我们可以对于每个instance训练一个独立的NeRF模型建立起Object Bank方便后续使用。
在渲染与生成过程中,我们可以按需叠加任意的背景与移动物体,并控制自车与其他车辆的轨迹。这个步骤与经典的NeRF方法基本无异。然而直接叠加这两者并不能取得满意的效果,除一些树枝等非常细微的物体之外,我们发现主要的干扰因素来源于移动物体投射在地面上的阴影,这会导致部分的背景区域的光照随之改变,打破了NeRF的基本假设。当然我们可以使用一些深度学习的算法去检测甚至去除阴影,因为我们有物体的GPS坐标,3D尺寸,以及具体的时间点,故可简单地查询太阳方位角,计算车辆的投影区域,我们发现这样简单的方法已足以取得令人满意的效果。同样,如果必要,我们可以在渲染阶段,自行添加物体阴影让渲染出的图片更加自然。
下面有两个实际的例子,来证明这套方法的有效性。第一个例子中,我们模拟出了一些在路测中较为少见的corner case:有车辆从紧急车道快速超车,并从自车前方切入。这样的场景出现概率极低,基本在几万公里出现一次。但是借助这样的真实感仿真系统,我们可以轻易地模拟出这样的case,随心替换车的类型,并调整cutin的激进程度。
https://www.zhihu.com/video/1531236546962948096
https://www.zhihu.com/video/1531236644887257088
https://www.zhihu.com/video/1531236686784143361
https://www.zhihu.com/video/1531236716769226752
同时可以看到,我们使用与车载部署相同的检测器模型,在这样的生成图片上仍可得到稳定的检测结果,与实际路测中的表现无异。在下面遮挡的case中,检测器的输出出现了小幅度的抖动,这也是符合实际路测中的表现的,这样能够更好地测试出在这样的hard case中,整体系统的性能表现。避免因直接输出给下游GT,导致的不真实仿真。通过这样的手段,我们就能打通整体端到端全链条仿真的流程。
https://www.zhihu.com/video/1531237589042700288
https://www.zhihu.com/video/1531237608671272963
第二个例子中,我们尝试变换传感器的高度与视角,可以看到使用单一视角训练的传感器数据,可以很好地渲染出不同高度与焦距的摄像头数据。这节省了很多对于新布局的探索与尝试的时间,可以在传感器实际安装上车前便可知晓盲区与算法大概的效果,方便研发人员评估。
https://www.zhihu.com/video/1531253708771438592
当然这个系统目前也并非完美,由于对于前景动态物体的刚体假设,使得我们对于诸如人或者拖车这样的非刚性物体的建模效果不佳。这都是我们后续会深入研究和探索的课题。我们非常欢迎对这个问题有兴趣的同学加入我们,来一起将这项技术规模化、实用化!另外感谢参与本项目的两位同学Yan Yan和Yuntao Chen,大家如果有更深入的问题也可以和他们直接交流! 看到放出的是nerf render的结果 请问你们nerf render到mesh做的如何? nerf的render效果很棒 但simulation的终极目标还是crate a world,如果能有完美的mesh 再结合 nerf的render 这样就可以随意创造高保真corner case了 mesh只是世界的一种表示,nerf也是。没有必要nerf一定要转成mesh。 是的 我想的是对于创造任意corner case上还是很缺乏 同时现在nerf render也不是各方面完美 比如视频中很明显的tree 高速仿真还好 城市的场景下就[捂脸] 不过你们做的很棒了[赞] 我也在做这个 希望赶上你们 项目链接或论文呢? 嗯,树其实不能认为是一个纯静止的东西,nerf的基础假设不太成立了,这面确实需要更多的研究 不是paper,这是公司内部的项目 看来做出来了。国内腾讯tad sim、51这些,连最原始的sim2real都没玩明白。 请问是哪家公司呀 百度下看看作者是谁