BEV感知实战:PETRV2模型训练中的类别不平衡处理
在自动驾驶感知系统中,基于纯视觉的BEV(Bird's Eye View)检测方法近年来取得了显著进展。其中,PETR系列模型通过将相机参数直接注入Transformer结构,在nuScenes等主流数据集上实现了优异性能。然而,在实际训练过程中,一个普遍存在的挑战是类别不平衡问题——某些类别(如car、pedestrian)样本丰富,而其他类别(如bicycle、trailer、construction_vehicle)则极为稀少,导致模型对少数类别的检测精度偏低。
本文以PETRV2模型为例,结合Paddle3D框架与星图AI算力平台,系统性地介绍如何从数据准备、模型训练到评估优化完成一次完整的BEV感知任务,并重点分析在训练过程中如何识别和缓解类别不平衡带来的影响。我们将使用nuScenes v1.0-mini数据集进行实验,展示关键步骤及结果解读。
1. 环境配置与依赖安装
1.1 进入Paddle3D Conda环境
首先确保已部署好支持PaddlePaddle的GPU运行环境。在星图AI算力平台上,可通过预置镜像快速启动包含Paddle3D的开发环境。
激活指定conda环境:
conda activate paddle3d_env该环境已集成PaddlePaddle 2.6+、Paddle3D以及相关视觉库,适用于BEV感知任务的一站式开发。
2. 数据与权重准备
2.1 下载预训练权重
PETRV2采用VoVNet作为主干网络并引入GridMask增强策略,其在nuScenes全量数据上已有良好收敛状态。我们可在此基础上进行微调。
下载官方提供的预训练权重文件:
wget -O /root/workspace/model.pdparams https://paddle3d.bj.bcebos.com/models/petr/petrv2_vovnet_gridmask_p4_800x320/model.pdparams此权重为后续迁移学习提供良好的初始化基础,有助于加快收敛速度并提升最终性能。
2.2 获取nuScenes v1.0-mini数据集
为便于快速验证流程,先使用轻量级的v1.0-mini子集进行测试:
wget -O /root/workspace/v1.0-mini.tgz https://www.nuscenes.org/data/v1.0-mini.tgz mkdir -p /root/workspace/nuscenes tar -xf /root/workspace/v1.0-mini.tgz -C /root/workspace/nuscenes解压后目录结构应符合Paddle3D要求,包含samples,sweeps,maps,annotations等关键文件夹。
3. 模型训练与评估流程
3.1 生成数据标注信息
Paddle3D需特定格式的.pkl标注文件用于训练加载。执行脚本生成mini集对应的info文件:
cd /usr/local/Paddle3D rm /root/workspace/nuscenes/petr_nuscenes_annotation_* -f python3 tools/create_petr_nus_infos.py --dataset_root /root/workspace/nuscenes/ --save_dir /root/workspace/nuscenes/ --mode mini_val该命令会生成petr_nuscenes_annotation_train.pkl和petr_nuscenes_annotation_val.pkl两个核心文件,分别对应训练集与验证集的元数据索引。
3.2 初始精度评估
在开始训练前,建议先用预训练模型在目标数据集上做一次推理评估,以确认输入一致性与基准性能:
python tools/evaluate.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320_nuscene.yml \ --model /root/workspace/model.pdparams \ --dataset_root /root/workspace/nuscenes/输出结果如下:
mAP: 0.2669 NDS: 0.2878 Per-class results: Object Class AP ATE ASE AOE AVE AAE car 0.446 truck 0.381 bus 0.407 trailer 0.000 construction_vehicle 0.000 pedestrian 0.378 motorcycle 0.356 bicycle 0.063 traffic_cone 0.637 barrier 0.000观察发现:
- car、pedestrian、motorcycle类别表现较好(AP > 0.35)
- bicycle虽有出现但AP仅为0.063
- trailer、construction_vehicle、barrier完全未被检出(AP=0)
这表明原始模型虽在整体上有一定泛化能力,但在小样本或罕见类别上存在严重漏检现象,反映出明显的类别不平衡效应。
3.3 启动模型训练
针对上述问题,我们在保持原有架构不变的前提下,启动微调训练过程,重点关注损失函数对不同类别的响应差异。
执行训练命令:
python tools/train.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320_nuscene.yml \ --model /root/workspace/model.pdparams \ --dataset_root /root/workspace/nuscenes/ \ --epochs 100 \ --batch_size 2 \ --log_interval 10 \ --learning_rate 1e-4 \ --save_interval 5 \ --do_eval训练参数说明:
--epochs 100:充分迭代以观察长周期收敛趋势--batch_size 2:受限于显存,采用小批量训练--learning_rate 1e-4:适配微调阶段的学习率设置--do_eval:每保存一次模型即执行验证评估
3.4 可视化训练曲线
利用VisualDL工具监控训练过程中的loss变化与指标演进:
visualdl --logdir ./output/ --host 0.0.0.0并通过SSH端口转发实现远程访问:
ssh -p 31264 -L 0.0.0.0:8888:localhost:8040 root@gpu-09rxs0pcu2.ssh.gpu.csdn.net打开浏览器访问http://<your-ip>:8888即可查看实时训练曲线,重点关注:
- 总Loss是否平稳下降
- 分类Loss中各类别贡献占比
- 验证集mAP/NDS的变化趋势
若发现分类Loss长期由少数高频类别主导,则提示需引入更精细的采样或加权机制。
4. 模型导出与推理演示
4.1 导出静态图模型
训练完成后,选择性能最优的checkpoint导出为Paddle Inference格式,便于部署:
rm -rf /root/workspace/nuscenes_release_model mkdir -p /root/workspace/nuscenes_release_model python tools/export.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320_nuscene.yml \ --model output/best_model/model.pdparams \ --save_dir /root/workspace/nuscenes_release_model导出内容包括:
inference.pdmodel:网络结构inference.pdiparams:模型权重inference.yml:配置元信息
4.2 运行可视化DEMO
最后执行推理脚本,直观查看BEV检测效果:
python tools/demo.py /root/workspace/nuscenes/ /root/workspace/nuscenes_release_model nuscenes输出图像将显示多视角融合后的BEV边界框预测结果,可用于人工检验各类物体的检测完整性,尤其是此前AP较低的类别(如bicycle、trailer)是否有改善。
5. 扩展至Xtreme1数据集(可选)
Xtreme1是一个更具挑战性的城市场景数据集,包含极端天气、低光照、复杂遮挡等情况,常用于测试模型鲁棒性。
5.1 准备Xtreme1数据
假设数据已上传至/root/workspace/xtreme1_nuscenes_data目录下,生成适配标注:
cd /usr/local/Paddle3D rm /root/workspace/xtreme1_nuscenes_data/petr_nuscenes_annotation_* -f python3 tools/create_petr_nus_infos_from_xtreme1.py /root/workspace/xtreme1_nuscenes_data/5.2 评估预训练模型在Xtreme1上的表现
python tools/evaluate.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320.yml \ --model /root/workspace/model.pdparams \ --dataset_root /root/workspace/xtreme1_nuscenes_data/输出显示:
mAP: 0.0000 NDS: 0.0545 所有类别的AP均为0这一结果揭示了当前模型缺乏跨域泛化能力,尤其在分布偏移严重的场景中完全失效。这也进一步放大了类别不平衡的影响——当背景干扰加剧时,本就稀疏的正样本更难被正确激活。
5.3 训练与部署流程复现
沿用相同训练脚本进行域适应训练:
python tools/train.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320.yml \ --model /root/workspace/model.pdparams \ --dataset_root /root/workspace/xtreme1_nuscenes_data/ \ --epochs 100 \ --batch_size 2 \ --learning_rate 1e-4 \ --do_eval训练结束后导出模型并运行demo:
python tools/export.py \ --config configs/petr/petrv2_vovnet_gridmask_p4_800x320.yml \ --model output/best_model/model.pdparams \ --save_dir /root/workspace/xtreme1_release_model python tools/demo.py /root/workspace/xtreme1_nuscenes_data/ /root/workspace/xtreme1_release_model xtreme1注意:由于Xtreme1中部分类别实例极少(如barrier仅有个位数样本),即使经过训练也可能难以恢复有效检测能力,必须结合数据增强、重采样或代价敏感学习等手段综合治理。
6. 类别不平衡问题的应对策略分析
尽管上述流程完成了标准训练闭环,但从评估结果可见,类别不平衡仍是制约模型性能的关键瓶颈。以下是几种可行的改进方向:
6.1 损失函数层面:Focal Loss替代CE Loss
标准交叉熵损失对所有类别平等对待,易被高频类别主导。改用Focal Loss可自动降低易分类样本的权重,聚焦于难例(通常是稀有类别):
# 示例修改位置(位于modeling/heads/detection_loss.py) criterion = FocalLoss(alpha=0.25, gamma=2.0)6.2 数据层面:重采样与过采样
对训练集按类别频率进行加权采样,提高trailer、construction_vehicle等类别的曝光率:
# 在数据配置中添加sampler train_dataloader: batch_size: 2 sampler: type: ClassBalancedSampler class_weights: [1.0, 1.0, 1.0, 5.0, 5.0, 1.5, 2.0, 3.0, 1.0, 4.0]6.3 标签分布校准:Test-Time Augmentation (TTA)
在推理阶段对输入图像施加多种变换(翻转、亮度扰动等),聚合多路预测结果,可提升对边缘类别的召回率。
6.4 引入辅助监督信号
对于极稀有的类别(如barrier),可在backbone浅层添加类别感知注意力模块,引导特征提取器关注潜在区域。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。