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 python=3.8 -y conda activate ddrnet pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -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.yaml:
DATASET: 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_DEVICES=0 python tools/demo.py --cfg experiments/cityscapes/ddrnet23_slim.yaml测试结果会保存在output/cityscapes/ddrnet23_slim/test_results下,包含原图、分割结果和叠加效果。
3. Cityscapes完整训练流程
3.1 训练配置调整
- 修改
ddrnet23_slim.yaml:
DATASET: 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_DEVICES=2,3 python -m torch.distributed.launch --nproc_per_node=2 tools/train.py --cfg experiments/cityscapes/ddrnet23_slim.yaml训练过程中会输出各类指标:
- mIoU:平均交并比(目标0.75+)
- Loss:建议观察验证集损失
- Speed:FPS(RTX 3090约45fps)
3.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_node=2 --amp tools/train.py --cfg experiments/custom.yaml- 微调技巧:
- 初始学习率降低10倍(如0.001)
- 仅训练最后3个模块
- 使用标签平滑正则化
实际项目中,我在一个包含8类的工业缺陷数据集上实现了0.82mIoU,推理速度保持在35fps(RTX 2080Ti)。关键是要确保标注质量,特别是边缘细节的准确性。数据增强方面,随机旋转和颜色抖动对提升泛化能力效果显著。