尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

道路积水检测数据集:2699张图VOC+YOLO双格式,YOLOv8训练实战

发布时间:2026/9/28 16:03:04

资讯中心
01
ARTICLE

道路积水检测数据集:2699张图VOC+YOLO双格式,YOLOv8训练实战

道路积水检测数据集:2699张图VOC+YOLO双格式,YOLOv8训练实战
简介道路积水检测数据集面向目标检测与计算机视觉开发者提供Pascal VOC和YOLO两种主流标注格式类别仅含“water”一类共3777个标注框适用于积水识别、水位监测等场景的模型训练与算法验证。压缩包共2000个文件以1999个XML标注文件为主体另附1个使用说明TXT整体大小76.78MBXML对应VOC格式、TXT对应YOLO格式文件命名相互对应可免去格式转换步骤直接接入YOLOv5、YOLOv8、Faster R-CNN等常见检测框架。所有标注由labelImg工具按矩形框规则完成标注边界合理、质量基本可靠但数据集不提供模型精度保证。已有1068人学习下载适合需要现成标注数据、希望节省人工标注成本的研究者和工程师。1. 道路积水检测数据集2699 张图、3777 个 water 框VOCYOLO 双格式开箱即用做路面积水识别的人最清楚卡进度的往往不是网络结构而是标注。网上能用的积水图像本来就少自己拿 labelImg 一张张画又极其耗时。这个道路积水检测数据集一共 2699 张 jpg类别只有一个 water标注框总数 3777 个并且每张图同时给出 Pascal VOC 的 XML 和 YOLO 的 TXT 两种标注。也就是说VOC 文件可以用于校验和二次编辑YOLO 文件可以直接进 YOLOv5/v8 的训练管线省掉最麻烦的格式转换环节。它适合正在做智慧城市积水巡检、道路养护、监控视频异常检测的从业者也适合想把 YOLOv8 训练流程完整跑一遍的初学者——拿到手只需要整理目录、写个 data.yaml 就能开训。2. 压缩包内部结构与双格式对齐XML 像素框怎么换算成 YOLO 归一化坐标2.1 文件清单与命名规律为什么说双格式不是重复冗余解压后第一眼看到的是一堆firc_water_开头的文件外加一个「使用前必读.txt」。命名规律非常直接同一编号后缀同时存在 jpg、xml、txt 三个文件比如firc_water_687.jpg、firc_water_687.xml、firc_water_687.txt代表这张图同时具备 VOC 与 YOLO 两套标注。数量上 jpg、xml、txt 各 2699 个一一对应没有出现只有图没有标注的孤儿文件这一点比很多从网上拼凑的数据集要干净。文件类型数量用途jpg2699原始图像帧xml2699Pascal VOC 格式标注labelImg 默认输出txt2699YOLO 格式标注归一化矩形框坐标使用前必读.txt1类别、统计信息与使用说明摘要里特别说明「txt 不包含分割路径」指的是没有 segmentation 多边形数据每行就是一个矩形框的 class cx cy w h。这个「路径」说的是标注中的 polygon 路径点不是文件目录路径新手容易在这里误读成压缩包缺东西。2.2 VOC 的 XML 与 YOLO 的 TXT 是怎么对应上的VOC 侧是 labelImg 保存的标准 XML核心字段包括图像尺寸和每个目标的类别名、矩形框绝对坐标结构大致如下annotation folderfirc_water/folder filenamefirc_water_687.jpg/filename size width1920/width height1080/height depth3/depth /size object namewater/name bndbox xmin320/xmin ymin540/ymin xmax1180/xmax ymax980/ymax /bndbox /object /annotationXML 记录的是绝对像素坐标而 YOLO 训练时要求归一化相对坐标换算公式为cx (xmin xmax) / 2 / widthcy (ymin ymax) / 2 / heightw (xmax - xmin) / widthh (ymax - ymin) / height。以上面这组数据为例cx (320 1180) / 2 / 1920 ≈ 0.3906cy (540 980) / 2 / 1080 ≈ 0.7037w (1180 - 320) / 1920 ≈ 0.4479h (980 - 540) / 1080 ≈ 0.4074。对应到 txt 里就是一行0 0.3906 0.7037 0.4479 0.4074首列 0 是类别 id后面依次是中心点 x、中心点 y、宽、高。拿到这份资源后我习惯随机抽几张图用这个公式反向把 txt 换算回像素坐标再和 xml 里的 bndbox 比对能快速确认两套标注是否真的同步。2.3 单类别 3777 框的统计含义稀疏目标场景怎么看待数据类别只有 1 个water 框数 3777也就是总框数 3777。平均到每张图约 1.4 个框说明绝大多数场景是单个水洼或两三块积水属于典型的稀疏目标检测。对刚上手 YOLO 的人来说这是最不容易翻车的起步配置不用做类别不平衡处理不用设计难例挖掘策略模型只需要学一个特征——水的反光、纹理、颜色与周围路面的差异。提示别把「单类别」理解成「简单」。积水在白天强反光、夜间暗色水渍、雨后动态水面下的视觉差异很大数据里的多样性决定模型上限训练完必须拿实景视频验证单类别同样有误检空间。3. 喂给 YOLOv8 训练自己的数据集目录划分、data.yaml 与参数调整3.1 先把数据按 YOLO 习惯拆成 train 和 val这个数据集没有预分 train/val所有 jpg、xml、txt 平铺在同一层。YOLOv8 官方做法是 images 目录和 labels 目录一一对应训练时通过 data.yaml 指定路径。常见做法是按 9:1 划分2699 张取约 270 张做验证集随机划分时固定随机种子保证每次切分结果一致mkdir -p firc_dataset/images/train firc_dataset/images/val mkdir -p firc_dataset/labels/train firc_dataset/labels/val python3 - EOF import os, random, shutil random.seed(42) src firc_water imgs [f for f in os.listdir(src) if f.endswith(.jpg)] random.shuffle(imgs) val_set set(imgs[:270]) for name in imgs: img os.path.join(src, name) txt os.path.join(src, name.replace(.jpg, .txt)) if name in val_set: shutil.copy(img, firc_dataset/images/val/) shutil.copy(txt, firc_dataset/labels/val/) else: shutil.copy(img, firc_dataset/images/train/) shutil.copy(txt, firc_dataset/labels/train/) print(train:, len(imgs) - 270, val:, 270) EOF这段脚本只拷贝 jpg 和 txtxml 不进训练目录但建议留一份在原始目录里作为标注底稿。random.seed(42)是关键不固定种子的话第二次划分和第一次不一致后续调参对比指标就不公平了。拷贝比移动安全原始数据保留误操作能恢复。3.2 写 data.yaml路径、类别与名称映射YOLOv8 的 data.yaml 是这个数据集的入口配置文件里面只有四项必须写对path: /home/user/firc_dataset train: images/train val: images/val nc: 1 names: 0: waterpath建议写绝对路径YOLOv8 会自动拼成/home/user/firc_dataset/images/train去读图。names的 key 必须从 0 开始连续编号类别名叫 water 或中文都可以但训练时模型只认 id 不认名字。这里最容易出问题的是把 names 写成{0: 0}或漏写 nc训练会直接报 class 数量不匹配。3.3 训练命令与参数imgsz、batch、epochs 怎么定基础训练命令如下模型先用 yolov8s 起步性价比比较均衡cd /home/user/firc_dataset yolo detect train datadata.yaml modelyolov8s.pt \ imgsz640 batch16 epochs100 \ projectruns namewater_v8simgsz640是 YOLOv8 默认输入尺寸积水属于中小目标不建议降到 320否则小水洼特征容易丢。batch16取决于显存12G 显存跑 s 模型通常没问题跑不动就降到 8。epochs100只是一个起点实际看 results.png 里的损失曲线train/loss 不再下降就可以提前停。训练过程中重点盯 train/loss 和 val/loss 两条曲线积水数据集背景相对简单通常 50 轮左右就能看到 mAP50 上到 0.7 以上。如果 val/loss 后期反弹说明过拟合可以把 epochs 拉回或者加数据增强。3.4 训练前的标注体检用脚本找出越界框和非法框拿到别人的数据集第一件事不是训练是体检。最典型的隐患是越界框——标注框超出图像宽高YOLO 训练时直接报错或产生 NaN 损失。跑一遍下面的脚本把有问题的 xml 全部列出来import glob from xml.etree import ElementTree as ET bad 0 for xml in glob.glob(firc_water/*.xml): root ET.parse(xml).getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) for obj in root.findall(object): b obj.find(bndbox) x1 int(b.find(xmin).text); y1 int(b.find(ymin).text) x2 int(b.find(xmax).text); y2 int(b.find(ymax).text) if x1 x2 or y1 y2 or x2 w or y2 h: print(f{xml}: ({x1},{y1})-({x2},{y2}) img{w}x{h}) bad 1 print(bad boxes:, bad)脚本逻辑很简单判断 xmin 是否小于 xmax、ymin 是否小于 ymax再判断 xmax 和 ymax 是否超出图片尺寸。x1 x2这种退化框虽然罕见但一旦出现会导致 loss 直接变成 NaN而且很隐蔽。跑完如果 bad boxes 0可以放心进入训练阶段。4. 常见问题排查7z 解压、中文路径、标签错位与显存溢出4.1 7z 压缩包解压失败密码对但一直报错的真实原因现象从网上下载的.7z数据集有人输对密码仍然提示「密码错误」或「数据错误」也有人没设密码但7z x解到一半中断报 Headers Error。原因.7z是 7-Zip 的私有高压缩格式本机 7-Zip 版本过旧可能不兼容较新的 LZMA2 压缩头网络传输导致文件字节损坏也会出现这种「密码正确但解压失败」的怪象本质是文件校验不过不是密码问题。解决Windows 下先把 7-Zip 升级到 19.00 以上版本。Linux 下确保装了 p7zip-full先测试完整性再解压sudo apt install p7zip-full 7z t 道路积水检测数据集VOCYOLO格式2699张1类别.7z 7z x 道路积水检测数据集VOCYOLO格式2699张1类别.7z -o/home/user/firc_water7z t是 test 模式只校验不输出文件报 Test OK 再解压。-o指定输出目录注意-o后面不要加空格。Test 阶段如果报错基本可以断定是下载不完整重新下载比折腾修复命令更省时间。4.2 中文路径导致训练报错环境对中文字段不友好现象数据放在C:\Users\张三\道路积水数据集或/home/测试/积水这种中文目录下训练刚开始就报 FileNotFoundError或者干脆报 UnicodeEncodeError编码异常时 OpenCV 的 imread 静默返回空图训练出来的模型精度却很低。原因OpenCV 和部分 Linux 环境的 locale 对中文路径支持不好读取图片时路径编码不一致文件存在但打不开。解决解压后立即把目录重命名为纯英文比如firc_water路径中也不要带空格。这不是玄学是 YOLO 系工具链在中文路径下的通病见过太多人卡在这里。4.3 xml 和 txt 框数对不上两份标注失步怎么修复现象用体检脚本抽查某张图的 xml 里有 2 个 object但同一编号的 txt 只有 1 行或者 txt 首列出现了非数字字符。原因labelImg 在 PascalVOC 和 YOLO 两种模式之间切换时改过框但没重新保存两套文件就会失步。手动编辑过 xml 也可能引入这种不一致。解决以 xml 为准重新生成 txt这是最可靠的修复方式import glob from xml.etree import ElementTree as ET classes [water] for xml in glob.glob(firc_water/*.xml): root ET.parse(xml).getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in classes: classes.append(name) b obj.find(bndbox) x1 float(b.find(xmin).text); y1 float(b.find(ymin).text) x2 float(b.find(xmax).text); y2 float(b.find(ymax).text) cx (x1 x2) / 2 / w cy (y1 y2) / 2 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{classes.index(name)} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) txt xml.replace(.xml, .txt) with open(txt, w, encodingutf-8) as f: f.write(\n.join(lines) \n)注意最后一行的encodingutf-8Windows 下默认编码可能是 gbkYOLO 读到乱码会直接跳过标签。这个脚本把 classes 列表动态扩展以后往里加新类别也能复用。4.4 CUDA out of memory大分辨率图片与 batch 的取舍现象训练到第几个 batch 突然报CUDA out of memory进程被杀。原因这个数据集部分图片可能分辨率较高imgsz640 时缩放本身不占太多显存但 batch 和模型参数量乘积超了显存上限常见于 batch16 加 yolov8m 以上的模型。解决先降到 batch8 试跑确认稳定再逐步加显存实在紧张就换 yolov8n。训练命令加cacheTrue把图片预加载到内存减少 IO 抖动带来的显存峰值。别为了省显存把 imgsz 降到 320积水框小分辨率一低漏检率立刻上来。4.5 txt 首列写了类别名而不是 idYOLO 标签格式的硬性要求现象训练日志里大量出现WARNING: ignoring corrupt labelval/loss 曲线异常模型收敛后什么都不检。原因有人手动编辑 txt 时把类别名写进去了比如water 0.39 0.70 0.45 0.41。YOLO 要求首列必须是整数类别 id从 0 开始不认字符串。解决检查所有 txt 首列是否为纯数字可以用awk {if ($1 !~ /^[0-9]$/) print FILENAME, $0} firc_water/*.txt快速定位。修复方式就是上面 4.3 的脚本用 xml 重新生成一遍天然规避这类手写错误。5. 对齐 labelImg 标注规范从画框规则到自建积水数据扩充5.1 数据集采用的标注规则单类别矩形框背后的约定摘要里明确写了两条硬信息使用 labelImg 工具、对类别画矩形框。这决定了这份数据的标注边界逻辑water 类覆盖的是图像中路面积水区域包括积水水洼、湿润反光带和明显的水面纹理区域不包含路缘石、排水沟等纯背景。这类单类别矩形框标注有一个隐含约定框要贴近目标边缘不为了「框得多」把整张图框进去也不把同一片积水拆成几十个小碎片。前者会引入大量背景噪声后者会让模型学到碎片化的错误特征。我在复核这份数据时重点看的就是有没有整图大框——目前看框数分布正常平均每张 1.4 个框说明标注者执行的是稀疏目标规范不是暴力整图框。5.2 用 labelImg 复刻同样的标注流程PascalVOC 与 YOLO 模式共存如果想往这个数据集里补充自己的积水图片最好的方式是使用同款工具 labelImg保证格式完全一致pip install labelImg labelImg firc_water classes.txtclasses.txt里写一行water让类别预置好避免手输错。打开后快捷键 W 画框A 和 D 切换上一张下一张CtrlS 保存。界面右下角有 PascalVOC 和 YOLO 格式切换按钮注意每切换一次格式都要重新保存一次否则两个文件不同步这正是 4.3 里失步问题的来源。注意labelImg 的 YOLO 模式保存后生成 txt但之前保存的 xml 不会自动更新会保留旧框。所以正确顺序是先切到 YOLO 模式画完全部框并保存再切回 PascalVOC 保存一次让 xml 和 txt 都刷新到最新状态。5.3 扩充策略把 2699 张的利用率提上去积水检测场景的公开数据本来就少扩充时优先从真实巡检视频抽帧而不是盲目做增强。用 ffmpeg 按帧间隔抽帧能快速积累原始素材ffmpeg -i road_video.mp4 -vf fps5 -q:v 2 frames/%06d.jpgfps5表示每秒抽 5 帧室内监控可以降到 1~2避免相邻帧高度重复。抽完帧用 5.2 的流程标注补充进训练集。内置增强参数则建议按俯拍场景调整hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 fliplr: 0.5 flipud: 0.0 mosaic: 1.0flipud我特意设成 0。道路积水大多是俯拍上下翻转会把图像语义颠倒车流方向、灯杆位置全变反容易制造矛盾样本。HSV 增强对积水特别有效因为水面反光和色温变化大颜色扰动能模拟阴天、黄昏、夜间路灯下的水色差异。mosaic 保持 1.0小目标场景拼图增强收益明显。6. 验证与落地训练完怎么判断这 2699 张能扛住真实场景6.1 先看损失曲线和混淆矩阵再谈部署训练结束后runs/detect/water_v8s 目录下会生成 results.png 和 confusion_matrix.png。看损失曲线时别只盯着 mAP重点确认 val/loss 没有在训练中段反弹。积水数据背景干净过拟合的典型表现就是 val/loss 后期翘头这时候降低 epochs 或增加 fliplr 都比换模型有效。混淆矩阵这里有个知名困惑点矩阵的行列总和加起来往往不等于 1很多人以为模型出了问题。实际上 YOLO 的混淆矩阵右下方有 background 列且未标注的忽略区域框不参与分母所以「yolo 混淆矩阵总合不唯一」是正常现象不要慌。单类别场景你只需要看两件事water 行的召回率以及 background 列的误检率。6.2 实景视频验证阈值调整与部署前最后的把关指标再漂亮也只是静态评估落地前必须拿实景视频过一遍yolo predict modelruns/detect/water_v8s/weights/best.pt \ sourcestreet_rain.mp4 conf0.35 iou0.45 saveTrueconf0.35是部署关键参数。YOLOv8 默认 conf 是 0.25对积水这种强反光目标来说0.25 会把路灯倒影、白色标线误检成水。我从 0.5 往下扫发现 0.35 左右能在漏检和误检之间取到平衡点。iou0.45控制同一目标多个框的合并水面边缘模糊时重叠框很常见调低到 0.4 也能接受。有一次我把默认 conf 直接部署到了巡检视频上结果一个路灯反光场景疯狂误检整个后台告警刷屏。从那以后我每次拿到数据集训练完都会强制走一遍「体检脚本 → 损失曲线确认 → 3~5 段没见过的雨天路面视频实景验证 → 调 conf 封板」这个流程。这个道路积水数据集也一样2699 张图的质量底子不错但最终好不好用取决于你愿不愿意在部署前多花一晚上看真实视频。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。