Lidar融合多任务感知模型
这篇教程主要是告诉大家如何利用HAT在自动驾驶数据集 Nuscenes 上训练一个Lidar融合多任务感知模型,包括浮点、量化和定点模型。
下文以配置 configs/lidar_bevfusion/bevfusion_pointpillar_henet_multisensor_multitask_nuscenes.py 为例介绍如何配置并训练Lidar融合多任务感知模型。
bevfusion_pointpillar_henet_multisensor_multitask_nuscenes 是一个多模态多任务自动驾驶感知模型,接受两种 camera 和 lidar 两种模态的输入,输出动态要素3d检测框和3d占用网格预测。
训练流程
如果你只是想简单的把 bevfusion_pointpillar_henet_multisensor_multitask_nuscenes 的模型训练起来,那么可以首先阅读一下这一章的内容。和其他任务一样,对于所有的训练,评测任务,HAT统一采用 tools + config 的形式来完成。在准备好原始数据集之后,可以通过下面的流程,方便地完成整个训练的流程。
数据集准备
这里以nuscense数据集为例,可以从 https://www.nuscenes.org/nuscenes 下载数据集, 对于Occupancy预测任务,还需要下载OCC的GT,可以从 https://github.com/CVPR2023-3D-Occupancy-Prediction/CVPR2023-3D-Occupancy-Prediction 下载数据集。 这里建议将下载好的数据集,解压到nuscense数据集文件夹中的 occ3d/gts 下。 然后运行以下命令,将lidar, images, occ gt等数据一起打包成lmdb格式:
上面这两条命令分别对应着转换训练数据集和验证数据集,打包完成之后,data目录下的文件结构应该如下所示:
train_lmdb和val_lmdb就是打包之后的训练数据集和验证数据集,也是网络最终读取的数据集。
模型训练
数据集准备好之后,就可以开始训练浮点型的lidar融合多任务感知模型 bevfusion_pointpillar_henet_multisensor_multitask_nuscenes 了。
首先可以使用以下命令评估模型的计算量:
如果你想要复现整个模型浮点和定点训练流程,你需要:
以上命令分别完成camera输入的浮点模型预训练,浮点模型训练和定点模型的训练,其中定点模型的训练需要以训练好的浮点模型为基础,具体内容请阅读 量化感知训练 章节的内容。
导出定点模型
完成量化训练后,便可以开始导出定点模型。可以通过下面命令来导出:
模型验证
在完成训练之后,可以得到训练完成的浮点、量化或定点模型。和训练方法类似,我们可以用相同方法来对训好的模型做指标验证,得到为 Float 、 calibration 和 qat 的指标,分别为浮点和量化的指标。
和训练模型时类似,--stage 后面的参数为 "float"、calibration 和 "qat" 时,分别可以完成对训练好的浮点模型、校准模型和量化模型的验证。
定点模型精度验证也可使用下面命令,但需要注意是必须要先导出hbir:
模型推理和结果可视化
HAT 提供了 infer_hbir.py 脚本提供了对定点模型的推理结果进行可视化展示:
仿真上板精度验证
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
定点模型检查和编译
在HAT中集成的量化训练工具链主要是为了地平线的计算平台准备的,因此,对于量化模型的检查和编译是必须的。
我们在HAT中提供了模型检查的接口,可以在定义好量化模型之后,先检查能否在 BPU 上正常运行:
在模型训练完成后,可以通过 compile_perf_hbir 脚本将量化模型编译成可以上板运行的 hbm 文件,同时该工具也能预估在 BPU 上的运行性能:
以上就是从数据准备到生成量化可部署模型的全过程。
训练细节
在这个说明中,我们对模型训练需要注意的一些事项进行说明,主要为 config 的一些相关设置。
模型构建
其中,model 下面的 type 表示定义的模型名称,剩余的变量表示模型的其他组成部分。这样定义模型的好处在于我们可以很方便的替换我们想要的结构。
bevfusion_pointpillar_henet_multisensor_multitask_nuscenes 模型主要由 lidar network , camera_network 和 bev_decoders 三个部分组成,
其中 bev_decoders 包含 BEVFormerDetDecoder 和 BevformerOccDetDecoder 两个模块,分别输出3d检测框和3d占用网格预测。
数据增强
跟 model 的定义一样,数据增强的流程是通过在config配置文件中定义 data_loader 和 val_data_loader 这两个dict来实现的,分别对应着训练集和验证集的处理流程。
例如训练集的定义为:
训练策略
为了训练一个精度高的模型,好的训练策略是必不可少的。对于每一个训练任务而言,相应的训练策略同样都定义在其中的config文件中,从 float_trainer 这个变量就可以看出来。
对于这个多网融合模型,我们建议先训练 lidar 输入的模型,再训练 camera 输入的模型,最后训练 lidar + camera 的融合模型,以获得较好的效果。
其中 lidar 输入的模型可以参考 centerpoint 模型训练,
camera 输入的模型可以参考 “configs/lidar_bevfusion/bevformer_henet_camera_multitask_nuscenes_pretrain.py” config训练浮点预训练模型,命令为:
雷达融合多任务模型的 float_trainer 的配置如下,可以看到我们分别加载了camera输入和lidar输入的预训练模型。
float_trainer 从大局上定义了我们的训练方式,包括使用多卡分布式训练(distributed_data_parallel_trainer),模型训练的epoch次数,以及优化器的选择。
同时 callbacks 中体现了模型在训练过程中使用到的小策略以及您想实现的操作,包括学习率的变换方式(CosineAnnealingLrUpdater),在训练过程中验证模型的指标(Validation),以及保存(Checkpoint)模型的操作。
当然,如果你有自己希望模型在训练过程中实现的操作,也可以按照这种dict的方式添加。
通过上面的介绍,你应该对config文件的功能有了一个比较清楚的认识。然后通过前面提到的训练脚本,就可以训练一个高精度的纯浮点的检测模型。当然训练一个好的检测模型不是我们最终的目的,它只是做为一个pretrain为我们后面训练定点模型服务的。
量化模型训练
当我们有了纯浮点模型之后,就可以开始训练相应的定点模型了。和浮点训练的方式一样,我们只需要通过运行下面的脚本就可以得到伪量化模型了:
可以看到,我们的配置文件没有改变,只改变了 stage 的类型, 其中calibration流程可以为QAT的量化训练提供一个更好的初始化参数。
我们使用模版配置了 Float2Calibration 和 Float2QAT 将模型分别转换为calibration和qat模型,具体的calibration 和 QAT 的config为:
训练策略不同
正如我们之前所说,量化训练其实是在纯浮点训练基础上的finetue。因此量化训练的时候,我们的初始学习率相比float小很多,
训练的epoch次数也大大减少,最重要的是 model 定义的时候,我们的 pretrained 需要设置成已经训练出来的纯浮点模型的地址。
做完这些简单的调整之后,就可以开始训练我们的量化模型了。
