保姆级教程:用BiSeNetv2在Cityscapes数据集上跑通语义分割(附避坑指南)
从零到一:BiSeNetv2在Cityscapes数据集上的实战指南
第一次接触语义分割任务时,我被那些能将街景照片中每个像素都精确分类的算法深深吸引。BiSeNetv2作为轻量级实时语义分割网络的代表,在保持较高精度的同时大幅提升了推理速度,特别适合需要快速响应的场景应用。本文将带你完整走通从环境搭建到模型训练的每个环节,避开那些新手常踩的坑。
1. 环境配置与工程准备
在Ubuntu 18.04系统上,我们需要先确保CUDA和cuDNN的正确安装。建议使用conda创建独立的Python环境,避免依赖冲突:
conda create -n bisenet python=3.7 -y conda activate bisenet安装PyTorch时需特别注意版本匹配问题。对于CUDA 10.2环境,使用以下命令安装兼容的PyTorch版本:
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 -f https://download.pytorch.org/whl/torch_stable.html克隆BiSeNetv2官方仓库并安装依赖:
git clone https://github.com/CoinCheung/BiSeNet cd BiSeNet pip install -r requirements.txt常见问题排查:
- 遇到
ImportError: libGL.so.1错误时,执行sudo apt install libgl1-mesa-glx - 报错
ModuleNotFoundError: No module named 'mmcv'时,使用pip install mmcv-full
提示:建议在工程根目录下创建MODEL文件夹存放预训练模型,保持项目结构清晰
2. Cityscapes数据集处理技巧
Cityscapes作为自动驾驶领域的标杆数据集,其精细的标注质量令人赞叹。下载数据集后,建议采用以下目录结构:
project_root/ ├── BiSeNet/ └── cityscapes/ ├── leftImg8bit/ └── gtFine/创建软链接的正确姿势:
cd BiSeNet/datasets/cityscapes ln -s ../../../cityscapes/leftImg8bit leftImg8bit ln -s ../../../cityscapes/gtFine gtFine数据集预处理时需要注意:
- 图像尺寸默认为2048×1024
- 19个语义类别包含道路、车辆、行人等
- 标注采用彩色编码,需通过官方脚本转换
3. 模型训练全流程解析
BiSeNetv2采用双分支结构,兼顾空间细节和上下文信息。训练配置主要参数:
| 参数 | 值 | 说明 |
|---|---|---|
| lr_start | 5e-3 | 初始学习率 |
| weight_decay | 5e-4 | 权重衰减 |
| cropsize | [512,1024] | 训练裁剪尺寸 |
| ims_per_gpu | 8 | 每GPU图像数 |
单卡训练启动命令:
export CUDA_VISIBLE_DEVICES=0 python -m torch.distributed.launch --nproc_per_node=1 tools/train_amp.py --config configs/bisenetv2_city.py多卡训练只需调整环境变量:
export CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 tools/train_amp.py --config configs/bisenetv2_city.py训练过程常见问题:
- OOM错误:减小
ims_per_gpu或cropsize - 损失不下降:检查学习率设置
- NaN值:尝试关闭混合精度训练
4. 模型评估与可视化
训练完成后,使用以下命令评估模型在验证集上的表现:
python tools/evaluate.py --config configs/bisenetv2_city.py --weight-path ./res/model_final.pthDemo测试支持图片和视频输入:
# 图片测试 python tools/demo.py --config configs/bisenetv2_city.py --weight-path ./MODEL/model_final_v2_city.pth --img-path ./example.png # 视频测试 python tools/demo_video.py --config configs/bisenetv2_coco.py --weight-path ./MODEL/model_final_v2_coco.pth --input ./video.mp4 --output res.mp4可视化结果解读技巧:
- 不同颜色代表不同语义类别
- 边缘模糊区域通常是难例
- 小物体识别效果反映模型感受野设计
5. 自定义数据集迁移方案
当需要训练自己的数据集时,关键修改点集中在配置文件:
cfg = dict( model_type='bisenetv2', n_cats=5, # 修改为自定义类别数 dataset='Custom', im_root='./datasets/custom', train_im_anns='./datasets/custom/train.txt', cropsize=[384, 640] # 根据图像尺寸调整 )数据标注建议流程:
- 使用LabelMe进行多边形标注
- 将JSON转换为单通道PNG
- 生成train.txt/val.txt文件列表
数据增强策略调整:
- 城市街景:保持常规缩放比例
- 医疗图像:减小旋转幅度
- 遥感影像:增加色彩扰动
在完成第一个完整训练周期后,建议先用小批量数据验证流程是否正确。记得备份重要配置文件,不同实验使用不同respth保存路径。当看到模型开始识别出你标注的物体轮廓时,那种成就感绝对值得这些繁琐的配置工作。
