资讯动态

智慧城市道路设施检测数据集:13000张已标注图片,目标检测直接可用

发布时间:2026/10/22 11:00:34 来源:尧图企业网站定制
最近在做一个智慧城市巡检项目需要训练一套能识别城市道路设施和道路安全隐患的检测模型。最头疼的其实不是模型怎么搭而是数据从哪来。自己带车去路上拍一个区跑下来就是好几百公里还要处理光照、遮挡、运动模糊一堆问题等数据整理干净两个星期就过去了。后来拿到一套城市道路设施及道路安全隐患数据集13000张图片已经划分好、已经标注完直接就能送进目标检测流程里跑省掉的时间不是一点半点。这套数据集覆盖的内容很明确城市道路里的各类设施井盖、护栏、标线、标志牌、路灯等和安全隐患坑洼、裂缝、破损、积水、施工区临时设施等都是道路养护和智慧交通场景里最常见的检测目标。适合这几类人做智慧城市/智慧养护项目的算法工程师需要快速验证目标检测方案的团队搞自动驾驶感知但想补充结构化道路要素的开发者以及拿真实场景数据做毕业设计或课题研究的学生。如果你正在找一份“拿来就能用”的道路场景检测数据这篇就把这套数据的底细、怎么用、以及我实际踩过的坑一次讲清楚。1. 数据集整体设计与思路拆解1.1 为什么需要“道路设施安全隐患”联合数据集传统道路巡检基本靠人工。养护工人开着巡检车或者干脆步行用肉眼一张张看路面哪里有坑、哪里有裂缝、哪块护栏歪了。这种方式的问题不用多说效率低、主观性强、很容易漏检而且巡检结果没有标准化的记录方式今天这个师傅记一段明天那个师傅记一段后期做统计和维修排期非常痛苦。所以现在行业里都在往自动化巡检方向走核心就是给巡检车装上摄像头用目标检测模型实时识别路面病害和设施异常。但“识别”的前提是“数据”。一个能用的道路目标检测模型训练数据必须有这几个特点场景覆盖面广、目标类别足够全、标注质量稳定、划分逻辑合理。这套13000张图片的数据集就是围绕这个需求来的。它把“道路设施”和“安全隐患”放在同一个数据集里这一点很关键。因为在实际巡检中设施完好与否本身就是判断安全隐患的依据——一个破损井盖既是“设施异常”也是“安全隐患”一条严重裂缝既是“路面病害”也预示着结构风险。把两类目标放在统一的数据体系里模型学到的特征更接近真实巡检逻辑训练出来的模型也能在一个框架里同时输出设施状况和风险提示而不是分两套系统跑两遍。1.2 13000张图片的构成逻辑与方案选型先说为什么是图片不是视频帧。视频数据虽然量大但相邻帧之间高度相似直接拿去训练会造成严重的冗余——模型见过同一段路的几十张“几乎一样”的图真正能够提升泛化能力的信息并没有增加多少。这套数据集直接给的是图片而且是经过抽帧清洗后的有效图片相当于已经帮你把视频数据里最核心的“关键时刻”都挑出来了。13000张里面train/val/test已经按比例划分好不用自己再动手分割。为什么用目标检测而不是实例分割或语义分割这也是个现实考量。道路巡检这类任务业务上需要知道的是“哪里有问题、什么问题、大概多大范围”目标检测输出的边界框bounding box已经能支撑这些需求——比如知道一个坑洼的坐标位置和尺寸就足够派单给养护班组去维修了。实例分割精度更高但标注成本几乎是检测的3到5倍对硬件部署的要求也更高。在巡检车这种边缘计算场景里检测模型在算力有限的工控机上能跑实时分割模型往往做不到。所以目标检测是这个场景里性价比最高的选择。数据划分的比例也经得起推敲。按照常见的7:2:1划分训练集约9000张验证集约2500张测试集约1500张。这种划分的好处是训练集足够支撑模型收敛验证集能稳定反映调参方向测试集又能提供一个相对公平的最终评估基准。有些数据集的划分非常随意测试集太大导致训练不充分或者验证集太小导致调参噪音大这套数据没有这个问题。1.3 标注体系背后的“为什么”拿到数据我先做了个统计发现它的标注类别设计是有讲究的。不是把路上所有东西都标出来而是聚焦在“与道路安全和养护直接相关”的目标上。比如井盖破损/缺失、护栏破损/缺失、路面坑洼、路面裂缝、标线磨损、交通标志异常倾斜/破损/被遮挡、施工围挡、路障锥桶、路面积水、路灯异常等。这个类别体系的合理性在于覆盖了两种尺度差异很大的目标。井盖、锥桶、裂缝属于中小目标在画面里可能只占几十个像素而施工围挡、护栏属于大目标可能横跨整幅图像。如果只做单一尺度的数据模型很容易对某个尺度产生偏置。这套数据里大目标、中目标、小目标都有分布对训练一个尺度鲁棒的检测器很有帮助。标注选项采用矩形框但框得比较严格对所有目标都按照“包含整个目标本体、不截断、不扩边”的原则来标。这一点我在后面做训练评估时深有体会——标注框贴合目标模型学到的边界才干净推理阶段的定位精度才会高。很多公开数据集的标注都松松垮垮的用起来非常难受这套数据在这点上做得比较规整。2. 核心细节解析与实操要点2.1 类别体系与标注格式详解这套数据的标注格式兼容主流目标检测流程。我拿到手看到的是比较标准的格式同时附带了转换脚本可以根据需要转成你要的格式。以下是常见的三种格式对比格式文件后缀关键内容典型框架VOC格式.xml目标类别、坐标xmin/ymin/xmax/ymax老牌检测框架Faster R-CNN等COCO格式.json类别ID、分割/框坐标、图片元信息Detectron2、MMDetectionYOLO格式.txt类别ID、归一化中心坐标x_center/y_center/w/hYOLO全系、Ultralytics框架这里要特别提醒YOLO格式的坐标是归一化到0到1之间的不是像素坐标。我第一次用某个数据集的时候没注意这点直接把像素坐标喂进去结果模型训练了50个epoch后loss完全没降最后发现是归一化处理出了问题。如果你的数据源是VOC或者COCO格式转换到YOLO格式时一定要做归一化公式很简单x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height w (xmax - xmin) / image_width h (ymax - ymin) / image_height如果拿到的是已划分好的YOLO数据布局一般是这样的dataset/ ├── images/ │ ├── train/ # 约9000张 │ ├── val/ # 约2500张 │ └── test/ # 约1500张 ├── labels/ │ ├── train/ # 对应的txt标注 │ ├── val/ │ └── test/ ├── data.yaml # 数据配置文件 └── classes.txt # 类别列表data.yaml的内容也很简单按需调整一下路径就能用path: /path/to/dataset train: images/train val: images/val test: images/test nc: 10 names: [manhole_damaged, guardrail_broken, pothole, crack, marking_faded, sign_abnormal, barrier, cone, water_accumulation, streetlight_off]2.2 标注质量对训练效果的影响到底有多大很多人低估了标注质量的影响。同一份数据标注框贴合度差2到3个像素最终训练出来的mAP可能差3到5个百分点这不是玄学是实打实的loss信号质量差异。目标检测的回归头学的是“预测框到真实框的距离”如果真实框本身位置不准确模型学到的映射关系就是错乱的推理时哪怕分类对了定位也会偏。这套数据集在标注质量上做得比较难得主要体现在三点一是框的贴合度高基本没有包含大量背景的多余边距二是目标被遮挡时依然按照可见部分来标而不是直接漏标三是同一类别的标注标准统一比如“井盖破损”统一只标井盖本身不把周围路面也圈进去。这些细节在训练时可能感觉不出来但在测试集上对比评估时差距非常明显。另外我建议拿到任何数据集后都不要直接开跑先做一轮标注质量快速抽查。方法很朴素随机抽200张图用可视化脚本把标注框画出来肉眼过一遍看看有没有类别标错、框完全偏掉、或者漏标的。200张图大概半小时就能看完但能帮你避免跑完整个训练流程后才发现数据问题的尴尬。2.3 小目标占比与背景复杂度这两个隐藏难点道路场景的目标检测两大难点是绕不开的小目标和复杂背景。这套数据的图片分辨率不低但井盖、裂缝、锥桶这类目标在画面中占比仍然很小特别是裂缝往往是长条形的宽只有几个像素长可能跨几十个像素检测器要准确捕捉这种细长目标并不容易。背景复杂度也很高树影、路面纹理、轮胎痕迹、水渍这些都会形成干扰模型很容易把“很像裂缝的阴影”误检成裂缝。所以我拿到数据后做的第一件事不是调模型结构而是先统计小目标的分布比例。具体做法是计算所有标注框相对于图片的面积占比如果小于0.05%则视为小目标然后统计这个比例在训练集和验证集中是否一致。如果一致说明数据划分是均匀的如果不一致就需要做层次采样重新划分否则验证集评估出来的指标不具备参考性。这套数据在我统计下来类别分布和尺度分布都还算均衡没有出现某个类别在训练集里很多、验证里几乎没有的极端情况。3. 实操过程与核心环节实现3.1 环境准备与数据完整性检查实操第一步不是装环境而是检查数据完整性。图片和标注文件要一一对应这是最容易出问题的环节。我写过一个快速校验脚本核心逻辑很直接遍历所有图片文件检查同名的标注文件是否存在再检查标注文件里的类别ID是否越界、坐标是否在图片尺寸范围内、框是否宽高为0。import os from PIL import Image def check_dataset(img_dir, label_dir, nc10): img_files [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] errors [] for img_file in img_files: label_file os.path.splitext(img_file)[0] .txt label_path os.path.join(label_dir, label_file) if not os.path.exists(label_path): errors.append(f{img_file}: missing label) continue with open(label_path, r) as f: lines f.readlines() if not lines: errors.append(f{label_file}: empty label) for line in lines: parts line.strip().split() if len(parts) ! 5: errors.append(f{label_file}: bad format) continue cls_id int(parts[0]) if cls_id nc: errors.append(f{label_file}: class id {cls_id} out of range) return errors errs check_dataset(dataset/images/train, dataset/labels/train) print(ferrors: {len(errs)}) for e in errs[:10]: print(e)环境方面我用的就是目前的Ultralytics检测框架一条命令装完所有依赖。GPU环境建议显存至少8GBbatch size可以开到16如果显存不够就调到8模型选轻量版。pip install ultralytics3.2 模型选型与训练参数设定在模型选择上我建议从YOLO系列的轻量级模型开始。以开源的YOLOv8s为例参数量约1100万在道路场景的复杂背景下精度和速度的平衡比较好。如果你有更强的算力可以尝试m或l版本精度会有提升但对部署端的帧率要求要提前评估。训练参数这边我第一轮用的是比较保守的配置yolo detect train \ dataroad_data.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ optimizerSGD \ patience30几个关键参数为什么这么定我展开说说imgsz640YOLO系列在640输入下能兼顾精度和速度道路设施目标大多数在中等尺度640足够了。如果你要重点优化小目标可以试768或896但推理耗时也会相应增加。epochs200这个量级的训练集100个epoch模型基本能收敛200个epoch是为了确保曲线平稳配合早停机制不会浪费太多时间。batch16这是16GB显存机器上的稳妥选择。batch过小会导致loss波动大收敛慢过大可能在复杂背景数据上过拟合更早。lr00.01 SGDSGD比AdamW泛化性好一些在道路场景这种背景多样化的数据上SGD训练出来的模型往往稳定性更好。AdamW收敛快但容易在后期震荡适合做迁移学习的第二阶段微调。我第一轮训练的结果在验证集上mAP0.5大约在0.83左右mAP0.5:0.95在0.57左右。这个水平对道路巡检来说已经能用了但还有不少提升空间后面就是针对难点逐步调优。3.3 训练评估与针对性调优训练完之后不要只看mAP要拆开看具体类别的表现。我通常用混淆矩阵和各类别PR曲线来分析。在道路场景里最容易出现两类问题一是“裂缝”被误检成阴影二是“井盖破损”和“普通井盖”之间的混淆——如果数据里没有标注“正常井盖”作为负样本模型很容易把所有井盖都判定为破损。我自己排查时的做法是把验证集里所有预测错误的图片全导出按错误类型分类。一张张看误检图比看指标有用得多。比如我发现“护栏破损”的漏检主要集中在远处目标上通过进一步分析找到原因护栏这种细长结构在远处只有很小的高度特征不明显。解决方案是在训练时把mixup和mosaic增强都打开并且适当上调输入分辨率到768让模型在训练时能看到更清晰的远处护栏特征。数据增强这块我强烈建议在道路场景下开启马赛克增强和HSV色彩扰动。马赛克增强可以将四张图拼接成一张增加背景多样性对减少过拟合效果明显HSV扰动则模拟不同天气、不同光照下的色彩变化增强模型的色彩鲁棒性。我实测在不开任何增强时mAP0.5大概在0.78左右开启马赛克和HSV后提升到0.83以上涨点非常明显。3.4 模型导出与边缘部署道路巡检的部署场景大多是边缘设备也就是巡检车上的工控机或者嵌入式设备。训练完模型后一般要导出成ONNX或者TensorRT格式再部署。以测边部署为例导出命令很简单yolo export modelbest.pt formatonnx opset12 imgsz640如果目标设备是N卡工控机可以直接转成TensorRT加速引擎推理速度能提升2到3倍yolo export modelbest.pt formatengine device0 imgsz640部署时要注意输入图像的预处理细节——YOLO系列的预处理是在内部完成的但如果你自己写推理代码就要保证resize的方式和训练时一致否则检测精度会明显下降。具体来说YOLO的resize是等比缩放加padding到640×640而不是直接拉伸这个细节很重要。我实际部署到一块低功耗工控机上跑过YOLOv8s在640输入下TensorRT推理速度大约在15到25毫秒每帧换算下来帧率足够覆盖巡检车正常行驶速度下的抓拍需求实时性完全没问题。4. 常见问题与排查技巧实录4.1 样本不均衡少样本类别的处理思路巡检数据天然存在不均衡问题。坑洼、裂缝这类常见病害样本多而路灯故障、交通标志异常这类样本相对少。在13000张数据集里各类别样本量虽然有差异但差距没有到“完全训练不起来”的程度。如果遇到少样本类别我的处理顺序是先看类别样本量分布如果最少的类别与最多的类别差距超过10倍才需要额外处理。处理手段从轻到重依次是收集同场景公开数据补充少类样本对少类样本做复制粘贴增强把目标贴到不同的背景图里在训练重加权class weighting提高少类别的loss贡献不建议一上来就删多类样本做均匀采样这会浪费大量有效数据。我见过有人为了让各类别数量一致把井盖样本从3000张降到300张结果井盖检测精度直线下降。4.2 小目标漏检与阴影误检的针对性解法小目标漏检和阴影误检是道路数据集里最常见的两个问题绝大多数时候这两个问题是同时出现的。裂缝在远处很小容易被漏检树影形状又像裂缝容易被误检。我实测下来最有效的组合方案是将输入分辨率从640提到896开启马赛克增强并在训练后处理中适当提高置信度阈值到0.35到0.4。提高阈值虽然会让部分真目标漏掉但能大幅压低误检率让最终部署的效果更可用。如果你希望兼顾召回可以低阈值加上目标轨迹跟踪时序信息能帮你在多帧中确认同一目标误检会被自然过滤掉。也有人用切图tiling的方式处理小目标把大图切成若干640的小图分别推理小目标检测率提升最明显但推理耗时也会成倍增加。巡检车的算力有限我一般不建议这么做优先靠多尺度训练来缓解。4.3 标注松弛与类别混淆的“清洗三板斧”公开数据集的清洗是必修课这套数据也不能说100%完美。我的经验是拿到数据后做一次“清洗三板斧”第一板斧是尺寸过滤。把所有标注框宽度或高度小于3像素的目标直接删掉这些极小目标对训练只有噪音没有有效信息。第二板斧是宽高比过滤。如果某个目标的标注框宽高比极其夸张比如超过20:1检查一下是不是标错了或者是不是本就该用实例分割来表示的更细长目标。第三板斧是类别一致性检查特别留意“同物异名”或“异物同名”的情况比如“pothole”和“socket”在某些地区是不同概念但在标注时可能被混用。这三板斧做一次大概半小时能过滤掉不少问题样本。过滤后重新跑一次训练mAP能稳定提升0.5到1个百分点虽然不多但属于白捡的收益。4.4 不同天气与光照的泛化问题道路巡检不可能只在晴天中午跑雨天、阴天、夜间都是真实作业场景。如果是用白天晴天数据训练的模型雨天推断时误检率通常会显著上升因为雨滴反光和水面倒影都会制造出“看起来像坑洼”的特征。这套数据集在不同天气和光照环境下都有覆盖但分布不均。我的建议是训练时把HSV增强的参数范围调大一些比如Hue扰动调到0.015左右Saturation扰动调到0.7Value扰动调到0.4这样模型能学到更宽泛的色彩变化模式。如果想要更极端的鲁棒性可以在推理前端加一个简单的自适应图像增强模块对低照度图像做直方图均衡化后再送进模型。实测下来经过HSV增强训练后的模型在阴雨天的mAP下降幅度可以从8到10个百分点收窄到4到5个百分点。如果项目对恶劣天气有硬性要求更稳妥的方案是额外采集雨天、雾天的数据做补充训练单靠数据增强无法完全替代真实场景样本。写在最后这套13000张图片的道路设施及道路安全隐患数据集我实际拿来跑项目之后最大的感受是省下的最宝贵资源是我的时间。数据划分合理、标注格式标准、类别覆盖贴合真实业务从拿到手到跑出像样指标只花了两天时间。如果自己采集清洗这个周期至少要三到四周。不过我也要提醒一句任何数据集都不可能完全替代针对性采集。如果项目要交付给某个特定区域使用最好在模型基本可用后再去目标区域采集一小批代表性数据做微调尤其是当地特有的设施类型和路面材料特征这种区域适配不是通用数据集能解决的。我现在的做法是永远把公开数据集当作起点把领域采集当作终点两者配合最终交付的模型才真正扛得住现场环境的考验。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑