PointPillars检测模型训练(无 config)
这篇教程主要是告诉大家如何利用 HAT 在雷达点云数据集 KITTI-3DObject 上从头开始训练一个 PointPillars 模型,包括浮点、量化和定点模型。
训练流程
如果你只是想简单的把 PointPillars 的模型训练起来,那么可以首先阅读一下这一章的内容。
和其他任务一样,对于所有的训练,评测任务,HAT统一采用 tools + config 的形式来完成。
在准备好原始数据集之后,可以通过下面的流程,方便地完成整个训练的流程。
数据集准备
在开始训练模型之前,第一步是需要准备好数据集,我们在KITTI官网下载 3DObject据集, 包括4个文件:
left color images of object data setvelodyne point cloudscamera calibration matrices of object data settaining labels of object data set
下载上述4个文件后,解压并按照如下方式组织文件夹结构:
为了创建KITTI点云数据,首先需要加载原始的点云数据并生成相关的包含目标标签和标注框的数据标注文件,同时还需要为KITTI数据集生成每个单独的训练目标的点云数据,并将其存储在 data/kitti/gt_database 的 .bin 格式的文件中,此外,需要为训练数据或者验证数据生成 .pkl 格式的包含数据信息的文件。随后,通过运行下面的命令来创建KITTI数据:
执行上述命令后,生成的文件目录如下:
同时,为了提升训练的速度,我们对数据信息文件做了一个打包,将其转换成lmdb格式的数据集。只需要运行下面的脚本,就可以成功实现转换:
上面这两条命令分别对应着转换训练数据集和验证数据集,打包完成之后,data目录下的文件结构应该如下所示:
train_lmdb 和 val_lmdb 就是打包之后的训练数据集和验证数据集,也是网络最终读取的数据集,kitti3d_gt_database 和 kitti3d_dbinfos_train.pkl 是训练是用于采样的样本。
模型训练
数据集准备好之后,就可以开始模型训练相关的内容。
模型验证
模型训练完成之后,我们还可以验证训练出来的模型性能。由于我们提供了float和qat两阶段的训练过程,相应的我们可以验证这两个阶段训练出来的模型性能,只需要相应的运行以下两条命令即可:
同时,我们还提供了quantization模型的性能测试,只需要运行以下命令:
这个显示出来的精度才是最终的int8模型的真正精度,当然这个精度和qat验证阶段的精度应该是保持十分接近的。
仿真上板精度验证
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
结果可视化
如果你希望可以看到训练出来的模型对于单帧雷达点云的检测效果,我们的tools文件夹下面同样提供了点云预测及可视化的脚本,你只需要运行以下脚本即可:
定点模型检查和编译
在训练完成之后,可以使用 compile 的工具用来将量化模型编译成可以上板运行的 hbm 文件,同时该工具也能预估在BPU上的运行性能,可以采用以下脚本:
训练细节
在这个说明中,我们对模型训练需要注意的一些事项进行说明,主要为 config 的一些相关设置。
模型构建
PointPillars 的网络结构可以参考 论文 ,这里不做详细介绍。
从模型训练到编译上板的整个流程大致如下:

从上图中,主要用到了三个阶段的模型,即 Float Model、QAT Model、Quantized Model。其中:
Float Model: 即是一般的浮点模型。QAT Model: 即是插入伪量化节点的模型。Quantized Model: 即量化后的模型,参数为INT8类型。
此外,在训练、 编译等流程中又分别会使用不同结构或状态的模型:
model: 完整的模型结构,即包含模型前处理、网络结构、后处理,主要用于训练、评测。deploy_model: 只包含网络结构(可以编译到hbm中的部分),不包含前处理和后处理,主要用于编译。
我们通过定义一个 PointPillarsModel 类来与模型结构相关的所有内容,包含上述三个阶段:Float Model、QAT Model、Quantized Model 以及两种状态: model 和 deploy_model:
至此, PointPillarsModel 中已定义了与模型相关的所有内容,在使用时可以很方便的通过 PointPillarsModel.xxx() 获取相应的模型结构。
在完成网络结构的定义之后,我们可以使用以下命令先测试一下网络的计算量和参数数量:
数据增强
类似 模型结构 部分,我们通过定义一个 DataHelper 来实现数据相关内容,包括 transforms , data_loader 等:
训练策略
为了训练一个精度高的模型,好的训练策略是必不可少的。对于每一个训练任务而言,不同阶段的模型(浮点、QAT) 其训练策略也会略有不同,因此,我们也把训练策略内容( optimizer, lr_schedule) 等也定义在 PointPillarsModel 里面:
如果需要复现精度,示例代码中的训练策略最好不要修改。否则可能会有意外的训练情况出现。
通过上面的介绍,我们已经完成了对模型训练相关所有模块的定义,接下来就可以训练一个高精度的纯浮点的检测模型。 当然训练一个好的检测模型不是我们最终的目的,它只是做为一个pretrain为我们后面训练定点模型服务的。
如果你只是单纯的想启动这样的训练任务,只需要运行下面的命令就可以:
量化模型训练
当我们有了纯浮点模型之后,就可以开始训练相应的定点模型了。和浮点训练的方式一样,我们只需要通过运行下面的脚本就可以训练定点模型了:
quantize参数的值不同
当我们训练量化模型的时候,需要设置quantize=True,此时相应的浮点模型会被转换成量化模型,相关代码如下:
关于量化训练中的关键步骤,比如准备浮点模型、算子替换、插入量化和反量化节点、设置量化参数以及算子的融合等,请阅读 量化感知训练 章节的内容。
训练策略不同
正如我们之前所说,量化训练其实是在纯浮点训练基础上的 finetue。
因此量化训练的时候,我们的初始学习率设置为浮点训练的十分之一,训练的epoch次数也大大减少,最重要的是 model 定义的时候,我们的 pretrained 需要设置成已经训练出来的纯浮点模型的地址。
做完这些简单的调整之后,就可以开始训练我们的量化模型了。
