尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于YOLOv5的路面桥梁裂缝检测实战指南

基于YOLOv5的路面桥梁裂缝检测实战指南 简介基于Python与YOLOv5实现的路面桥梁裂缝检测识别项目面向高校学生与开发者可直接用于毕业设计、期末大作业或课程设计。资源提供完整源码与预训练模型本地编译可运行评审得分98分难度适中适合作为目标检测与计算机视觉方向的学习范本。压缩包共85个文件约1.58MB以23个Python脚本、23个YAML配置为主辅以Shell脚本、Dockerfile、示例图片等其中YAML文件覆盖数据集配置与模型结构参数图片可用于快速验证检测效果。已有179人学习下载。通过该项目可掌握YOLOv5的模型搭建、训练与推理流程了解裂缝识别的数据组织方式和工程化部署思路对完成类似检测任务具有实用参考价值。1. 路面桥梁裂缝检测为什么要选 YOLOv5在路面桥梁巡检里裂缝是结构健康评估的首要视觉特征。早期做法用边缘检测加阈值分割遇到水渍、阴影、纹理噪声时误检很多现场几乎没法直接用。改用 YOLOv5 之后一次前向传播同时得到裂缝位置与置信度检测粗定位加后端统计工程上可行得多。这个项目把源码、模型权重和检测脚本打包在一起评审分为 98助教审定过能够直接用于课程设计、期末大作业或毕业设计演示。这套资源不只是“能跑”。它保留了完整的 YOLOv5 目录结构包括weights/download_weights.sh、detect_photo.py、detect_camera.py以及数据、模型、工具等配置文件。从零开始做适合三类人想把yolov5训练自己的数据集走一遍的学生需要快速验证裂缝检测效果的路桥检测从业者以及在yolov5网络结构上做二次开发的工程师。2. 环境准备与模型权重先让 YOLOv5 跑起来2.1 Python 环境与依赖安装YOLOv5 对 Python 版本并不挑3.8 到 3.10 都能稳定工作。资源里的代码基于 PyTorch 实现安装时建议先确认本机有没有可用 NVIDIA 显卡有就装 GPU 版没有 CPU 版本也能跑通流程只是训练会比较慢。常见做法是建一个虚拟环境避免和系统 Python 里的其它包冲突python -m venv yolov5_crack # Linux / macOS source yolov5_crack/bin/activate # Windows PowerShell yolov5_crack\Scripts\Activate.ps1 pip install torch torchvision pip install -r requirements.txt第一行创建独立环境第二行激活后终端提示符会变成(yolov5_crack)。安装 PyTorch 时不指定--index-url会让 pip 自动寻找当前平台匹配的版本适合多数场景如果本机有指定 CUDA 版本再按对应 wheel 地址安装效率更高。requirements.txt里包含 YOLOv5 运行需要的基础依赖例如 OpenCV、numpy、PyYAML、matplotlib、tqdm。报错时优先看ModuleNotFoundError是哪个包再单独补装比整体重装快得多。依赖库在项目里的用途安装不上的常见解法torch / torchvisionYOLOv5 的训练与推理后端先匹配 CUDA 版本再装其它依赖opencv-python图像读取、缩放、摄像头采集升级 pipLinux 缺 libGL 时安装系统依赖PyYAML读取 yaml 模型与超参数配置单独pip install pyyamlmatplotlib绘制训练结果图非必需建议安装results 图依赖它requests下载权重时的网络请求内网环境需要单独配置代理才能拉取2.2 download_weights.sh 与预训练权重资源里weights/download_weights.sh是专门用来拉取预训练权重的脚本。YOLOv5 常用预训练权重有yolov5s.pt、yolov5m.pt、yolov5l.pt、yolov5x.pt其中 s 文件最小推理和训练最快适合裂缝检测这种单类小目标场景。使用脚本cd weights bash download_weights.sh cd ..脚本执行后会把对应.pt文件放到weights/目录。如果网络下载很慢也可以手动获取yolov5s.pt放进同目录YOLOv5 加载时只认文件名不检查文件来源。预训练权重的作用是迁移学习模型在 COCO 上提前学到的是纹理、边缘和几何特征裂缝虽然不在 COCO 80 类里但这些底层特征能明显加速收敛效果远好于随机初始化。如果你的机器显存比较小优先下载yolov5n.pt或yolov5s.pt如果追求精度再考虑yolov5l.pt。裂缝是细长条目标模型容量不需要太大s 级通常已经够用。2.3 用 detect_photo.py 快速验证通路环境装完、权重就位先不急着训练用资源自带的detect_photo.py验证整条链路是否通python detect_photo.py \ --weights weights/yolov5s.pt \ --source data/images/val_001.jpg \ --conf-thres 0.25 \ --project runs/detect \ --name crack_first_run解释一下参数--weights指向刚下载的预训练权重--source可以是一张图片也可以是一个目录目录下所有图片都会批量推理--conf-thres是置信度阈值0.25 是 YOLOv5 默认值裂缝纹理不明显时漏检多可以降到 0.15但误检也会增加--project和--name决定结果输出目录。结果会生成在runs/detect/crack_first_run/每张图会画出检测框、类别和置信度。第一次跑如果输出为空优先按这张表排查现象原因处理方式图片无检测框阈值太高或预训练权重的类别里没有裂缝降低 conf或后续换成微调权重报错 CUDA out of memory显存不足加--device cpu或降低--imgsz报错 No module named ...依赖缺失按报错信息补装对应包图片全黑或花屏图片路径错误或格式不支持检查图片后缀换 jpg/png 再试3. 模型结构配置文件拆解yaml 决定网络骨架3.1 yolov5.yaml 网络结构models/yolov5s.yaml是整套代码里最容易被忽略但最内核的部分。YOLOv5 的网络不是直接写在 Python 类里而是用 YAML 描述组件顺序yolo.py再解析成模型。打开这个文件可以看到nc: 80 depth_multiple: 0.33 width_multiple: 0.50 anchors: - [10,13,16,30,33,23] # P3/8 - [30,61,62,45,59,119] # P4/16 - [116,90,156,198,373,326] # P5/32 backbone: - [-1, 1, Focus, [64, 3]] - [-1, 1, Conv, [128, 3, 2]] - [-1, 3, C3, [128]] head: - [-1, 1, Conv, [256, 3, 2]]nc是类别数COCO 是 80裂缝检测要改成 1。depth_multiple0.33和width_multiple0.50是缩放系数yolov5s的 s 就是这么来的m 对应 0.67/0.75l 对应 1.0/1.0。修改 backbone 很容易破坏预训练权重的结构匹配关系新手不建议动。anchors预设的是 COCO 常见物体尺寸训练时 YOLOv5 会根据数据集的真实框长宽比重新聚类所以并不需要手工逐个调。3.2 hyp.scratch.yaml 超参数data/hyp.scratch.yaml是训练超参数配置。很多人直接用默认值但裂缝数据通常只有几百张几个关键参数需要单独调参数默认参考裂缝检测建议作用lr00.010.005初始学习率数据量小时调低更稳lrf0.20.2最终学习率比例系数mosaic1.00.8拼接增强能提升小目标鲁棒性但裂缝可能被截断mixup0.00.0数据量小时不开避免语义混淆fliplr0.50.5水平翻转裂缝方向多样时可保留hsv_h / hsv_s0.015 / 0.7适当降低灰度裂缝对颜色扰动不敏感降值防止错误配色改配置时先把原文件复制一份cp data/hyp.scratch.yaml data/hyp.crack.yaml sed -i s/lr0: 0.01/lr0: 0.005/ data/hyp.crack.yamlcp保留原始备份sed替换lr0。实际开发里我一般直接用编辑器改data/hyp.crack.yaml避免 sed 正则误伤。mosaic太强会把一条长裂缝切成几段导致标注框变得很碎我的经验是调到 0.8 左右比较平衡。3.3 coco128.yaml 数据配置YOLOv5 训练时不是直接读取图片目录而是通过一个数据 yaml 找到训练集、验证集和类别名。资源自带的data/coco128.yaml是标准模板train: ../coco128/images/train2017/ val: ../coco128/images/val2017/ nc: 80 names: [person, bicycle, car, ...]要训练裂缝检测复制一份并改成train: ../datasets/crack/images/train/ val: ../datasets/crack/images/val/ nc: 1 names: [crack]train和val是图片目录路径相对路径的参照点是执行train.py时的工作目录不是 yaml 文件所在位置这是最常踩的坑。names顺序必须与标注 txt 里的 class id 对应裂缝只有一类[crack]里下标 0 就表示 id 0。4. 训练自己的裂缝数据集从标注到调参4.1 数据集目录布局与标注格式YOLOv5 训练需要图片和标注 txt 配对出现标准目录结构如下datasets/crack/ ├── images/ │ ├── train/ │ │ ├── crack_001.jpg │ │ └── crack_002.jpg │ └── val/ ├── labels/ │ ├── train/ │ │ ├── crack_001.txt │ │ └── crack_002.txt │ └── val/ └── crack.yamllabels 下每个 txt 文件名必须与图片同名。txt 每行格式是0 0.5234 0.6105 0.1212 0.0234这一行表示类别 id 为 0检测框中心点 x 在图片宽度的 0.5234 处y 在高度的 0.6105 处框宽占图片宽度的 0.1212框高占图片高度的 0.0234。坐标全部归一化到 0~1与标注软件里的像素坐标不同。标注时使用 labelImg 或 labelme输出格式选择 YOLO。裂缝经常横跨整张图片标注时直接画最小外接矩形不需要切除背景。矩形包含一些路面纹理是正常的YOLO 的框预测允许一定背景比例。如果一张图里有几条裂缝交织全部标出只标主要裂缝会导致训练阶段把其余裂缝当成负样本降低召回。4.2 训练命令与关键参数YOLOv5 训练自己的数据集入口是train.py。推荐用多行参数启动python train.py \ --data datasets/crack/crack.yaml \ --weights weights/yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyp.crack.yaml \ --cache \ --name crack_run参数用途参数裂缝场景建议说明--img640显存不够用 416输入尺寸裂缝细小建议不低于 416--batch16显存不足降到 8 或 4一次送入的图片数显存开销随尺寸二次方增长--epochs100 ~ 200数据少时根据曲线提前停--hypdata/hyp.crack.yaml使用刚才改好的超参数--cache加上把图片预加载进内存小数据集训练更快--patience默认 100验证指标不上升时提前停止训练过程会打印每个 epoch 的 box_loss、obj_loss、cls_loss、mAP0.5。类别只有一类时cls_loss变化不大重点看box_loss和mAP0.5。保存路径在runs/train/crack_run/其中weights/last.pt是最后一轮权重weights/best.pt是验证集 mAP 最高的权重后面推理要用best.pt。注意不要拿 COCO 预训练模型直接去检测裂缝而不微调COCO 里没有 crack 类模型会把细长裂缝误识别成电线、杆子之类结果基本不可用。4.3 读懂训练输出与断点续训训练结束后runs/train/crack_run/results.png里能看到 loss 曲线和验证指标。如果 loss 曲线尾部还在明显下降可以加长 epochs 继续训练如果验证集 loss 开始回升说明过拟合应回退到最低点对应的 epoch 权重。断点续训方式python train.py --resume runs/train/crack_run/weights/last.pt--resume会读取权重并继续训练前提是原训练命令里的--data、--hyp路径没有移动否则会报配置不匹配。为了出问题能回溯我习惯把训练日志同时落到文件python train.py ... 21 | tee runs/train/crack_run/train_log.txt这样既能看到实时输出也能在训练中断后查历史日志。5. 用训练好的模型做检测detect_photo 和 detect_camera 的调优技巧5.1 detect_camera.py 实时检测的参数取舍实时检测时使用资源里的detect_camera.pypython detect_camera.py \ --weights runs/train/crack_run/weights/best.pt \ --source 0 \ --conf-thres 0.3 \ --imgsz 640 \ --half--source 0表示默认摄像头。--half在 GPU 上开启半精度推理FPS 提升明显。裂缝目标小--imgsz不要低于 416否则细小裂缝会直接消失。如果画面抖动或模糊把--conf-thres提高到 0.3 到 0.4优先保证精度。5.2 用 --save-txt 做裂缝框筛除一个很实用的后处理技巧detect_photo.py加--save-txt --save-conf每张图的检测框会以 YOLO 格式输出到 labels 目录再按宽高比筛选细长目标import os label_path runs/detect/crack/labels/crack_001.txt filtered [] with open(label_path) as f: for line in f: parts line.strip().split() if len(parts) 5: continue _, x, y, w, h, conf parts w, h, conf float(w), float(h), float(conf) long_side max(w, h) short_side min(w, h) if short_side 0: continue ratio long_side / short_side if ratio 1.5 and conf 0.2: filtered.append((x, y, w, h, conf))这段代码遍历检测输出 txt提取置信度大于 0.2 的框同时只保留长宽比大于 1.5 的矩形。裂缝通常是长条形而路面污渍、水印误检更接近正方形这个规则能明显降低误检。ratio 阈值可以按相机距离做一次小批量校准拍几组已知裂缝和干扰物统计两者长宽比分布后设定分界值。本文还有配套的精品资源点击获取
返回列表