搞了几年道路病害检测,我心里最清楚一件事:真正折磨工程师的往往不是模型结构调参,而是数据。最早接触裂缝识别时,我为了凑一个像样的训练集,连续几周在开源社区里翻来翻去,资料散得到处都是,有些数据集在论文里提了名字,但真正能下载、能直接用的没几个。后来慢慢摸清了门路,才发现社区里其实沉淀了一批质量相当不错的道路裂缝和坑洼图像开源数据集,只是信息太分散,新手很难一次性找全。
这篇就把我用过的、调研过的道路裂缝和坑洼图像开源数据集统一汇总一下,顺便把数据选型、格式转换、训练踩坑这些实操内容一起讲清楚。如果你正打算做路面病害识别、裂缝分割、坑洼检测这类项目,或者准备拿这些数据集做算法对比、写论文实验,这篇应该能替你省下大量翻文档、找资源的时间。
1. 道路病害检测为什么先要解决数据问题
1.1 裂缝和坑洼检测任务的实际痛点
路面病害检测在计算机视觉里看起来是个“标准目标检测/分割任务”,但真正上手后你会发现它比想象中麻烦得多。裂缝本身形态差异极大,有横向、纵向、网状、块状,宽度从毫米级到厘米级都有,光照一变、路面纹理一变,同一个模型的表现可能天差地别。坑洼相对好认一些,但形状不规则、边缘模糊,还经常和阴影、水渍混在一起。
这些还只是算法层面的难点,数据层面的难题更现实。路面病害图像标注特别费人力,像素级标注一条裂缝可能要好几分钟,一张图上的裂缝又往往是连续蜿蜒的,标起来极容易疲劳。自己做数据,短期内根本攒不出足够的量,更别说覆盖不同光照、不同路面材质、不同拍摄设备的情况。
所以大多数团队做这个方向,都会先拿开源数据集验证算法可行性,确认模型能收敛、指标能看之后,再针对实际场景补充自己的数据微调。这几乎是成本最低的一条路径。
1.2 开源数据集能解决什么,解决不了什么
开源数据集能解决的,是“从无到有”的问题。用它们,你可以快速搭建一套可运行的道路病害检测流程,验证不同的模型结构,对比各种数据增强策略,甚至直接作为论文实验的基准。很多数据集本身带有论文发表背景,标注规范、评测指标明确,用来做算法对比很有说服力。
但也要泼一盆冷水:开源数据集几乎不可能直接满足你的实际部署需求。因为每个数据集的采集地域、拍摄设备、标注口径都不一样,你在训练集上刷到的指标,换到自己的现场图像上往往会明显下降。这是领域泛化问题,不是单靠调参能解决的。正确的心态是,开源数据集用于启动项目和验证思路,实际部署前一定要采集一部分目标场景的数据做迁移。
1.3 数据集分类的常见维度
整理这些数据集之前,我习惯先按三个维度把它们归类,这样选型时会更清晰。
按采集平台分:手持相机或手机拍摄的近距离图像、车载相机拍摄的道路正前方图像、无人机或高位相机拍摄的大场景图像。三类图像的拍摄角度和距离差异极大,直接混训通常会互相干扰。
按标注粒度分:图像级分类标注(整张图有没有裂缝)、目标框标注(用矩形框框出病害位置)、像素级分割标注(逐像素标出病害区域)。粒度越细,能做的任务越多,但标注成本也越高,数据量通常也更小。
按病害类别分:纯裂缝数据集、纯坑洼数据集、多类别混合数据集(包含裂缝、坑洼、修补等多种病害)。如果你的目标是多病害识别,最好直接选多类别数据集,而不是把多个单类别数据集强行拼在一起。
2. 经典裂缝数据集逐个拆解
2.1 CFD Crack Forest Dataset:最适合入门的像素级裂缝集
CFD(Crack Forest Dataset)是裂缝检测领域非常经典的数据集,也是我最早用的一批。它采集自南京城市道路,包含118张像素级标注的裂缝图像,图像分辨率统一,标注精度较高。数据集的名字里有“Forest”,指的是用随机森林结合裂缝结构特征做检测的原始方法,但后来更多人直接拿它做深度学习分割训练。
CFD的单张图像尺寸放在今天来看不算大,但它在裂缝检测论文里出场率极高,适合用来快速验证你的分割模型能不能正确学习裂缝的表观特征。我在实测中建议这样用它:先用CFD做模型选型和初步调参,把训练流程整体跑通,再迁移到更大规模的数据集上。因为它的数据量小而精,跑一轮实验很快,非常适合调试阶段。
需要注意,CFD的数据量只有一百多张,直接训练深度模型容易过拟合。我自己的做法是先用它做预实验,验证代码没有bug、loss能正常下降,再换到大数据集正式训练。
2.2 Crack500:背景复杂,训练鲁棒模型的好材料
Crack500数据集来自美国理海大学相关团队,图像取自校园周边道路,共500张道路图像,并提供了像素级裂缝标注。相比CFD,Crack500的图像包含更多现实干扰因素:路面颗粒纹理更明显、有阴影遮挡、有道路标线和落叶杂物,背景复杂度显著提升。
这意味着在Crack500上训练出来的模型,泛化能力通常比只在CFD上训练的模型更可靠。但也因为背景复杂,训练时loss波动会更大,收敛速度更慢。我第一次在Crack500上训练时,发现同样的模型结构,在CFD上能跑到不错的mIoU,到了Crack500上却明显掉点,后来加大数据增强强度、调整损失函数权重,才慢慢拉回来。
如果你想要的是一次比较接近真实路况的模型表现评估,Crack500比CFD更合适。它的图像尺寸较大,训练时需要关注显存占用,一般会先切块(crop)再送进网络。
2.3 DeepCrack:像素级裂缝的经典基准
DeepCrack数据集基于之前一个更早的数据集扩展而来,包含537张像素级标注的裂缝图像。它的特点是裂缝形态以细微裂纹为主,标注非常细致,是像素级裂缝分割任务的常用benchmark之一。很多裂缝分割论文都拿它做评测,对比指标相对公平。
这个数据集对分割模型的空间细节捕捉能力要求比较高,因为很多裂缝只有几个像素宽,下采样一次就可能消失。我实测下来,使用U-Net这类编码器-解码器结构,配合空洞卷积或特征融合模块,才能在DeepCrack上拿到比较理想的结果。如果直接用普通分类网络改分割头,边缘精度通常不够。
DeepCrack还适合测试模型对“细裂缝”的敏感性。真实道路场景里,细小裂缝恰恰是早期病害预警的关键信号,所以在这个数据集上表现好,对实际项目有一定参考价值。
2.4 SDNET2018:混凝土桥面、墙面、路面裂缝分类大样本
SDNET2018是一个以混凝土表面裂缝分类为目标的数据集,包含56000多张裁剪好的小图像块(每张约230x230像素),覆盖桥面、墙面和路面三种场景。它的标注是图像级二分类(有裂缝/无裂缝),不包含像素级掩膜,也不含目标框。
这个数据集适合解决“有没有裂缝”这种筛查问题,不适合做裂缝定位和形状分析。它最大的优势是样本量大、场景多、正负样本相对均衡,拿来训练一个裂缝分类器非常稳定。很多工程类项目只需要快速判断某段路面是否出现裂缝,不需要精确分割,在这种情况下SDNET2018就是很好的数据基础。
不过要注意,它的小图是直接从大图上切下来的,有些图像块边缘可能存在截断的裂缝,人眼有时看都费劲,模型容易学到错误特征。我建议训练时对这种边缘裂缝样本适当做人工复核,或者通过数据增强把裁剪带来的边界效应缓和掉。
3. 坑洼与多类别道路损伤数据集实战对比
3.1 RDD2022:多国家、多类别的道路损伤检测“大杂烩”
RDD2022是目前道路损伤检测方向覆盖面非常广的开源数据集之一,由相关研究团队组织发布,数据来自多个国家,包含车载相机拍摄的道路图像,并标注了纵向裂缝、横向裂缝、网状裂缝、坑洼、修补等多种类别。图像总量在数万张级别,具体数量会随版本更新变化,但整体规模远超传统裂缝数据集。
这个数据集我强烈推荐给有多类别识别需求的人。首先它的类别覆盖了道路养护中最常见的病害类型,训练一个模型就能同时输出多种病害位置,实用性很强。其次,多国家数据让模型天然具备了一定的地域多样性,对于不同路面材质、不同交通标线风格有一定的适应能力。
使用时要注意两点。第一,类别分布很不均衡,坑洼和横向裂缝的数量可能与纵向裂缝差很多,训练时一定要做类别频率加权或者用focal loss处理。第二,原始标注格式是XML(VOC格式),如果你用YOLO或者COCO格式训练,需要先做转换,转换时注意坐标归一化别写错。
3.2 Pothole专项数据集:单一目标但场景覆盖广泛
如果你只关心坑洼检测,不关心裂缝,那专门针对坑洼的数据集用起来更聚焦。公开渠道能搜到多个“Pothole”命名的数据集,通常来自Kaggle竞赛或高校研究项目,图像主要用手机或行车记录仪拍摄,标注多为目标框,少数提供像素级掩膜。
这类数据集的特点是目标单一、数量适中,但背景差异很大,有的图像是晴天干燥路面,有的是雨天积水路面。坑洼一旦积水,视觉特征和干燥坑洼完全不同,模型训练时要提前考虑这一点。我遇到过在干净坑洼上训练得很好的模型,拿到雨后图像上检测率暴跌的情况,教训非常直接。
如果你准备把坑洼检测模型做到工程级别,我的建议是用一个专项坑洼数据集做初训练,再用RDD2022里的坑洼类别做混合训练,两类数据互补,前者提供更多场景变化,后者提供多国道路样式,综合性会好很多。
3.3 航拍与大场景道路病害数据集
除了车载和手持拍摄,还有一类数据集来自无人机航拍或高位相机,拍摄范围更广,单张图像里包含多条道路甚至整个街区的路面情况。这类数据集里的病害目标往往很小,属于典型的小目标检测问题,对模型和训练策略的要求更高。
这类数据的获取难度通常比车载图像大,公开的数量也少一些,而且标注成本更高,所以很多人选择用车载数据集训练后再用小部分航拍数据微调。我个人的经验是,航拍图像里的裂缝和坑洼分辨率太低,直接用小目标检测头会稍微好一些,但不要对mAP值抱太高预期。如果项目要求较高,及时补充现场数据仍然是必要的。
4. 如何选数据集:从任务倒推的选型思路
4.1 先想清楚你的下游任务
选数据集不是“哪个火用哪个”,而是先想清楚下游任务是什么。这里我给出一个简化的选型对照表,直接对号入座就行。
| 任务目标 | 推荐数据集 | 标注形式 | 说明 |
|---|---|---|---|
| 裂缝有无二分类 | SDNET2018 | 图像级标签 | 量大、正负样本均衡,训练简单 |
| 裂缝像素级分割 | CFD、DeepCrack、Crack500 | 像素掩膜 | 按数据量和复杂程度递增使用 |
| 坑洼检测(框) | Pothole系列、RDD2022坑洼类 | 目标框 | 单类别可先用专项数据集 |
| 多类别道路病害检测 | RDD2022 | 目标框 | 覆盖裂缝、坑洼、修补等 |
| 复杂场景鲁棒性验证 | Crack500、RDD2022 | 视具体任务 | 背景干扰多,指标更真实 |
| 小目标航拍检测 | 航拍类数据集或自采微调 | 目标框 | 难度高,需额外处理 |
表格里已经比较直观了。如果你是新手,我建议从SDNET2018做分类、从CFD做分割入手,这两个数据集上手难度低,各种教程和参考资料也丰富,遇到问题容易检索到解决方案。
4.2 标注格式转换的常见坑
开源数据集的标注格式五花八门,常见的有Pascal VOC的XML、MS COCO的JSON、YOLO的TXT、以及各类自定义的PNG掩膜。格式转换是每个做数据集的人绕不开的步骤。
我自己在转换时最常踩的坑是坐标系搞混。VOC格式存的是左上角和右下角的绝对坐标,YOLO格式存的是中心点坐标和宽高,而且都是归一化到0到1之间。转换时必须知道图像的原始宽高,否则会得到完全错误的目标框。另一个坑是像素级掩膜图保存格式,很多掩膜PNG是三通道彩色图,但实际上分割模型需要的是单通道索引图,每类病害用不同的整数值表示,转换时要注意做灰度映射。
建议转换完成后,一定要写个简单的可视化脚本,把检测框或分割掩膜叠加在原始图像上,肉眼检查确认标注没有错位。这一步看起来麻烦,却能避免训练时的很多诡异问题。
4.3 数据集划分与一致性检查
训练集、验证集、测试集的划分看起来简单,但在道路病害数据上有一个容易忽略的问题:同一个地点拍摄的多张连续图像高度相似,如果直接随机划分,验证集会“泄漏”到训练集中,导致指标虚高。更好的做法是按照拍摄场景或时间段分组,确保一个场景的图像只出现在一个集合里。
我一般在划分前先做一次图像去重和相似度检查,简单点可以直接计算感知哈希,把几乎一模一样的图像筛出来。然后按场景分组划分,比例习惯用7:1.5:1.5。划分完成后,记录每张图片的来源数据集,方便后续追踪指标变化,也能帮助定位某个类别表现差的原因。
4.4 数据增强与混合数据集训练的取舍
道路病害图像的数据增强,不能直接照搬通用目标检测的套路。水平翻转没问题,但随机旋转要控制角度,因为裂缝和道路方向有一定语义关系,转到离谱的角度会让模型学到错误先验。色彩抖动可以适当加一点,但不要调得太狠,否则模拟出来的颜色和真实路面差异太大,训练出来的模型反而更脆弱。
混合多个数据集训练时,不要平均采样。不同数据集的样本量差异很大,直接拼接会让大样本数据集主导训练。我习惯先按类别统计样本数,再按类别做重采样,确保每个类别在一个epoch里出现的次数相对均衡。实测下来,这种做法在多类别道路病害检测里比直接拼接稳定得多。
5. 实操实录:用开源数据集跑通一次裂缝检测
5.1 环境与工具选型
我建议你直接使用mmdetection或ultralytics的YOLOv8这类成熟框架,别自己从零搭建训练流程。裂缝检测本质上还是通用视觉任务,成熟框架在数据加载、增强、分布式训练这些环节已经做得很完善,你只需要专注在数据和调参上。
硬件方面,像素级分割任务对显存要求较高,一张12GB显存的显卡可以训练小尺寸输入的分割模型,但如果做多类别目标检测,输入分辨率又高,最好准备24GB以上显存,或者用梯度累积和混合精度训练来缓解。深度学习框架版本会影响结果,建议固定版本,因为不同版本间的数据增强实现细节有差异。
5.2 数据准备:下载、整理、检查标注
以RDD2022为例,下载完成后先检查目录结构,一般每种裂缝类型一个文件夹,里面是图片和同名XML标注文件。我习惯先写个小脚本看一眼标注分布,确认各类别样本数量,再开始转换。
用python统计一下你的数据集标注分布:
import os import xml.etree.ElementTree as ET def parse_voc_labels(xml_dir): from collections import Counter counter = Counter() for xml_file in os.listdir(xml_dir): if not xml_file.endswith('.xml'): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) for obj in tree.findall('object'): counter[obj.find('name').text] += 1 return counter label_counts = parse_voc_labels('path/to/annotations') print(label_counts)这一步很重要。我遇到过某个类别整个测试集里只出现几次的情况,那模型基本学不到这个类别的有效特征。看到这种不平衡,就要考虑类别加权或者先合并相似类别。
转换标注格式时建议分批进行,每转换一批就随机抽样可视化几个样本,确认目标框落在病害区域上,再进行下一批。一次性全量转换再检查,出错了很难定位问题。
5.3 训练与评估:看哪些指标
裂缝检测的评估指标不能只看mAP,mAP是一个综合排序指标,对类别不平衡不敏感,坑洼样本少但权重也小,mAP照样可能很高。一定要看每个类别的AP(average precision),尤其是坑洼这类小样本类别的AP。分割任务还要看IoU和F1-score,裂缝本身很细,IoU稍微下降一点,视觉上就会感觉差很多。
用目标检测框架训练时,把epoch数适当调大,因为路面病害数据集的样本多样性有限,收敛通常比较慢。我一般会配合早停策略,监控验证集loss,连续几个epoch不下降就停止,防止过拟合。
另外值得留心的是,很多开源裂缝数据集的负样本(无病害图像)非常少,模型容易产生“有路就有病害”的倾向。如果可能,从另一个数据源找一些干净路面图像作为负样本加入训练,对提升实际场景的可靠性帮助很明显。
5.4 我在实操中踩过的坑
第一个坑是掩膜标签和原图对不上。有的数据集里PNG掩膜的尺寸和原始图像不一致,或者有偏移,训练时模型在边界区域表现得特别差。排查方法也很简单,把原图和掩膜叠加保存下来,肉眼扫一遍。
第二个坑是图像文件名有重名。多个数据集合在一起时,不同来源的图片可能都叫“001.jpg”,直接合并会互相覆盖。我后来习惯了统一重命名,加数据集前缀,比如“rdd2022_0001.jpg”“crack500_0102.jpg”,再没出过这种问题。
第三个坑是直接吃原图训练导致显存爆炸。像Crack500原始图像分辨率较高,直接resize到小尺寸会丢失裂缝细节,直接大图训练显存不够。常见做法是随机裁剪成固定大小的图块输入模型。裁剪时要注意,裂缝是长条形结构,如果裁剪窗口太小可能截掉大部分裂缝,训练时最好把裁剪比例调大一点,或者使用重叠裁剪策略。
6. 常见问题与避坑清单
6.1 数据质量问题:标注噪声、错标、漏标
开源数据集也不是完美的,标注噪声非常普遍。裂缝的边缘标注经常不准确,坑洼的框经常框得过大或过小。这些噪声会影响模型的精确定位能力,但一般不会让训练彻底失败。如果发现模型预测结果“飘”,先检查一下训练样本的标注质量,不要急着改模型结构。
我在处理标注噪声时,最有效的方法是“清洗一轮”。把一个初步训练好的模型在训练集上跑一遍预测,把预测结果和真值差异最大的样本挑出来,人工看一遍,经常能发现真值本身标错了。把这些错标修正或删除,比增加任何数据增强都更管用。
6.2 场景泛化问题:光照、阴影、表面纹理干扰
路面病害模型的泛化问题主要集中在光照和纹理这两个因素上。树影、车道线、轮胎印、水渍,这些视觉元素和裂缝坑洼在局部特征上非常像,模型很容易误检。开源数据集本身已经包含一部分这类干扰,但不可能覆盖所有情况。
应对泛化问题的方法主要有三种。第一,训练时把颜色扰动和灰度转换增强加强,降低模型对颜色的依赖,让它更多关注纹理和形状。第二,在推理时做多尺度测试,模型在多个分辨率下预测再融合,通常能减少误检。第三,也是最关键的,部署前一定要在目标场景采集数据做微调,没有任何开源模型能直接覆盖所有现场条件。
6.3 数据版权与引用规范
开源数据集虽然可以免费下载和使用,但每个数据集都有自己的许可协议。有些数据集只允许用于学术研究,禁止商业使用;有些要求你在发表论文时引用指定文献。下载前务必看清楚license,别等产品上线了才发现数据授权有问题。
我一般会在项目文档里记录每个数据集的名称、来源、版本、许可类型,方便后续追溯。论文实验里使用数据集时,按官方要求引用对应的论文,这也是基本的学术规范。
6.4 要不要用自己的数据“二次清洗”
不少团队拿到开源数据集后直接训练,效果不好就不断调模型,实际上可能问题出在数据本身。我强烈建议在正式训练前,花两三天时间把计划使用的数据集完整查看一遍。这个过程很枯燥,但对后续每次实验的收益都很大。
具体做法是,用脚本把每个样本的图像和标注叠加保存成视频或一张大图网格,按1-2秒一张的速度快速浏览。不需要看得特别细致,主要留意三类问题:标注明显错位、图像模糊到无法辨认、存在大量重复或近重复图像。筛选完一轮之后,训练的有效性会显著提升。
7. 从道路病害数据集到更广的工业视觉
公路上的裂缝坑洼检测,其实和很多工业视觉缺陷检测问题是同构的。比如在机械设备的状态监测里,轴承和齿轮表面会出现裂纹、点蚀、磨损等缺陷,检测逻辑和路面病害非常相似:都是从图像中定位细小的异常区域,都要面对类别不平衡和样本不足,都需要在真实场景中验证泛化能力。
所以我建议做道路病害检测的朋友,不要只盯着自己的数据集看。工业缺陷检测领域的开源数据集,比如轴承表面缺陷、齿轮损伤相关的图像集,虽然采集对象不同,但标注格式、评测方法、训练策略都是通用的。你去了解这些数据集的组织方式,很多时候能反过来启发自己的数据处理流程。
道路病害检测未来肯定会往更自动化的方向发展,但无论算法怎么进步,数据集始终是地基。一个规范、可靠、适合业务场景的数据集,比再复杂的模型都有价值。我个人的经验是,做这个方向别急着堆模型,先把手头的数据梳理明白,跑通一个最简单的baseline,再逐步迭代,这才是最稳的路径。这些开源数据集背后凝结了大量标注人员的辛苦工作,用它们的同时,也记得按许可要求进行引用和致谢。