ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

雨雪天气路面状况数据集:YOLOv5标注与训练全流程指南

雨雪天气路面状况数据集:YOLOv5标注与训练全流程指南 简介这份雨雪天气路面状况数据集面向自动驾驶感知、道路安全监测与计算机视觉方向的学习者和开发者用于训练和验证结冰路面、雪地、下雨湿滑与干燥路面四类场景的识别模型适合具备一定目标检测基础、需要真实道路样本进行模型调优的中高级用户。资源包共1293个文件包含646张原始jpg图像、646个对应的txt标注文件以及1个yaml配置文件压缩包约26.98MB标注格式可直接对接YOLOv5训练流程yaml文件用于定义类别与数据路径省去自行整理标签的环节。目前已有708人学习下载说明该数据集在路面状态识别任务中具有一定参考价值。图像均采用原始图片未做过度裁剪或增强保留了雨雪、结冰、湿滑等复杂光照与纹理细节便于读者直接用于模型训练、类别平衡分析或作为自建数据集的补充样本快速验证检测方案在恶劣天气下的实际表现。1. 雨雪天气路面状况数据集从原始图片到 YOLOv5 可训练标签的完整路径冬季自动驾驶和道路巡检项目里最让人头疼的不是模型结构而是找不到能覆盖结冰、积雪、湿滑、干燥四种状态的真实路面图片。网上公开的雨雪数据集要么只有雪没有冰要么全是合成图标注质量参差不齐。这个标题指向的是一份用原始图片采集、按 YOLOv5 格式标注、能直接投入训练的路面状况数据集。它解决的核心问题是让做路面状态识别的团队跳过最耗时的数据采集和标注环节把精力放在模型调优和部署上。适合谁用做自动驾驶感知、道路养护巡检、气象联动预警的算法工程师以及需要快速验证 YOLOv5 在恶劣天气下检测效果的研究人员。原始图片意味着没有经过过度增强或裁剪保留了真实的光照、水渍反光和雪地纹理这对模型泛化能力至关重要。2. 路面状况四分类的标注逻辑与 YOLOv5 数据组织2.1 为什么用检测框而不是分割掩码路面状况识别本质上是一个区域分类问题但直接做整图分类会丢失空间信息——一张图里可能同时存在干燥路面和湿滑路面。用 YOLOv5 做目标检测把每种路面状态当作一个类别框出来既能定位状态区域又能输出置信度。常见做法是四类ice结冰、snow雪地、wet下雨湿滑、dry干燥。标注时用矩形框紧贴路面状态区域的边界不要框到天空、车辆或路肩。结冰路面和湿滑路面在视觉上容易混淆标注原则是有明显冰晶反光或白色冰层的归为ice只有水膜反光但无冰晶的归为wet。雪地则是有明显积雪覆盖、纹理松软的区域。2.2 YOLOv5 数据集目录结构与标签格式YOLOv5 要求的数据集结构是固定的图片和标签分开存放标签是.txt文件每行格式为class_id x_center y_center width height全部归一化到 0~1。下面是一个标准的数据集目录树road_surface_dataset/ ├── images/ │ ├── train/ │ │ ├── ice_001.jpg │ │ ├── snow_002.jpg │ │ └── ... │ ├── val/ │ │ ├── wet_101.jpg │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── ice_001.txt │ │ ├── snow_002.txt │ │ └── ... │ ├── val/ │ │ ├── wet_101.txt │ │ └── ... │ └── test/ │ └── ... └── data.yamldata.yaml是训练入口配置文件内容如下path: ./road_surface_dataset train: images/train val: images/val test: images/test nc: 4 names: [ice, snow, wet, dry]这里nc是类别数names的顺序必须和标注时的class_id一一对应。很多新手翻车就翻在这里标注时ice是 0snow是 1但data.yaml里写反了训练出来的模型把冰认成雪。建议在标注工具里导出时直接生成classes.txt再手动核对一遍。2.3 原始图片的划分比例与命名规范原始图片不做过度筛选但训练集、验证集、测试集要按 7:2:1 划分。划分时注意同一场景的连续帧不要跨集否则验证集精度会虚高。命名建议用类别_序号.jpg比如ice_001.jpg这样在排查漏标时能快速定位。如果原始图片是行车记录仪截帧分辨率可能是 1920×1080 或更高YOLOv5 训练时默认会缩放到 640×640但建议保留原始分辨率备份后续换用 YOLOv8 或更高输入尺寸时不用重新采集。3. 用 YOLOv5 在本地跑通路面状况检测的最小命令3.1 环境配置conda 建环境与依赖安装YOLOv5 对环境比较敏感建议用 conda 隔离。以下命令在 Linux 和 Windows 的 WSL 下都验证过conda create -n yolov5_road python3.9 -y conda activate yolov5_road git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtpython3.9是兼容性最好的版本3.10 以上有时会碰到torch和torchvision版本冲突。requirements.txt里已经锁定了torch1.7.0如果机器有 CUDApip 会自动装 GPU 版如果没有会装 CPU 版训练速度会慢很多。装完后用python -c import torch; print(torch.cuda.is_available())验证输出True才算 GPU 可用。3.2 训练命令与关键参数设置把前面准备好的road_surface_dataset放到 yolov5 目录下然后执行python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data ./road_surface_dataset/data.yaml \ --weights yolov5s.pt \ --project runs/train \ --name road_surface_v1 \ --cache--img 640是输入尺寸路面状况检测对细节敏感如果显存够可以提到 1280但训练时间会翻倍。--batch 16是批大小显存 8G 以下建议降到 8。--weights yolov5s.pt用预训练权重比从头训练收敛快很多。--cache把图片缓存到内存加速读取但数据集超过 10G 时慎用。训练过程中重点看mAP0.5和mAP0.5:0.95路面状况四分类的mAP0.5一般能到 0.85 以上如果低于 0.7大概率是标注框不准确或类别混淆。3.3 推理验证与结果解读训练完成后用detect.py跑单张图片或整个文件夹python detect.py \ --weights runs/train/road_surface_v1/weights/best.pt \ --source ./test_images \ --img 640 \ --conf 0.4 \ --save-txt--conf 0.4是置信度阈值路面状况检测建议设 0.4~0.5太低会误检太高会漏检。--save-txt会输出每个检测框的类别和坐标方便后续做区域统计。推理结果里如果发现ice和wet频繁互换说明这两类的视觉特征区分度不够需要回看标注数据补充更多冰晶纹理明显的样本。4. 雨雪路面数据集标注与训练的避坑排查4.1 结冰和湿滑标注混淆导致 mAP 卡在 0.6现象训练日志里ice和wet的mAP都在 0.5 左右混淆矩阵显示两者互相误判严重。原因标注时没有统一标准有人把水膜反光标成ice有人把薄冰标成wet。解决重新定义标注规则——ice必须有白色冰层或冰晶颗粒感wet只有深色水膜和反光。找 50 张边界样本团队统一标注后再全量检查。4.2 原始图片分辨率过高导致训练 OOM现象--img 1280时 CUDA out of memory降到 640 又觉得小目标漏检。原因原始图片可能是 4K 分辨率直接缩放会丢失细节但放大输入尺寸又爆显存。解决先把原始图片裁剪成 1280×1280 的图块再标注或者用--img 960配合--batch 8。更彻底的做法是用 SAHI 切片推理训练时仍用 640推理时切片检测再合并。4.3 数据集中干燥路面样本过少导致类别不平衡现象dry类的mAP很高但ice和snow偏低模型偏向预测干燥。原因原始采集时晴天干燥路面占 70% 以上雨雪天样本少。解决用--weights预训练权重本身能缓解但更直接的是对ice、snow、wet做过采样或者用 YOLOv5 的--rect矩形训练减少填充。也可以在data.yaml里加--hyp自定义超参调高cls损失权重。4.4 标签文件与图片不匹配导致训练报错现象训练启动时报AssertionError: train: No labels found或Label class 4 is invalid。原因标签文件名和图片名不一致或者class_id超出了nc定义的范围。解决写个脚本检查images/train和labels/train的文件名是否一一对应再检查每个.txt里的class_id是否都在0~nc-1之间。下面这个脚本可以直接用import os img_dir road_surface_dataset/images/train label_dir road_surface_dataset/labels/train nc 4 img_files {os.path.splitext(f)[0] for f in os.listdir(img_dir)} label_files {os.path.splitext(f)[0] for f in os.listdir(label_dir)} missing_labels img_files - label_files missing_images label_files - img_files print(f缺少标签的图片: {missing_labels}) print(f缺少图片的标签: {missing_images}) for lbl in os.listdir(label_dir): with open(os.path.join(label_dir, lbl)) as f: for line in f: cls_id int(line.split()[0]) if cls_id nc: print(f{lbl} 中类别 {cls_id} 超出范围)4.5 验证集精度虚高但实际部署效果差现象验证集mAP0.50.9但实际跑视频时漏检严重。原因验证集和训练集来自同一段连续视频场景高度相似模型过拟合到特定光照和角度。解决划分数据集时按采集日期或路段划分确保验证集包含训练集没见过的场景。另外推理时用--augment开启 TTA 测试时增强能提升 2~3 个点。5. 把路面状况检测推到视频流切片推理与类别平滑技巧单张图片检测跑通后真正落地要处理视频流。直接逐帧推理会有两个问题一是远处小目标漏检二是相邻帧类别跳变。我一般用 SAHI 做切片推理再叠加一个简单的投票平滑。SAHI 的安装和用法pip install sahifrom sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeyolov5, model_pathruns/train/road_surface_v1/weights/best.pt, confidence_threshold0.4, devicecuda:0 ) result get_sliced_prediction( test_frame.jpg, detection_model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2 ) result.export_visuals(export_dirsahi_output/)slice_height和slice_width设 640和训练输入一致。overlap设 0.2 保证切片边缘的目标不被截断。切片推理会把大图切成多个 640×640 的小块分别检测再合并远处小目标召回率明显提升。代价是推理速度下降约 40%如果对实时性要求高可以只对图像下半部分路面区域做切片。视频流的类别平滑用滑动窗口投票维护最近 5 帧的检测结果对同一个空间位置IoU 大于 0.5的检测框取出现次数最多的类别作为最终输出。这样能消除单帧误检导致的类别闪烁。代码不复杂核心逻辑是维护一个deque存历史帧结果每帧推理后做一次匹配和投票。还有一个容易忽略的点雨雪天气下镜头本身会沾水或起雾导致整图模糊。如果发现模型在某个视频段突然全类置信度下降先检查镜头是否被遮挡而不是急着调模型。我习惯在推理前加一个简单的图像清晰度评估用拉普拉斯方差判断低于阈值就跳过该帧并告警。这套方案从数据集标注到视频流部署最耗时的其实是标注一致性检查。我的习惯是每标完 200 张就抽 20 张做交叉验证两个人标同一张图IoU 低于 0.7 的框拿出来讨论。这个笨办法帮我省掉了至少三次大规模返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表