PETRV2-BEV训练教程:NuScenes数据集mini_val与mini_train区别说明
你是不是刚接触BEV(Bird's Eye View)目标检测,正准备跑通PETRV2模型,却在准备NuScenes数据集时被mini_val和mini_train两个模式搞糊涂了?比如——为什么评估要用mini_val生成标注,而训练却要换回mini_train?为什么直接用mini_val训练出来的模型指标差得离谱?别急,这篇教程不堆概念、不讲抽象原理,就用你在星图AI算力平台上真实操作的每一步,把这两个“看起来差不多、用起来差很多”的数据划分方式彻底讲清楚。
我们全程基于Paddle3D框架,在星图AI平台实操,所有命令可直接复制粘贴运行。重点不是“怎么敲命令”,而是“为什么这么敲”——尤其是那个容易踩坑的关键动作:数据标注生成阶段必须明确指定--mode mini_val,而训练配置中实际加载的是mini_train子集。这个细节,决定了你的mAP是0.26还是0.00。
1. 为什么先说清楚mini_val和mini_train的区别?
在开始敲命令前,得先破除一个常见误解:很多人以为mini_val就是“小一点的验证集”,mini_train就是“小一点的训练集”,所以训练时自然该用mini_train来生成标注。但PETRV2这类基于Paddle3D的BEV模型,其数据预处理逻辑恰恰相反。
NuScenes v1.0-mini数据包本身只包含原始传感器数据(摄像头图像、激光雷达点云、标定参数等),不包含任何现成的3D检测框标注文件。Paddle3D提供的create_petr_nus_infos.py脚本,作用就是根据原始数据,按指定模式(mini_train/mini_val/mini_test)动态生成带3D框、类别、属性的JSON标注文件。
关键来了:
--mode mini_val:脚本会读取nuscenes/samples/和nuscenes/sweeps/中的全部样本,并仅提取属于val分割的27个场景(scene),生成petr_nuscenes_annotation_mini_val.json。这个文件里只有验证场景的数据,且每个样本都严格对应NuScenes官方验证集划分。--mode mini_train:同理,生成的是petr_nuscenes_annotation_mini_train.json,覆盖train分割的81个场景。
但注意:评估脚本evaluate.py默认加载的是petr_nuscenes_annotation_mini_val.json,而训练脚本train.py默认加载的是petr_nuscenes_annotation_mini_train.json。如果你在准备阶段误用了--mode mini_train,那evaluate.py运行时就会因找不到mini_val标注文件而报错或静默失败;反之,若你用mini_val标注去训练,模型看到的只是27个场景,数据量严重不足,结果就是你看到的那份0.0000 mAP的“惨案”。
所以,第一步不是装环境,而是建立正确认知:mini_val用于生成评估基准,mini_train才是训练主力;两者标注文件必须分开生成,且路径不能混淆。
2. 环境准备与依赖下载
星图AI平台已为你预装好基础CUDA和Python环境,我们只需激活专用的Paddle3D环境,再拉取必要资源。
2.1 进入Paddle3D专属conda环境
conda activate paddle3d_env这一步确保后续所有Python包、CUDA版本与Paddle3D完全兼容。切勿在base环境或其它自建环境中运行,否则大概率出现ModuleNotFoundError或GPU调用失败。
2.2 下载预训练权重
PETRV2是典型的“大模型+小数据”范式,从头训练收敛极慢。我们采用官方提供的VOVNet主干网络预训练权重,大幅提升收敛速度和最终精度:
wget -O /root/workspace/model.pdparams https://paddle3d.bj.bcebos.com/models/petr/petrv2_vovnet_gridmask_p4_800x320/model.pdparams该权重已在NuScenes full-set上完成预训练,对mini-set具有强迁移能力。文件大小约280MB,请耐心等待下载完成。
2.3 下载并解压NuScenes 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解压后,/root/workspace/nuscenes/目录结构应为:
nuscenes/ ├── maps/ ├── samples/ ├── sweeps/ ├── v1.0-mini/ └── ...注意:Paddle3D脚本默认读取v1.0-mini/子目录,因此解压路径必须精准匹配,不可直接解压到nuscenes/根目录下。
3. 数据集准备:mini_val与mini_train标注生成
这是全文最核心、最容易出错的环节。请务必逐字核对命令。
3.1 切换至Paddle3D主目录
cd /usr/local/Paddle3D所有tools/下的脚本均需在此路径下执行,否则会因相对路径错误导致找不到配置文件或工具模块。
3.2 清理旧标注文件(防冲突)
rm /root/workspace/nuscenes/petr_nuscenes_annotation_* -fPaddle3D不会自动覆盖同名标注文件,残留的旧文件(如上次误生成的mini_train标注)可能被后续训练脚本误读,导致指标异常。养成每次新任务前清理的习惯。
3.3 生成mini_val标注(用于评估)
python3 tools/create_petr_nus_infos.py \ --dataset_root /root/workspace/nuscenes/ \ --save_dir /root/workspace/nuscenes/ \ --mode mini_val执行成功后,你会在/root/workspace/nuscenes/下看到:
petr_nuscenes_annotation_mini_val.json这个文件就是评估的黄金标准。它精确对应NuScenes官方验证集的27个场景,共6019个关键帧(keyframe),每个帧都包含相机、雷达、标定、3D框等完整信息。
小贴士:为什么评估必须用
mini_val?因为NuScenes官方提交服务器只认这个划分。你本地训练的模型,只有在mini_val上跑出的mAP,才能和论文、榜单上的结果横向对比。用mini_train评估,数值再高也没意义。
3.4 生成mini_train标注(用于训练)
python3 tools/create_petr_nus_infos.py \ --dataset_root /root/workspace/nuscenes/ \ --save_dir /root/workspace/nuscenes/ \ --mode mini_train执行后生成:
petr_nuscenes_annotation_mini_train.json该文件覆盖81个训练场景,共7035个关键帧,是模型学习的全部“教材”。注意:此步骤必须在mini_val之后执行,否则evaluate.py会因缺少mini_val标注而无法启动。
4. 模型评估与训练全流程
现在,标注齐备,权重就位,可以正式开跑。
4.1 首次评估:验证预训练权重在mini_val上的基线性能
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—— 这是模型未经任何微调,在mini-val上的“出厂设置”精度。作为后续训练效果的锚点。NDS: 0.2878—— NuScenes Detection Score,综合考量定位、尺寸、朝向等多维度的加权得分。
你会发现,car、pedestrian、motorcycle等常见类别AP都在0.35~0.45之间,而trailer、barrier等稀有类别为0.000。这完全符合预期:预训练模型对长尾类别泛化能力有限,正是我们需要通过微调提升的部分。
4.2 启动训练:使用mini_train数据,微调预训练权重
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关键参数解读:
--dataset_root指向nuscenes/,脚本会自动查找petr_nuscenes_annotation_mini_train.json进行训练;--do_eval表示每5个epoch(由--save_interval 5控制)自动在mini_val上评估一次,实时监控过拟合;batch_size 2是mini数据集的合理选择,显存占用约12GB,适配单卡V100/A100。
训练将持续约8~10小时。期间你会看到loss稳步下降,mAP从0.26缓慢爬升至0.30+。不要期望mini-set上达到full-set的0.40+ mAP,这是数据量决定的天花板。
4.3 可视化训练过程
visualdl --logdir ./output/ --host 0.0.0.0然后通过SSH端口转发将远程VisualDL服务映射到本地:
ssh -p 31264 -L 0.0.0.0:8888:localhost:8040 root@gpu-09rxs0pcu2.ssh.gpu.csdn.net在浏览器打开http://localhost:8888,即可查看loss曲线、mAP变化、学习率衰减等关键指标。重点关注eval/mAP是否单调上升,若出现剧烈震荡或下降,说明学习率过高或数据增强过强。
4.4 导出推理模型并运行DEMO
训练完成后,./output/best_model/下会保存最优权重。将其转换为轻量级PaddleInfer格式:
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导出成功后,运行可视化DEMO:
python tools/demo.py \ /root/workspace/nuscenes/ \ /root/workspace/nuscenes_release_model \ nuscenes程序会自动选取mini_val中的若干样本,生成BEV视角检测结果图,并叠加在原图上。你可以直观看到:车辆框是否紧贴车体、行人框是否漏检、障碍物朝向是否准确——这才是比数字更真实的模型能力反馈。
5. 关于xtreme1数据集的特别说明
你可能在文档中看到xtreme1这个名称,它并非NuScenes官方数据集,而是某团队对mini-set的极端增强版本:通过大量合成遮挡、雨雾、低光照等恶劣条件,刻意制造困难样本。它的设计目标是测试模型鲁棒性,而非提升常规精度。
当你用同样流程处理xtreme1时,会发现:
evaluate.py输出mAP: 0.0000,不是模型坏了,而是xtreme1的标注格式与标准mini-set不兼容,evaluate.py无法正确解析其3D框;- 训练虽能进行,但loss下降缓慢,mAP长期停滞在0.05以下。
因此,除非你明确研究极端场景鲁棒性,否则不建议将xtreme1用于常规训练。它的价值在于:当你在标准mini-set上达到0.30+ mAP后,用xtreme1做finetune,可显著提升模型在雨雾天气下的检测稳定性。
6. 总结:mini_val与mini_train的本质差异
回到最初的问题:它们到底有什么区别?现在你应该有了清晰答案:
| 维度 | mini_val | mini_train |
|---|---|---|
| 数据来源 | NuScenes官方验证集的27个场景 | NuScenes官方训练集的81个场景 |
| 核心用途 | 唯一合法的评估基准,用于计算mAP/NDS等指标 | 模型训练的全部数据源,决定模型学什么 |
| 生成时机 | 训练前必须生成,供evaluate.py调用 | 训练前必须生成,供train.py调用 |
| 文件命名 | petr_nuscenes_annotation_mini_val.json | petr_nuscenes_annotation_mini_train.json |
| 数量规模 | 6019个关键帧 | 7035个关键帧 |
| 使用禁忌 | ❌ 绝对不可用于训练(数据量太小,过拟合) | ❌ 绝对不可用于评估(非官方划分,无对比意义) |
一句话记住:mini_val是考场,mini_train是教室。你在教室(mini_train)里反复练习,最终走进考场(mini_val)接受检验。两者分工明确,绝不可混用。
现在,你已经掌握了PETRV2-BEV在NuScenes mini-set上的完整训练闭环。下一步,可以尝试调整configs/petr/下的YAML文件,修改输入分辨率、GridMask强度、学习率调度策略,观察对mAP的影响。真正的BEV调优,才刚刚开始。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。