MapTR实战:NuScenes-mini数据集训练与可视化全流程指南
1. 环境配置与依赖安装
在开始MapTR模型的训练与可视化之前,确保你的开发环境满足以下基础要求:
- 操作系统:推荐使用Ubuntu 20.04 LTS
- Python版本:3.8.x
- CUDA工具包:11.3
- cuDNN:8.6.x
- PyTorch:1.10.0+cu113
以下是环境配置的具体步骤:
# 创建并激活虚拟环境 conda create -n maptr python=3.8 conda activate maptr # 安装PyTorch及相关依赖 pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html注意:如果你的CUDA版本不是11.3,需要相应调整PyTorch的安装命令
接下来安装MMDetection3D框架及其依赖:
pip install mmcv-full==1.4.0 pip install mmdet==2.14.0 mmsegmentation==0.14.1 pip install timm==0.9.5常见安装问题及解决方案:
| 问题现象 | 解决方法 | 相关版本 |
|---|---|---|
| ModuleNotFoundError: No module named 'spconv' | pip install spconv-cu113 | CUDA 11.3专用 |
| ImportError: libGL.so.1缺失 | apt-get install ffmpeg -y | 系统级依赖 |
| CUDA内存不足 | 调整batch size和workers数量 | 训练配置参数 |
2. 数据集准备与预处理
NuScenes-mini数据集是完整NuScenes数据集的轻量级版本,包含100个场景的样本,非常适合快速验证和原型开发。
2.1 数据集下载与结构
从NuScenes官网下载以下两部分数据:
- 基础数据集:v1.0-mini版本
- CAN总线扩展数据:提供车辆传感器信息
建议的目录结构如下:
data/ ├── can_bus/ └── nuscenes/ ├── maps/ ├── nuscenes_gt_database/ ├── samples/ ├── sweeps/ └── v1.0-mini/2.2 数据预处理
运行官方提供的数据转换脚本:
python tools/create_data.py nuscenes \ --root-path ./data/nuscenes \ --out-dir ./data/nuscenes \ --extra-tag nuscenes \ --version v1.0-mini \ --canbus ./data预处理完成后,数据集将被转换为MapTR可识别的格式,包含以下关键文件:
- nuscenes_infos_train.pkl:训练集元数据
- nuscenes_infos_val.pkl:验证集元数据
- nuscenes_dbinfos_train.pkl:数据库采样信息
3. 模型训练配置与执行
3.1 预训练权重准备
MapTR支持多种骨干网络,推荐使用ResNet系列:
mkdir ckpts cd ckpts wget https://download.pytorch.org/models/resnet50-19c8e357.pth wget https://download.pytorch.org/models/resnet18-f37072fd.pth3.2 配置文件调整
以maptr_nano_r18_110e.py为例,关键参数修改如下:
# 数据路径配置 data_root = 'data/nuscenes/' # 训练参数调整 data = dict( samples_per_gpu=4, # 根据GPU显存调整 workers_per_gpu=2, # 根据CPU核心数调整 ) # 模型配置 model = dict( pretrained='ckpts/resnet18-f37072fd.pth', backbone=dict( norm_cfg=dict(type='BN', requires_grad=True) # 单卡使用BN ) )3.3 启动训练
单卡训练命令:
./tools/dist_train.sh ./projects/configs/maptr/maptr_nano_r18_110e.py 1多卡训练(以8卡为例):
./tools/dist_train.sh ./projects/configs/maptr/maptr_nano_r18_110e.py 8训练过程中监控的关键指标:
- loss_map:地图元素检测损失
- acc_map:地图元素分类准确率
- lr:当前学习率
4. 预测与可视化
4.1 使用预训练模型
下载官方提供的预训练权重:
wget https://github.com/hustvl/MapTR/releases/download/v1.0/maptr_tiny_r50_24e.pth -O ckpts/maptr_tiny_r50_24e.pth4.2 可视化预测结果
运行可视化脚本:
python tools/maptr/vis_pred.py \ config/maptr_tiny_r50_24e.py \ ckpts/maptr_tiny_r50_24e.pth \ --show-dir ./vis_dirs可视化脚本支持的参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
--show | 实时显示结果 | False |
--fps | 输出视频帧率 | 10 |
--show-range | 显示范围(米) | 50 |
4.3 生成演示视频
将可视化结果转换为视频:
python tools/maptr/generate_video.py ./vis_dirs --fps 10 --out demo.mp4视频生成参数说明:
- --fps:控制视频流畅度,建议10-15
- --out:指定输出文件名
- --resize:调整输出分辨率
5. 高级技巧与性能优化
5.1 训练加速策略
混合精度训练: 在配置文件中添加:
fp16 = dict(loss_scale=512.)数据加载优化:
data = dict( samples_per_gpu=8, workers_per_gpu=4, pin_memory=True, prefetch_factor=2 )学习率调整:
optimizer = dict( lr=0.002, paramwise_cfg=dict( custom_keys={ 'backbone': dict(lr_mult=0.1), 'sampling_offsets': dict(lr_mult=0.1) } ) )
5.2 模型微调建议
针对特定场景的优化方向:
数据增强策略:
train_pipeline = [ dict(type='LoadMultiViewImageFromFiles', to_float32=True), dict(type='PhotoMetricDistortionMultiViewImage'), dict(type='RandomScaleImageMultiViewImage', scales=[0.5, 1.0, 1.5]), dict(type='NormalizeMultiviewImage', **img_norm_cfg), dict(type='PadMultiViewImage', size_divisor=32) ]损失函数调整:
model = dict( loss_map=dict( type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0 ), loss_dir=dict( type='CrossEntropyLoss', loss_weight=0.1 ) )后处理参数优化:
test_cfg = dict( score_thr=0.3, nms_thr=0.5, max_per_img=100 )
6. 实际应用案例
6.1 城市道路场景分析
在NuScenes-mini数据集上,MapTR可以准确识别以下元素:
- 车道线:实线、虚线、双黄线等
- 道路边界:路缘石、隔离带
- 交通标志:停车线、人行横道
典型可视化结果包含:
- 3D边界框
- 语义分割掩码
- 实例ID标注
6.2 模型性能评估
使用官方评估脚本:
python tools/test.py \ config/maptr_tiny_r50_24e.py \ ckpts/maptr_tiny_r50_24e.pth \ --eval map关键评估指标:
| 指标 | 说明 | 典型值 |
|---|---|---|
| mAP | 平均精度 | 0.42 |
| mATE | 平均平移误差 | 0.68 |
| mASE | 平均尺度误差 | 0.25 |
6.3 模型部署建议
TorchScript导出:
script_model = torch.jit.script(model) torch.jit.save(script_model, "maptr_tiny.pt")ONNX转换:
torch.onnx.export( model, dummy_input, "maptr_tiny.onnx", opset_version=11, input_names=['input'], output_names=['output'] )TensorRT优化:
trtexec --onnx=maptr_tiny.onnx \ --saveEngine=maptr_tiny.trt \ --fp16