自动驾驶技术专场——基于征程5的BEV感知方案与部署实践 | 「你好,开发者」精彩实录
2023/11/23
地平线「你好,开发者」栏目推出自动驾驶系列技术专场,本文实录整理自地平线感知算法工程师朱红梅主讲的《基于征程5芯片的BEV感知方案与部署实践》主题分享。
即刻扫描下方海报二维码,获取本期精彩内容回放。同时,欢迎您持续关注地平线「你好,开发者」栏目,更多技术干货内容持续输出。
01 BEV感知框架总体介绍
随着2021年征程5芯片的发布,我们基于征程5芯片设计了 BEV的感知原型方案,输入的是车载多视角的图像序列或者多模信号,在网络内部进行时空维度的中融合,使得神经网络能够原生输出鸟瞰视角下的动静态感知、预测结果。
02 时空融合模块与芯片部署
03 静态与Occupancy感知要素解析
静态感知的一个重要的组成就是真值,BEV上的真值是怎么来的呢?
从最开始研发到现在,用到过三种静态真值。最开始用过高精地图,现在大规模使用的是基于多模的真值生产链路,目前也有纯视觉的局部建图结果参与到了训练当中。对于建图质量的好坏,是由我们公司专门的4D-Label团队负责开发。在地平线「你好,开发者」自动驾驶技术专场上一讲,地平线4D标注技术负责人隋伟博士也跟大家分享了《面向BEV感知的4D标注方案》,如果感兴趣可以去回顾一下。
对于算法而言,算法同学要更多地参与到标注规则的制定。即使真值是大模型刷的,大模型也需要真值,所以标注规则需要感知算法的同学深入参与,特别是实际测试场景是非常复杂的。标注规则的一个参考条件是建图得到的Lidar点云底图,是一个BEV上的强度图,再通过参考图像或者视频去判断,才能去标注。比如车道线,要标注颜色、一些功能属性和一些下游功能所必须的且从Lidar底图上无法得到的,都需要结合图像去做。对于路面标志一般都是去标旋转框,对需要有明确方向指向的,需要标有序的点列。泊车的要素基本上是以关键点的标注方式去标车位、轮档器、减速带等。
04 动态感知预测端到端与芯片部署
下面介绍一下动态感知预测端到端的方案以及芯片部署情况。
进一步看一下端到端模型的性能。端到端对比的是只做检测通过后处理去做跟踪和速度估计。这里对比的baseline检测,已经是 BEV上的3D检测。相比原本的2D检测,在测距上已经有非常明显的优势了。蓝色和绿色是2D检测在不同距离段的纵向误差百分比,红色和紫色是 BEV3D的,可以看到在这个比较好的baseline的基础上,端到端的模型是相对BEV3D更有优势的。
首先看一下测距测速。端到端在动态的三类障碍物上,测距和测速都是有明显的优势。这里的误差越低越好,以及这里是误差下降的百分比,尤其是速度优势特别明显。轨迹对比的是一个级联的模型,它的输入是 BEV上3D检测的动态后处理,还有车道线的静态后处理做完环境重建的一些向量信息,是一个单独的轨迹预测模型。端到端输入的是图像,直接输出的是轨迹。两者相比,在这个点列的位置误差上面,端到端在三类上面也是有明显的优势的。
这边也是给了一个可视化的视频。图里面的框就是目标,黄线是代表横向和纵向的速度,粉线是轨迹。可以看到从右侧过来的目标在经过前方的时候,虽然被这里的目标遮挡,但它还是能稳定出现的。对于刚才说的速度优势,尤其是像停在旁边的这一类目标,一般如果是检测框,一旦有抖动超出了后处理能cover的范围,就会出现一个比较大的速度,从而去触发一条轨迹,造成自车的一些点刹等现象。像这里停在旁边的是非常稳的,速度基本上都是和实际是相符合的。
05 实车部署与闭环验证
最后一部分介绍一下实车闭环的时候,跟模型相关的几个关键问题。
首先,部署前肯定要做模型的量化和编译。专业的量化的流程以及方式方法,我们后续也安排了公开课做分享,我这里主要是从一个用户的角度看这个事情。
对于一般的模型,像基于CNN的,我们直接单任务float,训完之后直接训qat,这些基本上不掉点。多任务中间会加一个freezebn,使得统计出来的bn能够适用于各个任务。
对于复杂的模型中间会加一步calibration。这里想要重点说的就是 calibration。以我们做端到端模型部署为例,就单任务模型而言,前期端到端直接 float训qat,掉点是非常多的。请教了工具链的同事之后,建议我们做calibration。但calibration做完发现 qat虽然有大幅的提升,但还是和float有较大的差距。工具链的同事建议去固定住 weight或者feature的scale。实际的来看固定feature的scale是比较有效的,但尽管这样也没有完全解决端到端上面几个任务的qat输出的问题。
那问题出在哪?也是趟了一些坑,其实现在想就很简单。我们要去算合适的feature scale,做calibration时要选择恰当的数据。比如速度,我们前期用的是城区场景的数据去做速度的feature scale的估计,发现训出来的qat模型在高速场景下的 qat指标相比于 float掉点比较厉害。后来通过工具链的工具,一层层分析模型发现确实找不到模型上的问题。如果模型实在没问题,那就是数据的问题了。最后我们采用了一个高速的数据集。因为calibration本身训练步数不多,所以要选择能够覆盖感知的量,能达到最大值和最小值的上限下限,才能估计出比较合适的量化的scale。
尽管做了这一步操作,量化问题已经大大解决了。但是,工具链的标准一般是 qat和float的差距不能大于1%。做完这两步,它还是达不到这个水平。那么还在哪里出了问题呢?后来也是一顿摸索,发现在BEV上做3D感知的很多量都是有物理意义的。最终结论就是对一些有物理意义的计算层固定scale。固定的scale从哪来呢?比如刚才前面提到query索引 BEV上的feature有warping操作 ,计算offset的两个输入是有明确的物理意义的。当模型结构确定之后,BEV上的 meshgrid的最大值、最小值,还有query index的最大值、最小值,都是已经定了,这样就可以算出来矩阵的最大值、最小值,进而算出固定的scale。
还比如以odometry作为模型输入,calibration的数据可能是以中等速度行驶采集,但实际大规模数据训的时候,自车运动的速度也可能发生变化。所以对这种有明确交规规定的物理量,也能够拿到最大值、最小值。用类似这个思路,去检查网络里面有物理意义的一些数值计算的层,把固定的scale算出来。通过这几个操作解决了端到端模型的qat问题,也是趟了很多坑趟出来的经验,来跟大家分享一下。
做完了量化就是编译。编译就是编译器直接qat转了中间格式hbir,最后再得到真正板上部署的 hbm格式,具体的细节也是后续有分享去介绍。这里主要是说一下BEV感知实际部署时候的表现。
大范围的BEV是以前向100、后向30、左右各50的感知范围,小范围是以前向20、其他三个方向10米的感知范围,去做BEV上的要素感知。在征程5单核上,比如泊车小范围,单核、单帧的多任务模型可以达到70fps以上;行车的大范围也可以达到30fps以上。就算加了端到端,直接输出到轨迹预测的模型也能达到20fps以上,这是在单核的情况。而征程5上是有双核,在模型调度上帧率可以进一步提升。
部署的时候检验的是模型的泛化性。因为客户的车的车型是不一样的,相应的相机安装位置、朝向可能都有差异。我们的BEV模型,特别是在原型开发阶段,有很多前期验证的客户,所以一个模型尽量能够支持多款车型的部署,这对模型的泛化性要求很高。我们也探索了很多,最后发现前面介绍的四平面的空间融合方法,一开始已经打了一个比较好的基础。这里举的例子是训练数据都是用SUV采集的,评测的时候用轿车的数据。如果是单平面,它相比四平面已经有7个多点的掉点了。
在四平面比较好的泛化的基础上,我们再去开发一些训练上面的增强策略。这里比较有效的两个方法:一个是BEV模型一阶段对图像进行摄像头rpy的扰动,模拟车辆行驶的过程的颠簸情况,做图像增强;另外,是在做视角转换的地方假设平面,然后对camera出 VCS的平面上做平面增强,也是假设 rpy的扰动。
带上这两个扰动策略,在SUV车型采集的训练集训,在轿车采集数据集上测,可以达到这样的性能(AP 72.60),和我们加入了大概20来天采集接近100万的数据去训的一个适配轿车的模型,在同样的评测集去评,达到了相近的性能。所以由这几个策略feature保证了我们现在这一套BEV感知模型,在实际部署时的泛化性。
部署后考验的是模型闭环迭代的速度。特别是在前期原型方案验证阶段,通过共版本去支持不同的实车安装部署的demo闭环验证。对于BEV训练框架而言,可以支持任意摄像头配置。比如说11v/9v/7v,7v里面可能把4v周视替换成4v鱼眼,或者是其他任意多个视角,都可以参与到模型训练当中。部署的时候按相应的摄像头配置去做编译,就可以去做相应的测试。
另一个就是模型的训练速度,尤其是时序融合上来之后,在不优化的情况下,假如单帧训练5天,10帧是线性的,会带来10倍的训练时长,这肯定是不能接受的。我们肯定要做优化,也有框架开发的同学专门对我们进行指导去做优化。目前,在优化后训练速度提升了56%。
具体来说,目前多任务发版,十几个任务头的多任务,大概时序端到端训练能够在一周内完成。后面的评测或者是历史的一些数据的case CICD都是自动化的,从而保障了训练发版这一步的高效性。
另一个重要的因素,特别是在实车测试前期都会反馈一些不work的case——Badcase数据回来。怎么把这些数据用到训练里面去呢?一般有两种针对Badcase的优化:一种是从采集数据里面挖掘,这是比较常规的;另一种是能够把返回的Badcase数据直接用起来。
对于像2D感知,之前我们做量产这一条链路都是比较成熟的。对于BEV感知,它的区别是看刷库的模型怎么来的,或者送标的数据是怎么来的。对于动态而言,用纯视觉大模型,不受板上op和算力限制。我们有大模型团队,专门开发的纯视觉BEV大模型,目前也已经用在动态的Badcase处理链路里面,去生成一个伪GT参与训练。静态这块有纯视觉的建图方案,同样可以将底图送标,目前也已部署到BEV上静态感知Badcase链路里面了。其实模型部署后,很多都是一些基建问题。目前,地平线对于BEV感知的基建基本成熟了。
今天我的分享就是这些内容,主要是想传达几个意思。首先,基于征程5芯片确实能干很多事情,我们在上面也干了很多事情。对于BEV感知方案而言,可以看到我们有比较好的baseline去做参考进行迭代,这样得出来的结论也是相对solid。
另外,如果线上有同学正在基于征程5做开发,或者是即将基于征程5芯片做开发,当你们遇到量化问题的时候,不要太早地放弃,除了从模型结构这个角度考虑,多从数据的物理意义角度去分析,给它合适的scale。
最后,祝大家开发顺利,我今天的分享就到这,谢谢大家!
分享文章
欢迎订阅地平线相关资讯,您可以随时取消订阅。
感谢您的订阅, 我们会第一时间推送地平线最新活动与资讯到您邮箱