保姆级教程:在Windows上用Darknet搞定YOLO语义分割(Cityscapes数据集+源码+可视化)
Windows平台YOLO语义分割实战:从Cityscapes数据集到可视化全流程解析
刚接触计算机视觉的开发者常被语义分割的复杂流程劝退——环境配置报错、数据集预处理混乱、训练结果难以可视化。本文将用最直白的语言,带你完成Windows系统下基于Darknet框架的YOLO语义分割全流程实战。不同于碎片化的网络教程,这里每个步骤都经过真实环境验证,特别针对CUDA版本冲突、标签映射错误等高频问题提供解决方案。
1. 环境配置:避开90%新手会踩的坑
在Windows上配置深度学习环境就像走雷区,稍有不慎就会陷入DLL缺失或版本冲突的泥潭。建议使用CUDA 11.1 + cuDNN 8.0.5组合,这是与Darknet兼容性最好的版本配置。
1.1 显卡驱动与CUDA安装
首先确认显卡支持CUDA加速(NVIDIA GTX 1060及以上),通过以下命令检查驱动版本:
nvidia-smi若输出包含CUDA Version字段且≥11.1,可跳过驱动安装
必须按顺序执行以下步骤:
- 卸载现有NVIDIA驱动(控制面板→卸载程序)
- 安装对应显卡的Game Ready驱动
- 下载CUDA 11.1安装包(约2.8GB)
- 自定义安装时取消勾选Visual Studio Integration
- 下载cuDNN 8.0.5 for CUDA 11.1,解压后将bin/include/lib文件夹复制到
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1
常见错误:若出现
cudnn64_8.dll not found,检查环境变量Path是否包含C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin
1.2 Darknet编译与OpenCV绑定
下载修改后的Darknet分割版本(支持Windows编译):
git clone https://github.com/AlexeyAB/darknet.git cd darknet/build/darknet修改Makefile关键参数:
GPU=1 CUDNN=1 OPENCV=1 OPENMP=1使用VS2019打开darknet.sln,配置x64平台后直接生成解决方案。编译成功后会在根目录生成darknet.exe。
2. Cityscapes数据集处理实战
Cityscapes的34类标注需要转换为19类训练标签,这是影响模型效果的关键步骤。
2.1 数据集目录结构解析
下载后的数据集应组织为如下结构:
cityscapes/ ├── leftImg8bit/ │ ├── train/ # 2975张训练图像 │ ├── val/ # 500张验证图像 │ └── test/ # 1525张测试图像 └── gtFine/ ├── train/ # 精细标注 ├── val/ └── test/2.2 标签映射与预处理
使用官方脚本转换标签ID:
python cityscapesscripts/preparation/createTrainIdLabelImgs.py该脚本会生成*_labelTrainIds.png文件,其中:
- 0-18为有效类别(如道路、车辆、行人)
- 255表示忽略区域(原始白色部分)
标签映射表示例:
| 原始ID | 类别名称 | 训练ID |
|---|---|---|
| 0 | 未标注区域 | 255 |
| 7 | 道路 | 0 |
| 11 | 建筑物 | 1 |
| 24 | 车辆 | 10 |
3. Darknet框架深度定制
3.1 配置文件关键参数解析
修改segment.cfg网络结构:
[net] batch=4 subdivisions=2 width=512 # 输入图像宽度 height=256 # 输入图像高度 [yolo] classes=19 # 必须与训练类别数一致 mask=0,1,2 # 对应anchors索引小批量(batch=4)适合8GB显存显卡,若出现CUDA out of memory可增大subdivisions
3.2 数据准备脚本
创建maskyolo.data指定数据路径:
classes=19 train=data/cityscapes/train.txt valid=data/cityscapes/val.txt names=data/maskyolo.names backup=backup/生成训练文件列表的Python脚本:
import os base = "cityscapes/leftImg8bit/train/" with open("train.txt", "w") as f: for city in os.listdir(base): for img in os.listdir(f"{base}/{city}"): f.write(f"{base}/{city}/{img}\n")4. 训练与可视化全流程
4.1 启动训练命令详解
使用多GPU训练(假设使用0,1号显卡):
darknet.exe segmenter train maskyolo.data segment.cfg -gpus 0,1关键训练日志解析:
97000: 0.215667, 0.210734 avg, 0.000010 rate, 1.234567 seconds, 6208000 images- 97000:当前迭代次数
- 0.215667:当前批次损失
- 0.210734:平均损失(低于0.3说明模型收敛)
4.2 Python可视化替代MATLAB方案
使用OpenCV实现结果着色:
import cv2 import numpy as np # 类别颜色映射 COLORMAP = [ (128, 64, 128), # 道路 (70, 70, 70), # 建筑物 (153, 153, 153), # 护栏 # ...其他18类颜色 ] def visualize_segmentation(mask_path): mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) colored = np.zeros((*mask.shape, 3), dtype=np.uint8) for train_id, color in enumerate(COLORMAP): colored[mask == train_id] = color cv2.imshow("Result", colored) cv2.waitKey(0)4.3 模型效果优化技巧
- 数据增强:在
segment.cfg中启用:flip=1 blur=1 jitter=.3 - 迁移学习:加载预训练权重:
darknet.exe partial segment.cfg yolov4.conv.137 37 - 多尺度训练(测试时启用):
darknet.exe segmenter test maskyolo.data segment.cfg segment_97000.weights test.jpg -multiscale
训练过程中若发现某类别识别效果差,可检查:
- 标注样本是否充足(如摩托车类通常数据较少)
- anchors尺寸是否匹配目标大小
- 学习率设置是否合理(建议初始3e-4)
