【实战部署指南】DDRNet 从零到一:Cityscapes 数据集训练、测试与自定义数据迁移全流程解析
1. 环境准备与工程部署第一次接触DDRNet时我被它的实时语义分割能力惊艳到了。这个由哈尔滨工业大学团队提出的轻量级网络在保持高精度的同时还能达到实时推理速度特别适合需要快速响应的场景。不过在实际部署过程中确实遇到了不少需要手动调整的地方这里把我踩过的坑都整理出来。1.1 硬件与软件环境配置推荐使用Ubuntu 18.04或20.04系统搭配NVIDIA显卡驱动版本≥450。我实测过RTX 2080Ti和RTX 3090都能完美运行。软件依赖方面需要准备Python 3.7建议使用conda管理环境PyTorch 1.7与CUDA版本匹配OpenCV 4.0用于图像处理Apex混合精度库可选但推荐安装基础依赖的命令如下conda create -n ddrnet python3.8 -y conda activate ddrnet pip install torch1.9.0cu111 torchvision0.10.0cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install opencv-python tqdm pyyaml1.2 工程获取与结构调整官方提供了两个代码仓库原始论文实现仅含预训练模型https://github.com/ydhongHIT/DDRNet社区增强版完整训练代码https://github.com/chenjun2hao/DDRNet.pytorch建议采用第二个仓库作为基础下载后重命名为DDRNet_project。然后将第一个仓库中的预训练模型如ddrnet23slim_cityscapes.pth放入pretrained_models目录。文件目录建议这样组织├── Datasets │ ├── cityscapes │ └── custom_data └── Projects ├── DDRNet_project └── other_projects2. Cityscapes数据集测试实战2.1 数据准备与预处理Cityscapes数据集需要官网注册下载约70GB包含5000张精细标注的城市街景图。下载后解压到Datasets/cityscapes目录结构应为cityscapes ├── gtFine │ ├── train │ ├── val │ └── test └── leftImg8bit ├── train ├── val └── test2.2 关键代码修改点在测试预训练模型时有几个必须修改的地方修改ddrnet_23_slim.yamlDATASET: TEST_SET: test.lst # 必须包含test关键字 TEST: MODEL_FILE: pretrained_models/ddrnet23slim_cityscapes.pth调整demo.py避免多GPU报错# 注释掉分布式相关代码 # torch.cuda.set_device(args.local_rank) # torch.distributed.init_process_group(...)重写function.py中的test函数def test(config, test_dataset, testloader, model): # 添加自定义颜色映射 COLOR [(0,0,0), (128,64,128), ...] # 19类Cityscapes标准色 ... # 修改结果保存逻辑 cv2.imwrite(os.path.join(sv_path, name[0].png), blended_img)2.3 运行测试命令单GPU测试示例export CUDA_VISIBLE_DEVICES0 python tools/demo.py --cfg experiments/cityscapes/ddrnet23_slim.yaml测试结果会保存在output/cityscapes/ddrnet23_slim/test_results下包含原图、分割结果和叠加效果。3. Cityscapes完整训练流程3.1 训练配置调整修改ddrnet23_slim.yamlDATASET: ROOT: /path/to/Datasets/cityscapes TEST_SET: val.lst # 训练时需改回验证集 TRAIN: BATCH_SIZE_PER_GPU: 8 BASE_LR: 0.01分布式训练参数GPUS: (0,1) # 仅表示GPU数量实际ID由命令行指定3.2 启动训练双卡训练示例export CUDA_VISIBLE_DEVICES2,3 python -m torch.distributed.launch --nproc_per_node2 tools/train.py --cfg experiments/cityscapes/ddrnet23_slim.yaml训练过程中会输出各类指标mIoU平均交并比目标0.75Loss建议观察验证集损失SpeedFPSRTX 3090约45fps3.3 训练技巧学习率策略初始0.01每40epoch衰减0.1数据增强随机缩放(0.5-2.0)、水平翻转早停机制验证集mIoU连续3epoch不提升时停止4. 自定义数据集迁移指南4.1 数据准备规范自定义数据集需按以下结构组织custom_data ├── images │ ├── train │ ├── val │ └── test └── labels ├── train ├── val └── test同时需要准备三个列表文件train.lst格式images/train/001.jpg labels/train/001.pngval.lst同上格式test.lst测试集列表4.2 核心代码适配新建数据集类以custom.py为例class CustomDataset: def __init__(self): self.mean [0.485, 0.456, 0.406] # 自定义均值 self.std [0.229, 0.224, 0.225] # 自定义方差 self.label_mapping {0:0, 1:1,...} # 标签映射 self.class_weights [1.0, 2.0,...] # 类别权重修改模型文件# 在ddrnet_23_slim.py中 num_classes cfg.DATASET.NUM_CLASSES # 替换固定值19配置文件调整DATASET: NAME: custom NUM_CLASSES: 10 # 自定义类别数 ROOT: /path/to/custom_data MODEL: PRETRAINED: # 从头训练置空4.3 迁移训练建议小数据策略冻结骨干网络初始层使用更强的数据增强减小batch size建议≥4混合精度训练python -m torch.distributed.launch --nproc_per_node2 --amp tools/train.py --cfg experiments/custom.yaml微调技巧初始学习率降低10倍如0.001仅训练最后3个模块使用标签平滑正则化实际项目中我在一个包含8类的工业缺陷数据集上实现了0.82mIoU推理速度保持在35fpsRTX 2080Ti。关键是要确保标注质量特别是边缘细节的准确性。数据增强方面随机旋转和颜色抖动对提升泛化能力效果显著。