基于YOLOv5的桥梁裂缝检测识别工程实战与调参详解
简介基于Python与Yolov5的路面桥梁裂缝检测识别项目是一份面向毕业设计及深度学习目标检测学习的完整源码包适用于混凝土桥梁、路面裂缝的自动检测与定位场景。压缩包共85个文件核心包括23个Python源码和23个YAML模型配置另附模型下载脚本、Docker部署文件、结果截图与说明文档整体仅1.6MB目录结构清晰按功能模块划分便于按需阅读与调试。已有271人学习或浏览作者上传前已反复测试代码运行稳定答辩评审平均分达到98分适合计算机、人工智能、通信工程等专业学生作为毕设参考或目标检测入门实战。资源内提供完整源代码、文档说明、预训练模型及推理结果截图覆盖从数据配置、模型训练到检测推理的关键流程可帮助使用者快速理解Yolov5在裂缝识别任务中的搭建思路与调优方法也便于在此基础上进行二次开发与功能扩展。1. 裂缝巡检的现实问题与 YOLOv5 方案的定位桥梁定检照片经常一次拍上千张裂缝在画面上往往只有几个像素宽人工翻看不仅慢判读标准还因人而异。这个资源是一套基于 Python 与 YOLOv5 的完整裂缝检测识别工程包含源代码、训练好的权重、文档说明、结果截图和样例数据解压后按文档操作就能在路面或桥面图上输出带置信度的裂缝边界框。它不是论文里的演示代码而是把数据标注、模型训练、图片与摄像头推理串成一条能跑的链路对毕设、课设和路桥检测的快速验证都适用。screenshot 目录里能看到模型在实拍图上画出的检测框第一眼就能确认效果。后面内容围绕工程根目录的实际文件展开所有命令都在解压后的工程目录里执行。2. 裂缝识别的问题建模与数据组织2.1 裂缝为什么被建模成目标检测路面裂缝检测本质上是一个多目标定位问题。一张巡检照片里可能出现多条裂缝同一条裂缝还可能延伸到画面不同区域位置和尺寸都不可预知。分类网络只能回答“有没有裂缝”给不出坐标这对桥梁安全评估没有实际意义。YOLOv5 把输入图划分成若干个网格每个网格预测目标中心、宽高和类别再用 NMS 去掉重复框。裂缝是细长结构背景里又有伸缩缝、水渍、苔藓等干扰YOLOv5 里的 C3 模块和 PANet 特征融合能把浅层边缘纹理和深层语义信息同时保留下来这正好是裂缝检测需要的两类特征。在工程里这套代码把网络结构拆成了配置文件。models/yolov5s.yaml、yolov5m.yaml、yolov5l.yaml、yolov5x.yaml从轻到重分别定义了不同深度的网络后续训练时通过--weights或模型配置名选择。理解这一点后再看data目录就不会混淆了。2.2 数据目录与 YAML 配置工程根目录下有两类 YAML一类是数据配置例如coco.yaml、voc.yaml、coco128.yaml另一类是超参数配置例如hyp.scratch.yaml、hyp.finetune.yaml。数据配置声明图片路径和类别数超参数配置控制学习率、数据增强、损失权重等训练细节。第一次跑通流程用coco128.yaml最合适它数据量小几分钟就能验证整体链路是否正常。配置文件类型使用场景coco128.yaml数据配置COCO 128 张图像子集快速跑通训练流程coco.yaml数据配置完整 COCO 80 类适合在通用场景继续预训练voc.yaml数据配置PASCAL VOC 20 类适合已有 VOC 格式数据时使用hyp.scratch.yaml超参数配置从零初始化训练时使用hyp.finetune.yaml超参数配置加载预训练权重做迁移学习时使用换成自己的裂缝数据时我一般会新建一个数据配置内容如下# data/bridge_crack.yaml train: data/images/train # 训练图片目录 val: data/images/val # 验证图片目录 nc: 1 # 类别数这里只有裂缝一类 names: [crack] # 类别名必须和标注 txt 中的索引对应YOLOv5 的标签不使用 XML而是把每个目标写成一行。标签文件放在labels目录与图片同名后缀是.txt每行 5 列格式为class x_center y_center width height后面的四个值都做归一化范围在 0 到 1。# 与图片同名的标签文件例如 IMG_001.txt 0 0.5234 0.4823 0.0124 0.0851 0 0.1156 0.7532 0.0087 0.0432第一列是类别索引这里0对应names里的crack。后面四列依次是目标中心点横坐标、中心点纵坐标、归一化宽度、归一化高度。用 LabelImg 或 X-anylabeling 标注时导出格式要选 YOLO否则拿到的是 VOC 的 XML 文件。图片和标签的主文件名必须一致后缀不同没关系。如果训练时报no labels优先检查是不是文件放错目录或文件名不对应。3. 模型训练与验证命令、权重和结果3.1 预训练权重准备与训练启动工程里的weights目录放着download_weights.sh作用是把 YOLOv5 在 COCO 上训练好的预训练权重拉取到本地。执行完这个脚本后当前目录下会出现对应的.pt文件。如果下载中断也可以从已有环境拷贝一个权重文件放进weights目录再在命令里指定实际路径。裂缝数据集普遍不大加载 COCO 预训练权重能直接迁移底层的边缘纹理特征收敛速度明显快于随机初始化。训练命令我通常这样写bash weights/download_weights.sh python train.py \ --data data/coco128.yaml \ --weights yolov5s.pt \ --hyp hyp.scratch.yaml \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0--data指向数据配置先用资源自带的coco128.yaml跑通流程再换成本文的data/bridge_crack.yaml。--weights指定初始权重想要更轻量可以把yolov5s.pt换成yolov5m.pt等文件如果从零训练把这一项写成空字符串。--hyp指定超参数文件用预训练权重迁移学习时我用hyp.finetune.yaml而不是hyp.scratch.yaml原因是微调阶段学习率要更保守否则容易把预训练学到的基础特征冲坏。--img是输入分辨率裂缝目标细条件允许时可以直接提到1280。--batch-size根据显存调整16跑不动就降到8前几轮 loss 会有些波动属正常现象。模型配置文件在网络结构层面给了四档选择实际选型可以参考下表模型配置特点我的选型习惯yolov5s.yaml网络层数少、推理快快速验证流程CPU 也能跑yolov5m.yaml精度和速度均衡大多数裂缝场景用它yolov5l.yaml精度更高显存占用明显增加原图分辨率高且 GPU 充足时用yolov5x.yaml最大最重mAP 上限最高离线批量识别不要求实时3.2 训练日志指标与验证命令训练过程中终端会输出Box、P、R、mAP.5、mAP.5:.95等指标。Box是回归损失反映预测框和真实框的偏差。P是精确率R是召回率mAP.5表示 IoU 阈值取 0.5 时的平均精度这是裂缝检测最常用的指标。mAP.5:.95更加严格对细长裂缝来说通常偏低审查模型时重点看mAP.5是否有持续上升趋势。训练结束后runs/train/exp目录里会有best.pt和last.pt。best.pt是验证集上 mAP 最高的权重last.pt是最后一轮权重。如果两者不是同一个文件说明后期存在过拟合趋势可以提前停止。results.png展示了每个指标随 epoch 的变化曲线如果 loss 已经走平但 mAP 还在涨可以适当增加训练轮次。验证阶段单独执行python val.py \ --data data/coco128.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --task val这条命令只做前向推理不需要再指定--hyp。输出会打印每个类别的 P、R、mAP并在runs/val/exp下生成confusion_matrix.png、PR_curve.png等文件。看PR_curve.png时注意曲线和坐标轴围成的面积。裂缝目标小曲线通常比车辆检测任务更靠近左下角数值不高不代表训练失败要结合best.pt在真实巡检图上的效果来判断。4. 裂缝场景的调参与排错小目标、分辨率与显存4.1 大图上的小目标切片推理与输入分辨率实际桥梁照片经常是几千万像素相机拍的直接把整张图压缩到 640裂缝会变成一两个像素的细线网格特征图几乎无法定位。一个有效的做法是保持原图精度按固定尺寸裁剪成 patch分别推理后再把坐标映射回原图。这段代码是我在裂缝场景里常用的切片推理框架import cv2 def slide_infer(img_path, model, tile_size640, overlap32): img cv2.imread(img_path) h, w img.shape[:2] boxes [] y0 0 while y0 h: x0 0 while x0 w: x1 min(x0 tile_size, w) y1 min(y0 tile_size, h) tile img[y0:y1, x0:x1] result model(tile, size640, augmentFalse) # 把 patch 坐标加上偏移量映射回原图坐标系 for det in result.xyxy[0].cpu().numpy(): x1d, y1d, x2d, y2d, conf, cls det boxes.append((x1d x0, y1d y0, x2d x0, y2d y0, conf, cls)) x0 tile_size - overlap y0 tile_size - overlap return boxes关键点是overlap。裂缝可能正好被 tile 边界切断留出少量重叠区域再对高置信度结果做一次全局 NMS能明显减少漏检。重叠比例不是越大越好它会成倍增加推理时间我一般取 tile 大小的 5% 到 10%。传入模型的tile是 BGR 格式的 numpy 数组YOLOv5 会自动做归一化和通道转换不需要额外预处理。超参数方面小数据集迁移学习时我会把hyp.finetune.yaml中的学习率调得比hyp.scratch.yaml更保守并保留较短预热轮次。YOLOv5 默认开启的 mosaic 增强对裂缝这类小目标有效它把多张图拼在一起让模型看到更多样的背景组合但如果数据里本身有大量无裂缝负样本mosaic 过多会切碎正样本这时可以适当降低增强强度。改完超参后先跑 10 到 20 个 epoch观察训练集 loss 是否能稳定下降再决定是否继续。4.2 常见报错与检查顺序这套工程最容易在三个地方报错显存不足、标签格式错误、数据路径写错。我把常见情况整理成下表报错现象常见原因处理方式CUDA out of memorybatch-size 或 img 超过显存把 batch-size 降到 8 或 4再把 img 从 1280 降到 640Assertionon labels标签 txt 的列数不是 5检查是否存在逗号、制表符混用或导出了四点角点格式no labels in ...图片和标签文件名不匹配或数据路径错误确认 labels 和 images 主文件名一致检查 yaml 中的路径预训练权重下载失败网络限制或脚本目录不对手动放置.pt到预期目录训练时指定实际文件名检查顺序我习惯先从标签开始。随便读一个 label 文件确认类别索引落在 0 到nc-1之间宽高不为 0。出现零宽高通常是标注工具导出了非归一化的角点坐标YOLO 需要的是中心点加宽高。接着检查 yaml 里的路径相对路径是指相对工程根目录不要把train写成绝对路径后又移动了数据集。如果训练早期 loss 出现nan先看学习率是否过大再看数据里有没有损坏图片。空标签文件可以保留模型会把它当背景但如果nc写得比实际标注类别索引小训练时就会在损失计算处越界表现同样是nan。提示调参时一次只改一个变量。先固定--img和--batch-size只动超参数文件里的学习率或增强强度否则多个因素叠加后很难判断 mAP 变化来自哪一个改动。5. 把检测结果接进自己的推理脚本5.1 detect_photo.py 与 detect_camera.py 的参数化调用资源里的两个入口脚本值得复用detect_photo.py对单张图片或图片目录做离线检测detect_camera.py从摄像头读取视频流做实时检测。它们的参数风格和 YOLOv5 自带的detect.py基本一致常用命令如下# 对图片目录做批量检测 python detect_photo.py \ --weights runs/train/exp/weights/best.pt \ --source screenshot/ \ --conf-thres 0.30 \ --iou-thres 0.45 \ --save-txt # 打开默认摄像头实时检测 python detect_camera.py \ --weights runs/train/exp/weights/best.pt \ --source 0 \ --conf-thres 0.25第一段命令里--source指向需要检测的图片目录结果会输出到runs/detect/exp并自动画出检测框。--save-txt让脚本额外保存每个目标的类别、坐标和置信度便于后续统计裂缝坐标或密度。第二段命令把--source设为0代表系统默认摄像头。如果摄像头索引不是 0改成1、2逐个试。5.2 置信度阈值与裂缝误检抑制裂缝检测的置信度通常比车辆、行人目标低。通用模型的conf-thres默认是 0.25在裂缝场景里我一般取 0.30 到 0.35。调得过高会漏掉真实裂缝过低则会把伸缩缝、水渍阴影误识别成裂缝。拿一张包含多种背景干扰的验证图从 0.2 到 0.45 逐步测试找到误检和漏检的平衡点。还有一个针对裂缝形状的小技巧桥梁照片里排水管和灯杆阴影在灰度上接近裂缝但形状更粗。检测返回的xyxy坐标已经包含了每个框的宽高可以计算长宽比保留长边明显大于短边的候选框。对同一方向延伸的检测框再按两个框之间的 IoU 或中心点距离做二次合并能把一条裂缝被切碎成多个框的情况重新连成完整标注后续做裂缝长度统计也会更准确。本文还有配套的精品资源点击获取