0 概述
在自动驾驶感知算法中BEV感知成为热点话题,BEV感知可以弥补2D感知的缺陷构建3D“世界”,更有利于下游任务和特征融合。为响应市场需求,地平线集成了基于bev的纯视觉算法,目前已支持ipm-based 、lss-based、 transformer-based(Geometry-guided Kernel Transformer、detr3d、PETR) 的多种bev视觉转换方法。其中PETR为基于detr的3D检测算法,实现是端到端的,本文为PETR感知算法的介绍和使用说明。
该示例为参考算法,仅作为在J5上模型部署的设计参考,非量产算法
1 性能精度指标
PETR模型配置及指标::
dataset backbone input_shape num_query NDS(浮点/定点) FPS(双核) Nuscenes Eficientnet-B3 6x3x512x1408 900 37.66/37.19 8.3 注:建议使用小分辨率对模型性能会更友好:例如输入为[4,3,480,640]时,性能表现为双核62FPS,以实际需求为主
Nuscenes 数据集官方介绍:nuScenes
2 模型介绍

PETR模型主要包括以下部分:
2.1 改动点说明
替换了backbone,由resnet50的backbone替换回了同级别的efficientnet b3
Decoder部分,query由原来的3维(1,900,256)/ NQC 改成了(1,256, 4, 128)/NCHW,逻辑实现上与公版一致
使用1x1的卷积替换了公版的linear,减少transpose和reshape的操作
LayerNorm2d为地平线内部自实现算子,性能更高
2.2 源码说明
2.2.1 Config文件
注: 如果需要复现精度,config中的训练策略最好不要修改。否则可能会有意外的训练情况出现。
2.2.2 img_encoder
来自6个view的image作为输入通过共享的backbone(efficientnet-b3)输出经过encoder后的feature,feature_shape为(6*B,C,1/2H,1/2W)。encoder即对多个view的img_feature 做特征提取,过程见下图:

2.2.3 head

由上图可知,PETR的head层完成特征提取和生成预测目标的全流程,通过生成的3D coords融合位置编码生成成pos_embed ;根据num_query生成可学习的query_embed;再将2D feature 做1x1的conv映射,将以上做为transformer解码器的输入。经由transfomer层做注意力计算生成target,通过cls、reg分支得到预测类别和位置。
2D-Features 映射
将2D feature使用1x1的卷积映射:
3D Coords 生成
生成位置编码
3D PE 生成
融合位置编码
为了得到位置信息,将位置信息添加到PE中,融合方式为add
生成query 编码
生成可学习的reference_points(queries) ,转换为3D的query,然后将其编码(conv+relu+conv),最终形成query_embed 。
transformer层
完成2D features到3D features的 特征转换,该部分会在1.2.4章节详细说明。
预测层
预测分支分为reg_branch和cls_branch,PC端在head层完成根据reference_points和reg计算bbox过程。
1.2.4 PETR Transformer
由DecoderLayer构成:
Decoder层数为6层,上一层的输出为下一层的输入,每层主要完成两个注意力计算:在query之间做self-attention,再和图像特征之间做cross-attention。整理流程如下图:

Self attention
该层为query之间的4维自注意力层,q=k,避免不同的queries 预测同一个目标。
CrossAttention
3 浮点模型训练
3.1 Before Start
3.1.1 发布物及环境部署
step1:获取发布物
step2:解压发布包
解压后文件结构如下:
step3:拉取docker环境
3.1.2 数据集准备
3.1.2.1 数据集下载
Full dataset(v1.0)包含多个子数据集,如果不需要进行v1.0-trainval数据集的浮点训练和精度验证,可以只下载v1.0-mini数据集进行小场景的训练和验证。
将下载完成的v1.0-trainval01_blobs.tar~v1.0-trainval10_blobs.tar、v1.0-trainval_meta.tar和can_bus.zip进行解压,解压后的目录如下所示:
3.1.2.2 数据集打包
--src-data-dir为解压后的nuscenes数据集目录;
--target-data-dir为打包后数据集的存储目录;
--version 选项为["v1.0-trainval", "v1.0-test", "v1.0-mini"],如果进行全量训练和验证设置为v1.0-trainval,如果仅想了解模型的训练和验证过程,则可以使用v1.0-mini数据集;v1.0-test数据集仅为测试场景,未提供注释。
全量的nuscenes数据集较大,打包时间较长。每打包完100张会在终端有打印提示,其中train打包约28100张,val打包约6000张。
2.1.2.3 meta文件夹构建
3.1.3 config配置
在进行模型训练和验证之前,需要对configs文件中的部分参数进行配置,一般情况下,我们需要配置以下参数:
device_ids、batch_size_per_gpu:根据实际硬件配置进行device_ids和每个gpu的batchsize的配置;
ckpt_dir:浮点、calib、量化训练的权重路径配置,权重下载链接在config文件夹下的README中;
data_rootdir:2.1.2.2中打包的数据集路径配置;
meta_rootdir :2.1.2.3中创建的meta文件夹的路径配置;
float_trainer下的checkpoint_path:浮点训练时backbone的预训练权重所在路径,可以使用README的# Backbone Pretrained ckpt中ckpt download提供的float-checkpoint-best.pth.tar权重文件。
3.2 浮点模型训练
config文件中的参数配置完成后,使用以下命令训练浮点模型:
float训练后模型ckpt的保存路径为config配置的ckpt_callback中save_dir的值,默认为ckpt_dir。
3.3 浮点模型精度验证
浮点模型训练完成以后,通过指定训好的float_checkpoint_path,使用以下命令验证已经训练好的模型精度:
验证完成后,会在终端打印浮点模型在验证集上检测和分割精度,如下所示:
4 模型量化和编译
4.1 Calibration
模型完成浮点训练后,便可进行 Calibration。calibration在forward过程中通过统计各处的数据分布情况,从而计算出合理的量化参数。 通过运行下面的脚本就可以开启模型的Calibration过程:
4.2 Calibration 模型精度验证
calibration完成以后,可以使用以下命令验证经过calib后模型的精度:
验证完成后,会在终端输出calib模型在验证集上检测和分割精度,格式见3.3。
4.3 量化模型训练
通过运行下面的脚本就可以开启模型的qat训练:
4.4 量化模型精度验证
量化模型的精度验证,只需要运行以下命令:
qat模型的精度验证对象为插入伪量化节点后的模型(float32);quantize模型的精度验证对象为定点模型(int8),验证的精度是最终的int8模型的真正精度,这两个精度应该是十分接近的。
4.5 仿真上板精度验证
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
4.6 量化模型编译
opt为优化等级,取值范围为0~3,数字越大优化等级越高,运行时间越长。
compile_perf脚本将生成.html文件和.hbm文件(compile文件目录下),.html文件为BPU上的运行性能,.hbm文件为上板实测文件。
5 其他工具
5.1 结果可视化
如果你希望可以看到训练出来的模型对于单帧的检测效果,我们的tools文件夹下面同样提供了预测及可视化的脚本,你只需要运行以下脚本即可:
注:需在config文件中配置infer_cfg字段。
可视化示例:

