混凝土裂缝检测数据集与YOLO实战:从标注到训练全攻略

混凝土裂缝检测数据集与YOLO实战:从标注到训练全攻略 简介面向土木工程与计算机视觉交叉领域研究者的混凝土裂缝数据集合集覆盖分类与目标检测两类任务包含SDNET2018、ConcreteCrackImagesforClassification、crack-detection-master等公开数据集并附带作者自制的3100张VOC格式裂缝检测图片及可运行源码适合用于深度学习模型训练、算法验证和工程安全检测研究。资源包共3个文件以inscode工程入口、html说明页面和gitignore配置为主整体仅6KB轻量便于快速部署源码结构简洁可直接在云端或本地环境中运行。已有129人学习使用适合具备Python与深度学习基础、希望快速获取标准化裂缝数据的入门及进阶开发者。压缩包内索引清晰帮助读者在无需自行搜集数据的情况下直接进入模型搭建与实验阶段有效降低复现门槛。 混凝土裂缝检测这几年在工程圈和CV圈都挺火一方面是基建存量越来越大桥梁、隧道、路面、大坝的巡检需求摆在那里另一方面是目标检测和分割模型越来越成熟落地门槛比前几年低了不少。但真上手做这个方向的人八成时间都耗在找数据、洗数据、标数据上真正跑模型的时间其实没多少。这篇就把我整理过的混凝土裂缝数据集和配套可运行源码一次性汇总清楚帮你把前期准备的时间省下来。1. 裂缝检测任务的核心形态与数据集选型1.1 三类主流任务形态做混凝土裂缝检测首先得搞清楚你要解决的是哪一类问题。这个方向表面上看就是一个找裂缝的活但在技术实现上分成了三条完全不同的技术路线选错路线会浪费大量时间和算力。分类任务是最基础也最简单的形态。输入一张裂缝图像模型判断有没有裂缝。这种任务适合做简单的巡检预警或者作为更复杂系统的前置筛选模块。典型实现是ImageNet预训练的ResNet、EfficientNet做二分类或三分类无裂缝、横向裂缝、纵向裂缝。优点是不需要标注框或像素级标签只需要图像级别的类别标注数据准备成本最低。目标检测任务是目前工程落地最常见的形态。模型输出裂缝的位置边界框和类别比如YOLOv5、YOLOv8、Faster R-CNN这类模型。这类任务适合用在无人机巡检、车载道路检测等场景因为裂缝在整张图中往往只占一小块区域检测框能告诉巡检人员具体在哪个位置有裂缝。数据标注量适中用LabelImg或者Roboflow画框就行。语义分割任务是精度最高但也最重的一种形态。模型对每个像素做分类输出裂缝的精确轮廓。U-Net、DeepLabV2、SegNet是经典选择。这类任务适合需要精确测量裂缝宽度、长度、走向的场景比如桥梁结构安全评估、隧道衬砌检测。难点在于标注成本高需要逐像素标注裂缝区域而且裂缝这类细长目标在标注时很容易漏标或标粗非常考验耐心。抛开具体模型不谈数据集的选择才是决定上限的关键。不同任务形态需要不同粒度的标注而市面上公开的裂缝数据集质量参差不齐有些数据集的标注本身就存在明显错误直接用会导致模型学歪。1.2 我整理数据集时的选型标准先说结论一个好的裂缝数据集至少要满足以下四条标准缺一条都会在训练时出问题。第一是图像分辨率要足够高。裂缝是典型的细长目标宽度可能只有几个像素。如果图像本身只有300×300那裂缝在图中可能只有2-3个像素宽别说分割了检测都费劲。我一般优先选分辨率在512×512以上的数据集最好是原始图像能达到1000×1000以上训练时再降采样。第二是背景多样性要够。很多数据集是在实验室环境下拍的背景单一、光照均匀、纹理简单模型在这种数据上跑出98%的准确率根本不代表什么。真正有挑战的是现场真实场景——路面有阴影、有油渍、有修补痕迹桥墩表面有水渍、有苔藓、有模板缝这些干扰在公开数据集里不够丰富的话模型泛化性会很差。第三是标注方式要和任务匹配。同样是裂缝数据有的数据集给的是图像级别标签只能用来做分类有的给的是Pascal VOC格式的xml框适合做检测有的给的是像素级maskpng格式适合做分割。选数据集之前先想好自己的任务别拿mask数据硬跑检测也别拿检测框数据硬跑分割。第四是负样本要充足。裂缝数据集最容易踩的坑是负样本太少。很多公开数据集把裂缝图片和正常图片混在一起但实际场景中90%以上的巡检图像都是没有裂缝的。模型如果没见过足够多的负样本推理时会把所有纹理复杂的地方都当裂缝误检率会高到不可用。2. 主流的公开混凝土裂缝数据集盘点我按任务形态把适合做裂缝检测的数据集分成四类分别列出关键信息和适合的使用方式。下面这些数据集我都实际跑过不是凑数的。2.1 经典分类数据集CFD与CrackForestCFDCrack Forest Dataset是张量T. L. Zhang等人做的路面裂缝数据集收录了118张分辨率约480×320的彩色路面图像包含不同光照条件和路面纹理下的裂缝。这个数据集在论文里出现频率很高很多早期的CNN裂缝分类模型都用它做验证。它的问题是样本量小、分辨率低现在一般只用来做模型对比测试或预训练验证不适合做主力训练集。CrackForest是另一个经常被引用的路面裂缝数据集也是100多张图带像素级标注。它的标注相对粗糙边缘不够精细我做分割实验时发现用它训出来的模型边界会偏粗。这两个数据集现在的主要价值是行业基准你可以在上面跑通baseline但要训练生产级模型还得靠后面几个大规模数据集。2.2 大规模路面裂缝检测数据集Crack500是 Temple University 团队做的路面裂缝数据集一共500张原始图像每张尺寸约4032×3024覆盖了不同严重程度的裂缝。作者把每张大图切成若干个小块最终得到3500多张子图并提供像素级标注。我最常用的切块方式是512×512这样既保留了裂缝纹理细节又不会让模型在大图上丢失小目标信息。Crack500的子图里有大量不含裂缝的背景块做训练时要自己控制负样本比例我一般控制在正负样本3比1。**GAPsGerman Asphalt Pavement Distress**是一个德国团队发布的沥青路面病害数据集包含509张标注图像标注目标有裂缝、坑槽、修补等格式是Pascal VOC。这个数据集的特点是病害类型多样裂缝形态偏真实适合做多类别检测。它的问题在于图像数量少直接训练容易过拟合我一般用来做迁移学习的验证集。**RDD2020Road Damage Detection**是一个比较新的道路病害检测数据集来自IEEE的反向道路损坏检测挑战赛图像来自日本、印度、捷克等国家的真实道路巡检包含超过26000张图像标注了纵向裂缝、横向裂缝、鳄鱼裂纹、坑洼四种类型。格式是Pascal VOC和COCO双版本几千张带裂缝的图直接可以用来训练YOLOv8。这个数据集对多国路况都有覆盖负样本也比较充分是我目前做路面裂缝检测的首选预训练数据。2.3 混凝土结构物表面裂缝数据集SDNET2018是犹他州立大学发布的混凝土桥梁、路面、墙体裂缝数据集包含超过230个混凝土构件图像切片约56000张子图。它特别适合做桥梁和建筑结构表面的裂缝检测因为图中包含大量真实混凝土表面纹理如蜂窝麻面、模板缝、气孔等干扰对模型鲁棒性要求更高。需要说明的是它提供的标签是图像级别有裂缝/无裂缝要用来做检测或分割得自己标注但在分类任务里是很有价值的训练集。DeepCrack是早期专门做混凝土裂缝分割的数据集包含537张图像都带像素级标注。它的图像来自建筑物、路面、桥梁等多种混凝土结构分辨率不统一背景复杂度中等。分割效果上限不错但数量少训练时容易过拟合建议用U-Net配合强数据增强使用。SUIM自建补充如果你要检测水下结构物裂缝可以关注水下成像数据集SUIM等它们主要面向海洋结构物的语义分割包含部分裂缝、海洋生物附着等目标。这类数据做水下坝体、桥墩检测时很有参考价值但需自行筛选裂缝类标签。2.4 其他特种场景裂缝数据除了上面几个还有一些针对特定场景的裂缝数据。比如无人机桥梁巡检数据集公开的不多很多是论文附带的数据隧道衬砌裂缝数据集相关数据在Crack360等文献中有涉及但开放程度有限。如果你的应用场景是这些特殊方向我建议放弃找现成数据集的思路转而做自动标注人工修正的半自动方案用预训练模型生成候选区域然后人工审查修正标注效率比从头标注高很多。为了让你快速比较我把常用的裂缝数据集整理成了一张表数据集图像数量标注粒度适用任务特点与坑点CFD118像素级分类/分割验证分辨率低不适合生产训练CrackForest118像素级分割基准标注偏粗边界不精细Crack500500原始/3500子图像素级分割/检测子图负样本多需控制比例GAPs509检测框(Pascal VOC)检测病害类型多数量少RDD202026000检测框(VOC/COCO)检测国家路况多样首选大规模数据SDNET201856000切片图像级分类含大量混凝土纹理干扰训练鲁棒性好DeepCrack537像素级分割数据少需加强数据增强提示网络上热词里提到的水下管道裂缝数据集道路裂缝yolo数据集免费很多都来自上述数据集的不同裁剪版本或分块。下载时先看原始标注格式再看是否有版权限制别直接拿别人的再发布版本用于商业项目。3. 可运行源码项目与环境配置3.1 源码项目应该具备的完整链路现在GitHub和Gitee上打着混凝土裂缝检测标签的项目不少但很多只是把模型代码贴上数据下载链接还是失效的更别提开箱即用。真正可以复现的裂缝检测源码项目至少需要包含以下几条完整链路数据准备链路提供数据下载脚本或直接包含数据划分脚本train/val/test能一条命令把数据集处理成模型需要的目录格式。更规范的项目会附带数据增强代码比如随机旋转、亮度扰动、Mosaic增强等。模型训练链路包含完整的训练脚本支持修改模型结构、batch size、学习率等超参数并且在训练过程中会保存checkpoint、输出loss曲线。我用YOLOv5时一般在训练前额外用预训练模型跑一遍COCO上的表现确认权重文件没损坏。模型推理和评估链路能加载训练好的权重对单张图片或整个文件夹进行推理输出可视化标注结果并计算mAP、F1-score等指标。这个环节最容易出问题的是推理脚本和训练脚本间存在类名顺序不一致、图像预处理不一致等问题导致线下指标很好但线上效果崩。3.2 环境配置与依赖详解裂缝检测最常见的实现组合是PyTorch YOLOv5/YOLOv8 配套标注工具。以下是我的环境参考配置兼容性和稳定性实测都不错适合作为基线Python3.8-3.10不建议用3.11以上直接跑网上老项目很多依赖会编译失败PyTorch1.10-2.0如果显卡是RTX 30/40系注意选对应CUDA版本CUDA11.3或11.8cuDNN 8.2以上OpenCV4.5以上图像读入、预处理必须numpy1.21以上pandas、matplotlib、seaborn等辅助库标注工具LabelImg画检测框、Labelme画多边形做分割、Roboflow在线标注格式转换数据增强库albumentations对裂缝这种细长目标做增强时比torchvision.transform好用得多网上很多项目用的是老版本的ultralytics直接pip install ultralytics会装到新版本API变化很大跑通旧代码会出问题。我的习惯是把项目需要的依赖版本写进requirements.txt然后在虚拟环境里安装比如conda create -n crack_det python3.9 conda activate crack_det pip install torch1.13.0 torchvision0.14.0 --index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt千万别图省事在base环境里装裂缝检测项目经常需要尝试不同模型结构依赖冲突概率很高虚拟环境隔离能省很多不必要的麻烦。3.3 标注数据目录结构规范不管选哪个模型数据目录结构都强烈建议统一成下面的格式方便后面切换模型时不用重构代码datasets/ crack_data/ images/ train/ val/ labels/ train/ val/ data.yaml如果做分割任务则把labels换成masks目录存放png格式的mask图做分类任务则把images改成crack/normal两个子目录即可。这里有个容易踩的坑YOLO系列的标签文件是txt格式每行对应一个目标内容是class_id x_center y_center width height这些坐标都是相对于图像宽高的归一化值。用LabelImg标注时默认导出的是Pascal VOC的xml格式需要额外转换成YOLO的txt格式Roboflow可以自动完成这个转换。data.yaml是模型训练时的配置文件内容包括数据集根路径、train/val路径、类别数、类别名。我见过很多人卡在路径问题上YAML里写的路径不对或目录层级不对训练直接报错。推荐用相对路径放在datasets目录下方便项目迁移。4. 基于YOLOv5的裂缝检测训练实操4.1 数据准备与划分假设你选定RDD2020或Crack500作为训练数据第一步是把它整理成上面说的格式。我一般会用脚本做数据划分按8:1:1切分成训练集、验证集、测试集。划分时有一个细节同一个场景的图像不能既出现在训练集又出现在验证集中。很多无人机巡检数据集中同一裂缝的连续帧非常相似如果不做场景级划分验证集会泄漏训练信息导致指标虚高。我的做法是先从文件名中提取场景ID按场景划分而不是单纯随机抽样。import os import random from shutil import copy2 data_root datasets/raw img_files [f for f in os.listdir(os.path.join(data_root, images)) if f.endswith(.jpg)] # 按场景ID分组确保同场景数据不跨集 scenes {} for f in img_files: scene_id f.split(_)[0] scenes.setdefault(scene_id, []).append(f) scene_list list(scenes.keys()) random.seed(42) random.shuffle(scene_list) train_scenes scene_list[:int(len(scene_list)*0.8)] val_scenes scene_list[int(len(scene_list)*0.8):int(len(scene_list)*0.9)] test_scenes scene_list[int(len(scene_list)*0.9):] # 复制到目标目录 for split, scene_ids in [(train, train_scenes), (val, val_scenes), (test, test_scenes)]: for sid in scene_ids: for f in scenes[sid]: src_img os.path.join(data_root, images, f) src_lab os.path.join(data_root, labels, f.replace(.jpg, .txt)) dst_img os.path.join(fdatasets/crack_data/images/{split}, f) dst_lab os.path.join(fdatasets/crack_data/labels/{split}, f.replace(.jpg, .txt)) copy2(src_img, dst_img) copy2(src_lab, dst_lab)负样本比例的坑也在这里暴露了。如果原始数据里不含裂缝的图片太多直接训练会让模型倾向于全部预测为负类。我在准备数据时会把训练集正负样本比例控制在3:1到5:1之间负样本太多就下采样正样本太多就适当做增强。4.2 模型训练关键参数选用YOLOv5ssmall版本作为基线模型兼顾速度和精度。如果对精度有更高要求可以换YOLOv5m或YOLOv8m。以下是训练命令的参考参数python train.py --img 640 --batch 16 --epochs 100 \ --data datasets/crack_data/data.yaml \ --weights yolov5s.pt \ --hyp data/hyps/hyp.scratch-low.yaml \ --project runs/crack_train几个值得细说的参数--img 640输入图像分辨率。裂缝是细长目标分辨率太低会丢失细裂缝信息太高则显存占用大。640是平衡点。如果你的显存足够比如24G可以试896或1024部分场景能提升几个点的mAP。--batch 16batch size越小BN层统计越不稳定训练波动越大。如果显存不够宁可降低输入分辨率也不要强行把batch降到4以下。--hyp hyp.scratch-low.yaml这个文件控制数据增强的强度。裂缝检测场景建议把mosaic和mixup的开关打开但把hsv_h、hsv_s的参数调低一点因为颜色失真太严重会让模型学到错误的颜色特征。--weights yolov5s.pt直接从COCO预训练权重开始训练收敛速度快很多。不建议从随机初始化开始训练裂缝数据集相对较小从零训练容易过拟合。训练过程中我会特别关注两个指标train/box_loss的下降曲线是否平滑val/mAP_0.5是否持续上升。如果val loss在20个epoch后开始反弹而上不去就是过拟合的迹象这时要加大数据增强强度或引入早停机制。4.3 增强策略与样本均衡处理裂缝目标有很强的方向性和连续性通用目标检测的随机翻转增强其实有一定风险。比如路面纵向裂缝翻转后仍然是纵向裂缝但如果是桥梁上的横向裂缝垂直翻转后类别语义也会变化模型可能会混淆裂缝方向。我的做法是随机水平翻转开启路面和结构物裂缝不区分方向场景下安全随机垂直翻转关掉垂直翻转后龟裂和横向裂缝的纹理特征会产生歧义随机旋转设到5-10度的小角度旋转过大边缘裁切会丢失裂缝Mosaic增强保持开启能大幅增加每张图的上下文信息随机亮度、对比度调整开启真实场景光照变化很大如果你用的是albumentations做分割任务增强推荐这个组合import albumentations as A train_transform A.Compose([ A.RandomRotate90(p0.5), A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(p0.3, brightness_limit0.15, contrast_limit0.15), A.ShiftScaleRotate(shift_limit0.05, scale_limit0.1, rotate_limit10, p0.5), A.OneOf([ A.GaussNoise(p1), A.MotionBlur(p1, blur_limit5), ], p0.2), A.Resize(512, 512), ])4.4 评估指标解读与改善方向训练完成后不要只看mAP还要看PR曲线、混淆矩阵和检测结果可视化。裂缝检测里最容易出现的问题有两种一是裂缝细长IOU计算偶尔偏低但视觉上检测没问题二是阴影、油渍、水渍被误检为裂缝。针对误检我常用的改善方法有三种加入更丰富的负样本。把巡检视频中没有裂缝的帧抽出来加入训练集让模型学会这些不是裂缝。这往往比调模型结构有效得多。改进NMS策略。裂缝检测框通常长宽比极大如果默认的NMS参数抑制了相邻的多个小框会导致一条裂缝被检测成几段。可以适当调低NMS置信度阈值让模型输出更多的候选框后续用形态学算子做合并。改用分割模型。如果检测框始终无法精确贴合裂缝轮廓说明你的应用需要的是精确的位置信息而不是大概在这个区域。这种场景下直接用U-Net或DeepLabV2做分割效果提升是质的飞跃。5. 常见问题与排查技巧实录5.1 训练loss不下降的排查思路遇到训练loss不下降时90%的情况不是模型结构问题而是数据问题。我踩过好几次的坑包括标注框全为0。YOLO的标注txt文件里如果坐标数据为0或有负值训练会直接崩掉或loss震荡。我写过一个检查脚本遍历所有txt文件检查坐标是否在(0,1)区间内如果越界就直接报出文件名做数据清洗时非常有用。图像通道问题。有些数据集图像是4通道RGBA或灰度图模型读取时统一三通道后会出奇奇怪怪的bug。建议做一个遍历检查和预处理把图片统一转成RGB三通道并保存。这个步骤虽然基础但能避免很多后期排查时间。类别标号不对齐。转换数据格式时最容易出错就是类别编号从0开始还是从1开始。VOC数据集的类别名是从1开始的YOLO的txt是从0开始的两个差1会让所有标签错位。标签错位尤其隐蔽loss照常下降但模型预测结果完全不对。可以在训练完一个epoch后用模型预测一张训练图片如果预测类别和目标明显不匹配基本就是这个问题。5.2 推理速度慢与显存不足的优化模型训练好了部署到边缘设备或无人机上时推理效率就成了大问题。裂缝检测往往需要在移动端或嵌入式设备上实时运行我常用的优化手段包括轻量化模型替换用YOLOv5n或YOLOv8n替换s版本速度提升明显mAP可能下降2-3个点但工程上完全可接受。如果再进一步可以用NCNN或TensorRT进行推理加速实测能再快40%左右。输入尺寸控制在416或320裂缝在大多数场景并不是极小的目标降低输入分辨率不会让精度掉太多但推理速度能提升一倍。图像预处理优化用OpenCV做resize和归一化时用cv2.dnn.blobFromImage替代逐像素操作可以减少大量开销。5.3 相似背景误检的针对性处理路面上的阴影边缘、桥墩上的水痕、混凝土表面的模板缝这些背景特征在图像中都呈现暗色线条状很容易被裂缝模型误判。处理这个问题我有几条实战经验第一是多尺度训练和推理。模板缝和水痕往往具有明显的宽度一致性而真实裂缝在宽度上变化更连续。多尺度训练可以让模型学到更丰富的尺度特征一定程度上区分两者。第二是颜色空间增强。很多误检是因为灰度特征相似但颜色通道有差异。把训练数据转到HSV色彩空间对S和V通道做随机扰动可以逼迫模型学习更鲁棒的特征。第三是人工收集误检样本做负样本学习。把模型在真实巡检数据上的误检图像收集起来和正样本混合后重新训练一个版本。我做过一次误检率能从15%直接降到3%以下这是性价比最高的调优手段。5.4 标注不一致问题多人协作标注时经常出现同一个裂缝不同人标得粗细、长短不一致的情况这会严重影响分割质量。我的建议是标注规范里明确要求标注区域只覆盖裂缝的核心区域不包括周围模糊过渡带同时定期抽查标注质量发现问题尽早返工。标注一致性对最终模型的影响比很多人想象的大得多。6. 数据集的扩展与自建思路公开数据集能覆盖的只是通用场景如果你的裂缝检测对象比较特殊比如水坝泄洪道、核电站冷却塔、地铁盾构管片公开数据集基本都不够用必须自建数据集。以下是我常用的自建数据路径图像采集无人机按固定航线巡检或者手持工业相机按固定高度拍摄。关键要求是尽量覆盖不同光照条件、不同拍摄角度、不同表面处理工艺。采集时注意保存GPS坐标和拍摄时间方便后续做缺陷定位。半自动标注流水线用训练好的通用裂缝检测模型对采集图像进行预标注生成粗标签。然后导入LabelImg或Roboflow人工修正检测框和边缘。实测下来这种方式比纯人工标注快3-5倍。数据增强扩充对标注完成的数据做离线增强旋转、缩放、色彩扰动、噪声叠加可以将有效训练样本量扩大5-10倍。增强时注意保持裂缝形态的合理性过度扭曲的裂缝反而会误导模型。主动学习闭环模型训练好后用它对新增数据做预测把置信度低或预测结果分散的样本提取出来交给标注员优先处理。这个闭环跑起来之后数据集的迭代效率会非常高效。混凝土裂缝检测不是单一模型的问题而是一个数据-标注-训练-迭代的系统工程。我把整理过的数据集合源码项目分享出来是希望正在做这个方向的朋友少走弯路。至少在你规划训练集和选模型的时候这张表和这份实操路线能帮你省下一个礼拜的时间。本文还有配套的精品资源点击获取