简介基于Python与Yolov5的路面桥梁裂缝检测识别项目提供完整源代码与预训练模型面向毕业设计、课程设计及深度学习实践者解决道路桥梁裂缝自动检测与定位的难点适合有Python和深度学习基础的用户快速落地应用。压缩包共49个文件涵盖模型结构定义、训练参数配置、核心源码、编译缓存及辅助脚本并附测试图片整体仅1.98MB目录结构清晰。目前已有98人学习/下载代码经本地编译验证可直接运行评审得分98分。通过项目可掌握YOLOv5模型搭建、训练调优与部署全流程理解不同规模模型的特点。配套文档包含安装指南、使用手册与训练说明帮助快速复现路面桥梁裂缝识别过程也可替换数据集迁移至其他视觉检测任务既能满足学业项目需求也能为实际工程检测提供高性价比的参考方案。1. 路面桥梁裂缝检测为什么直接选 Yolov5收到一套可以直接本地运行的 Python Yolov5 路面桥梁裂缝检测源码与模型内部带 weights 预训练权重、data 数据配置和使用脚本。与常见的演示 demo 不同这套项目在本地编译过后可运行评审拿到 98 分说明它把训练、推理、部署的闭环都补齐了不是只有模型文件或只有检测效果图。对于三类人价值最大需要完成毕业设计或课程设计的学生想快速搭建裂缝检测原型的工程师以及想弄懂 Yolov5 如何训练自己数据集的人。下面直接按数据、选型、训练、推理、落地这条链路拆开讲。2. 裂缝数据与 Yolov5 模型选型从数据标注到网络结构2.1 裂缝数据集的组织与目录结构Yolov5 的训练数据不是随便扔进一个文件夹就能跑它依赖严格的目录约定。这套项目里 data 目录同时提供了 coco.yaml、voc.yaml 和 images 结构说明数据可以兼容 COCO 与 VOC 两种组织方式。最常见的组织方式如下dataset/ ├── images/ │ ├── train/ │ │ └── 道路裂缝_001.jpg │ └── val/ │ └── 道路裂缝_002.jpg ├── labels/ │ ├── train/ │ │ └── 道路裂缝_001.txt │ └── val/ │ └── 道路裂缝_002.txt └── data.yaml每张图片对应的 txt 文件里一行代表一个目标框格式为class_id x_center y_center width height例如0 0.5132 0.4217 0.0834 0.0271表示一个裂缝目标框前四个值是归一化到 0~1 的坐标因此与图片分辨率无关。需要注意的是坐标必须除以图片宽高否则训练时会直接报错或产生错位框。项目里 images 与 labels 分开放就是为了让 Yolov5 的 dataloader 能按文件名自动配对。2.2 yolov5s 与 yolov5m参数量和裂缝尺度的匹配项目里 models 目录同时给了 yolov5s.yaml、yolov5m.yaml、yolov5l.yaml、yolov5x.yaml 四套结构默认推荐用 yolov5s 或 yolov5m。裂缝与行人、车辆这类目标不同它在图像里往往呈现为细长、低对比度、长宽比极端比如横向贯穿的裂纹。Yolov5s 的检测头在三个尺度上做输出分别对应大、中、小目标但裂缝在整幅巡检图像里往往宽度只有几个像素从严格意义上属于中低尺度目标。实际跑下来yolov5s 在精度上比 yolo v3 好用很多且参数量只有约 7.2M适合普通显卡和 CPU 兜底如果训练数据足够多换 yolov5m 可以把裂缝边缘的召回率再提一截代价是推理时间增加约 40%。选型时不要盲目上 yolov5x。路面桥梁裂缝检测的数据集通常只有几千张x 模型参数约 86.7M极易在中小数据集上过拟合训练一次的时间也长最后的 mAP 未必比 s 高多少。我一般会先跑一个 yolov5s 得到基线再根据漏检情况决定是否升级模型体量。2.3 预训练权重与迁移学习的收益项目 weights 目录里已经包含预训练权重并且有 download_weights.sh 脚本。这个脚本本质上是下载 COCO 预训练的 yolov5s/m/l/x 权重。为什么要这么做因为裂缝数据量通常不足以支撑从头训练使用 COCO 预训练权重相当于让模型提早学会了边缘、纹理、形状这些基础特征之后在裂缝数据上微调收敛更快。迁移学习在目标检测里的收益是明确的比随机初始化权重能快 3~5 倍收敛最终 mAP 通常高 5~8 个点。我用脚本来做权重的准备# 项目根目录下执行目录会生成 weights/yolov5s.pt bash weights/download_weights.sh执行后会看到下载列表里面包含 yolov5s.pt、yolov5m.pt 等。注意下载需要外网如果本地访问不了可以手动把权重丢进 weights 目录文件名和训练命令里的参数严格对应即可。随后训练时通过--weights weights/yolov5s.pt指定而不是从零开始。提示预训练权重文件较大约 14MB~170MB下载完毕后先检查文件完整性避免出现 EOFError 或权重加载失败。3. Yolov5 裂缝检测训练全流程环境、超参与命令3.1 环境准备与依赖清单本项目基于 Python 与 Yolov5版本对应 torch 1.8 以上即可。先确认 Python 版本在 3.8~3.10 之间然后用 requirements.txt 安装依赖。常见依赖包括torch、torchvision、opencv-python、numpy、matplotlib、seaborn、pandas。建议用独立虚拟环境避免污染系统 Python。python -m venv yolov5-env source yolov5-env/bin/activate # Windows 执行 yolov5-env\Scripts\activate pip install -r requirements.txt安装完成后运行一段验证代码确认 GPU 是否被识别import torch print(torch.cuda.is_available())如果输出 False说明使用的是 CPU 版 torch。训练几百张裂缝图用 CPU 也能跑但会慢 10 倍以上。想用 GPU需要根据本地 CUDA 版本安装对应的 torch 版本比如pip install torch1.13.0cu117这样的指令。环境这块最常见的问题不是缺库而是 torch 的 CUDA 版本和显卡驱动不匹配导致_C扩展加载失败。3.2 数据配置与超参数文件调整Yolov5 训练前要准备两个 YAML数据文件和超参数文件。数据文件 data/coco.yaml 在项目里已经被修改成裂缝检测的格式核心内容如下train: data/images/train # 训练图片路径 val: data/images/val # 验证图片路径 nc: 1 # 类别数这里只有裂缝一类 names: [crack] # 类别名称注意这里的路径可以是相对路径也可以是绝对路径。如果你把项目整个目录移动了要先改这里的路径否则报错 train dataset not found。超参数文件用的是 hyp.finetune.yaml 或 hyp.scratch.yaml两个文件的核心差异在于数据增强力度。hyp.scratch.yaml 是默认参数适合从头训练hyp.finetune.yaml 经过调整适合微调它会更大程度地使用随机旋转、HSV 增强、Mosaic。裂缝检测场景建议用 hyp.finetune.yaml因为裂缝样本间差异小需要更强的增强来防止过拟合。关键超参数实时调整参考参数名建议值说明lr00.01微调用 0.005初始学习率过大容易发散lrf0.2最终学习率缩放系数mosaic1.0马赛克增强裂缝建议保持 1.0fliplr0.5水平翻转桥梁裂缝左右对称可用scale0.5随机缩放范围裂缝目标小别设太大warmup_epochs3.0预热轮数防止早期震荡改超参数直接编辑 hyp.finetune.yaml 文件改的时候只动数值不要改键名。3.3 训练命令与关键参数解析进入项目根目录执行训练命令。先用最小配置验证流程能跑通python train.py --data data/coco.yaml \ --cfg models/yolov5s.yaml \ --weights weights/yolov5s.pt \ --epochs 50 \ --batch-size 16 \ --img-size 640 \ --hyp data/hyp.finetune.yaml \ --name crack_run下面拆开每个参数的意义。--data指定数据 yaml--cfg指定网络结构决定模型是 s/m/l/x--weights指定初始权重选择预训练权重就是迁移学习--epochs是迭代轮数裂缝小数据集一般 50~100 轮即可--batch-size受显存限制16G 显存跑 s 可以到 32若爆显存则降到 8--img-size输入分辨率默认 640桥梁整体图像如果裂缝很细可以改成 1280 提升小目标召回但训练时间翻倍--hyp是超参数文件--name是当前实验名称输出保存在 runs/train/crack_run 下。训练过程中终端会输出每个 epoch 的 box_loss、obj_loss、cls_loss、mAP0.5 等数值。如果 mAP0.5 从第 30 个 epoch 开始不再上升可以提前停止不必等满 50。3.4 训练产物与指标评估训练结束后runs/train/crack_run 里会生成 weights/best.pt 和 last.pt。best.pt 是验证集上 mAP 最高的权重last.pt 是最后一轮权重实际使用时优先选 best.pt。同时还有 results.png能直观看到 loss 下降曲线和 mAP 上升曲线。判断模型好坏不能只看 mAP裂缝检测更重要的是查全率。一个漏检率高的模型在桥梁巡检中意味着裂缝被漏掉后果比误检严重。所以除了看 mAP0.5还要看混淆矩阵里的召回率Yolov5 训练完成后会用confusion_matrix.png输出这一点。验证集指标可以用以下命令复现python val.py --weights runs/train/crack_run/weights/best.pt \ --data data/coco.yaml \ --img-size 640 \ --conf-thres 0.05 \ --iou-thres 0.5--conf-thres 0.05把置信度阈值调低能够看到模型能力上限实际上线时再调高阈值这是评估和部署常用的分离策略。如果这里显示 mAP0.5 在 0.8 以上说明模型已经可用。注意训练时如果提示CUDA out of memory优先降低 batch-size其次降低 img-size。不要一上来就调大 batch-size很多“跑不起来”都是显存问题。4. 裂缝检测推理与常见排错4.1 图片与摄像头推理入口项目提供了两个推理脚本detect_photo.py 和 detect_camera.py。前者对单张图片或目录下所有图片做检测后者读取摄像头视频流。用最佳权重跑单张图片python detect_photo.py --weights runs/train/crack_run/weights/best.pt \ --source data/images/val/某个裂缝图片.jpg \ --conf-thres 0.5 \ --iou-thres 0.45 \ --project runs/detect \ --name photo_resultdetect_photo.py 内部会加载模型、读取图片、做 640x640 的 letterbox 缩放、推理、NMS、画框最终把结果图保存到runs/detect/photo_result。这里--iou-thres 0.45是 NMS 的交并比阈值值越低重叠框被抑制得越狠。检测同一张图像里的密集细小裂缝时如果粘连框太多可以适当降到 0.4如果想保留更多候选框则调到 0.5。摄像头推理则是实时视频流检测python detect_camera.py --weights runs/train/crack_run/weights/best.pt \ --source 0 \ --conf-thres 0.5--source 0表示默认摄像头。如果接入无人机图传或巡检机器人视频流把 source 改成 RTSP 地址即可Yolov5 的 dataloader 直接支持rtsp://ip:port/stream这样的输入。对于桥梁裂缝巡检摄像头视频流往往会有抖动导致单帧漏检。常见做法是连续抽帧一个位置采集 3~5 帧如果超过一半帧检测出裂缝就判定为真实裂缝。4.2 权重导出与 ONNX 部署训练得到的 .pt 文件只能在 Yolov5 的 PyTorch 环境里跑。如果想用 OpenCV、ONNX Runtime 或 TensorRT 部署需要先导出成 ONNXpython export.py --weights runs/train/crack_run/weights/best.pt \ --include onnx \ --img-size 640 \ --simplify导出后得到 best.onnx可用以下 Python 代码验证import onnxruntime as ort import cv2 import numpy as np sess ort.InferenceSession(best.onnx) input_name sess.get_inputs()[0].name img cv2.imread(test.jpg) img cv2.resize(img, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1) # BGR-RGB, HWC-CHW img np.ascontiguousarray(img, dtypenp.float32) img / 255.0 img np.expand_dims(img, axis0) outputs sess.run(None, {input_name: img}) print(outputs[0].shape) # (1, 25200, 6)输出 shape 是(1, 25200, 6)其中 25200 是三个尺度输出的 anchor 总数6 代表 (x1, y1, x2, y2, conf, class_prob)。拿到这个输出后再自己实现一次 NMS 就可以画框。ONNX 导出的好处是部署环境不需要安装 PyTorch且推理速度更快。注意导出前必须用训练时的--img-size否则输入尺寸不匹配。4.3 检测结果异常的定位方法裂缝检测经常出现三种异常什么都检测不到、框的位置偏、重复框特别多。什么都检测不到先看权重路径是否写对再降--conf-thres到 0.1 试试如果 0.1 下仍然空白说明权重和数据类别不匹配。比如用 COCO 80 类权重直接推理没有裂缝类肯定输出为空。框位置偏或尺寸严重不对通常是输入尺寸和训练尺寸不一致detect_photo.py 里要确保 letterbox 的方式一致不要直接cv2.resize拉伸。重复框多则是 NMS 阈值设置太高把--iou-thres调到 0.3 试试。还有一个隐藏问题中文路径。如果数据集路径或图片名包含中文OpenCV 读取时会失败模型能加载但结果图全黑。解决办法是项目路径和图片路径全改成英文这是 Windows 环境下最常见的坑。5. 桥梁裂缝检测落地的三个实际调优技巧5.1 用置信度阈值控制误检与漏检裂缝检测在真实巡检中的误检来源多是积水痕迹、伸缩缝、阴影和路面纹理。训练时追求高召回部署时则需要用阈值权衡。我一般会在验证集上输出所有预测框的置信度分布然后选择一个能让误检率低于 5% 的阈值。例如python detect_photo.py --source data/images/val --conf-thres 0.6如果 0.6 导致裂缝多段断裂就降到 0.4。实际上没有绝对最优阈值要根据你要查的是结构性大裂缝还是表面细微裂纹。大裂缝置信度通常很高0.7~0.9细裂纹则普遍偏低0.3~0.5。巡检场景建议保存两个阈值下的结果大裂缝用高阈值微裂纹用低阈值做人工复核。5.2 批处理巡检图片并输出结构化结果桥梁检测往往是一次拍几千张照片不能一张张看输出图。可以写一个批处理脚本提取检测框的坐标、置信度、数量并汇总成 CSV 或 JSON 供后续统计。import torch import cv2 import json import glob model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) results [] for img_path in glob.glob(bridge_photos/*.jpg): img cv2.imread(img_path) det model(img) boxes det.xyxy[0].cpu().numpy() # x1, y1, x2, y2, conf, cls results.append({ image: img_path, crack_count: len(boxes), boxes: boxes[:, :4].tolist(), confidences: boxes[:, 4].tolist() }) with open(result.json, w) as f: json.dump(results, f, indent2)这段代码对目录下所有照片推理并把每个裂缝框的像素坐标和置信度落盘。后续可以通过统计crack_count判断该路段是否存在明显裂缝再根据boxes里框的横向长度和角度进一步区分横向裂缝、纵向裂缝和网状裂缝。5.3 为无人机巡检预留的数据接口无人机或爬壁机器人拍摄的桥梁裂缝图像画面中裂缝所占像素比例更小且拍摄角度不固定。在对接这类设备时建议在模型前加一个图像分块步骤把 4000x3000 的原始图切成 640x640 的瓦片送模型检测再把检测框坐标映射回原图。切分时留 20 像素重叠避免裂缝正好落在切分线上导致漏检。映射时只需加上每块起始坐标的偏移量。这个方案不需要重新训练模型就能把检测能力扩展到高分辨率巡检图像上。结合 5.2 节的结构化输出直接生成带定位信息的裂缝清单桥梁养护人员可以按清单到现场复核。本文还有配套的精品资源点击获取