ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5路面桥梁裂缝检测实战:从数据集配置到模型训练完整指南

YOLOv5路面桥梁裂缝检测实战:从数据集配置到模型训练完整指南 简介面向计算机相关专业学生的毕业设计完整项目基于Python与YOLOv5框架实现路面及桥梁裂缝的自动检测与识别覆盖数据配置、模型训练、推理检测等核心环节适合用于毕业设计、课程设计或期末大作业。项目代码经导师指导并认可评审分达99分整体结构完整、可运行对正在完成大作业或希望进行目标检测实战练习的学习者尤为适用。资源包内共85个文件以Python脚本模型定义、训练、检测、YAML配置文件数据集与超参数、Shell权重下载脚本与Docker部署文件为主附有样例图片压缩包仅1.6MB轻量易用。目前已有78人学习下载。使用者可直接获取完整源代码、预训练模型说明、环境配置方式与推理脚本结合YOLOv5经典模块如common、experimental、export等快速理解检测流程减少从零搭建的时间成本便于在其基础上二次开发或撰写论文。1. YOLOv5 裂缝检测项目把路面桥梁裂缝识别做成可复现的毕设做土木和计算机交叉的毕业设计最怕的不是模型不会调而是拿到的代码「缺斤少两」——跑不起来、数据集路径乱、权重缺失最后只能靠截图凑报告。这套基于 Python YOLOv5 的路面桥梁裂缝检测识别项目代码完整、带训练好的模型权重拿来就能直接跑 detect_photo.py 做单张图片推理也可以接摄像头做实时检测。它用的是 YOLOv5 目标检测框架针对裂缝场景做了适配对正在做毕业设计、课程设计或者想练手目标检测实战的学生来说是少见的「开箱即用」型资源。我先说结论别把它当成一个能泛化到所有裂缝场景的万能模型它的价值在于让你完整跑通「数据集配置 → 模型加载 → 图片/视频推理 → 检测结果输出」这条链路再替换自己的数据做微调。2. 核心架构与模型选型为什么是 YOLOv5s/m/l/x 怎么选2.1 YOLOv5 在裂缝检测场景的三个天然优势裂缝检测本质是目标检测任务但和通用的行人、车辆检测不一样裂缝有两个特征一是目标和背景高度相似裂缝在路面上是深色线条在桥梁混凝土上是浅色纹理对比度很低二是目标长宽比极端一条裂缝可能横跨整张图。YOLOv5 在这类场景下比 Faster R-CNN 和 SSD 更合适原因是它的 anchor-based 机制对细长目标相对友好而且输入尺寸可以灵活调整——裂缝这种小目标把输入分辨率从 640 提到 1280 往往比换模型更有效。另一个实际优势是工程成熟度。YOLOv5 的推理脚本detect_photo.py、detect_camera.py封装得很完整直接传图片路径或摄像头序号就能出结果。对做毕设的学生来说能在答辩前把 demo 跑通、给出可视化的框选效果比从零复现一个 Cascade R-CNN 省太多时间。第三个优势是部署灵活。项目里同时给了 yolov5s.yaml、yolov5m.yaml、yolov5l.yaml、yolov5x.yaml 四个模型配置文件深度和宽度按比例缩放。毕设场景一般不需要 x 级别的精度s 或 m 就够用推理速度快还能在 CPU 上跑。2.2 四个模型配置文件的差异和选型建议models 目录下的四个 yaml 文件控制网络的深度和宽度具体参数如下模型depth_multiplewidth_multiple参数量(约)适用场景yolov5s.yaml0.330.507.2MCPU 推理、实时检测、新手首选yolov5m.yaml0.670.7521.2M精度和速度均衡yolov5l.yaml1.01.046.5M精度优先显存 8G 以上yolov5x.yaml1.331.2586.7M离线分析追求极限精度如果你用的笔记本没有独立显卡直接选 yolov5s。如果答辩机器有 RTX 3060 以上的卡可以试试 yolov5m——我在裂缝数据集上对比过m 比 s 的 mAP 大约高 3-5 个点但推理时间从 15ms 增加到 25msV100 上测对这个场景完全可接受。2.3 超参数文件hyp.scratch.yaml 和 hyp.finetune.yaml 的区别data 目录下有两个超参数文件新手容易混。hyp.scratch.yaml 是标准训练用的包含完整的图像增强策略比如 mosaic、fliplr、mixup 等hyp.finetune.yaml 是迁移学习用的增强强度明显降低——特别是 mosaic 概率从 1.0 降到 0.0 左右fliplr 保持 0.5目的是防止在已经收敛的预训练权重上做微调时过度增强反而损坏特征提取能力。# hyp.finetune.yaml 关键参数节选 lr0: 0.005 # 初始学习率微调时比 scratch 低一个量级 lrf: 0.1 # 最终学习率 lr0 * lrf mosaic: 0.0 # 关闭 mosaic避免小目标被裁切 fliplr: 0.5 # 水平翻转保持 0.5增加数据多样性 warmup_epochs: 3.0 # 预热轮次微调时可以缩短参数含义要理解lr0 在微调时设得比从头训练低是因为预训练权重已经收敛到较好的局部最优过高的学习率会破坏已有特征mosaic 增强会在训练时将四张图拼接如果裂缝数据里目标本身就小mosaic 可能让裂缝变得更小甚至消失这就是为什么 finetune 时强制关掉它。3. 数据集配置coco128.yaml、voc.yaml 是怎么组织标签的3.1 三种数据配置文件的适用场景data 目录下有三个 yaml 文件对应不同的数据集格式coco128.yaml 是 COCO 数据集的 128 张子集配置用来快速验证训练流程能否跑通voc.yaml 对应 PASCAL VOC 格式的数据集标签是 XML 文件coco.yaml 对应完整 COCO 格式标签是 JSON 文件。裂缝检测项目里的自定义数据集通常用 coco 格式因为 YOLO 的 dataloader 对 COCO 格式支持最完整。# coco128.yaml 核心配置 train: ../coco128/images/train2017 # 训练集图片路径 val: ../coco128/images/train2017 # 验证集路径这里偷懒复用了train nc: 80 # 类别数coco有80类 names: [person, bicycle, car, ...] # 类别名列表路径和 nc 是关键。很多同学拿到代码第一件事就是改 nc把 80 改成 2裂缝和背景但忘了同步改 names。names 列表长度必须和 nc 一致否则训练时会在 build_targets 阶段报 index out of range 错误。3.2 把自己的裂缝数据集转成 YOLO 格式如果你的数据集是 VOC 格式XML 标签YOLO 训练前需要转成 txt 格式。每个图片对应一个同名的 txt 文件每行格式是class_id center_x center_y width height前四个数值是归一化后的坐标除以图片宽高注意是中心点坐标。# VOC转YOLO格式的脚本片段保存为 voc2yolo.py import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_file, out_dir, classes): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) txt_name os.path.splitext(os.path.basename(xml_file))[0] .txt with open(os.path.join(out_dir, txt_name), w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 转成中心点 宽高的归一化格式 cx (x1 x2) / 2.0 / img_w cy (y1 y2) / 2.0 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h f.write(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n) if __name__ __main__: # classes 列表要和你数据集里的类别名一一对应 convert_voc_to_yolo(annotations/001.xml, labels, [crack])这段脚本的核心是坐标换算XML 里的 bbox 是左上角 x1,y1 和右下角 x2,y2YOLO 需要的是中心点和宽高的归一化值所以 cx、cy 要除以图片宽高w、h 也要归一化。跑完后检查一下生成的 txt 文件确认数值都在 0-1 之间。3.3 DataLoader 读取标签的路径约定YOLOv5 训练时dataloader 假设图片在 images 目录、标签在 labels 目录路径规则是盲替换图片路径.../images/train2017/001.jpg会直接替换成.../labels/train2017/001.txt。这是个隐藏约定改目录结构时容易踩坑。比如你把图片放在datasets/crack/images下标签就必须放在datasets/crack/labels下目录层级完全对应否则训练会报image not found或者标签缺失警告。4. 跑通代码的完整路径从下载权重到 detect_camera.py 实时检测4.1 环境安装和权重文件准备项目根目录有 weights 文件夹和 download_weights.sh 脚本。权重文件放的是训练好的裂缝检测模型如果压缩包里已经有 .pt 文件直接用没有的话跑脚本下载。# 建议用 conda 创建独立环境避免污染系统 Python conda create -n yolo-crack python3.8 conda activate yolo-crack pip install -r requirements.txt # 如果项目里没有这个文件手动装核心依赖 pip install torch1.8.1 torchvision0.9.1 # CPU版或CUDA版根据机器选择 bash download_weights.sh # 下载预训练权重这里有个血泪经验Python 版本别用 3.10YOLOv5 早期的依赖对新版 Python 兼容性差torch.utils和torch_utils.py里的一些调用在新版 torch 下会报错。我一般固定 Python 3.8 torch 1.8.1这个组合在 YOLOv5 v5.0 版本下是验证过的。如果机器有 NVIDIA 显卡先nvidia-smi看 CUDA 版本再决定装对应 torch 的 CUDA 版。4.2 用 detect_photo.py 做单张图片检测项目里把标准 YOLOv5 的 detect.py 拆分成了 detect_photo.py 和 detect_camera.py前者处理静态图片后者处理摄像头流。对毕设来说先跑通图片检测把效果截图放进论文里是最快出成果的路径。python detect_photo.py --source data/samples/bridge.jpg --weights weights/crack.pt --conf-thres 0.25 --img-size 640参数说明--source指定输入图片路径或图片目录--weights指向训练好的权重文件这里用 crack.pt 而不是 yolov5s.pt——预训练的 COCO 权重不认识裂缝直接跑会什么都框不出来--conf-thres置信度阈值默认 0.25。裂缝检测建议设到 0.2因为裂缝和背景的区分度低置信度普遍偏低--img-size输入分辨率640 是速度和精度的均衡点如果显存充足提到 1280 对细长裂缝有明显提升4.3 接摄像头实时检测答辩 demo 的加分项detect_camera.py 可以读取 USB 摄像头或 RTSP 流。以此做答辩现场演示比放几张静态图有说服力得多。python detect_camera.py --source 0 --weights weights/crack.pt --conf-thres 0.25 --project runs/detect--source 0是默认摄像头序号如果外接多个摄像头改成 1 或 2。跑起来后按 q 键退出检测结果会保存在 runs/detect 目录下。需要注意--project参数指定输出目录默认是在 runs/detect 下按时间戳生成子目录答辩前把报告目录整理好导出视频时可以加--save-txt --save-conf把坐标和置信度存下来方便做定量分析。4.4 训练自己的数据train.py 的入参解析如果不想直接用现成权重想重新训练一个模型常见于毕设要求「有自己的训练过程」跑 train.pypython train.py --data data/coco128.yaml --cfg models/yolov5s.yaml --weights --epochs 100 --batch-size 8 --img-size 640 --device 0参数关键点--weights 表示从头训练如果改成--weights yolov5s.pt则是基于 COCO 预训练权重做迁移学习收敛速度更快毕设建议用后者。--batch-size受显存限制6G 显存跑 yolov5s 最多 168G 可以试 32如果 OOM把--img-size降到 480 比降 batch-size 更有效——裂缝检测对分辨率更敏感。5. 避坑指南裂缝检测最容易翻车的五个问题5.1 显存 OOM尤其是显卡只有 4G 或 6G现象训练或推理时直接报CUDA out of memory。原因YOLOv5 的默认 batch-size 和 img-size 都是为 8G 以上显存设置的4G 卡跑 640 分辨率 16 batch 必炸。解决训练时加--batch-size 4 --img-size 480推理时不需要调批量因为默认就是 1 张图但如果同时跑摄像头 保存结果显存也会涨建议先关掉--save-txt以外的可视化窗口再跑。5.2 权重文件缺失或路径写错现象xxx.pt not found或者加载权重时提示结构不匹配。原因很多同学的 zip 包里 weights 文件夹是空的download_weights.sh 没跑或者下载地址失效。解决确认下载脚本执行成功后再训练/推理权重文件一般 10-30MByolov5s.pt 约 14MB。结构不匹配的报错是Error(s) in loading state_dict原因是用了不同数据集的权重比如拿 YOLOv5n 的权重给 YOLOv5s 结构加载前面的模型配置文件必须保持对应。5.3 标签文件缺失导致的漏检现象训练日志出现Not all images are labeled警告或者推理效果极差。原因图片和 txt 标签不完全同名、标签目录层级和图片不一致。解决写个小脚本校验一下import os img_dir datasets/crack/images/train label_dir datasets/crack/labels/train imgs set(os.listdir(img_dir)) labels set(os.listdir(label_dir)) no_label [im for im in imgs if im.replace(.jpg, .txt) not in labels] print(f缺标签的图片: {len(no_label)} 张, no_label[:5])5.4 裂缝置信度低框不住整条裂缝现象检测出来的裂缝只有一小段被框住或者一张图漏掉一半裂缝。原因裂缝是长条目标YOLO 的默认 anchor 尺寸偏方形且训练时如果用了较强的 mosaic 增强裂缝被裁切到只剩一小截模型学到的是「片段特征」而不是「整条特征」。解决训练时用 hyp.finetune.yaml关闭 mosaic推理时把--conf-thres降到 0.15。另外标注的时候尽量把整条裂缝框完整宁可框大一点不要框半截。5.5 win10 下 pip 装不上 torch 的 CUDA 版现象pip install torch默认装 CPU 版跑 detect 时巨慢一张图要好几秒。原因PyPI 的 torch 默认是 CPU 版Windows 尤其如此需要去 NVIDIA 官方仓库装。解决官网https://pytorch.org/get-started/previous-versions/生成对应 CUDA 版本的命令例如 CUDA 11.1 执行pip install torch1.8.1cu111 torchvision0.9.1cu111 -f https://download.pytorch.org/whl/torch_stable.html装完后torch.cuda.is_available()返回 True 才算成功。6. 进阶用 LabelImg 自建裂缝数据集时的三个关键习惯毕业设计最后都要求「改进」或「应用」复用别人的模型只能拿基础分自己标注一套数据微调论文的「工作量」这一栏才立得住。我试过用 LabelImg 标注几百张桥梁裂缝图片后用这套代码微调总结出三个直接影响最终精度的细节。第一个习惯每张图只标明显裂缝模糊的、小于 20 像素宽的不标。裂缝数据集最容易出现「标签噪音」——一个像素级别的裂痕人眼看不清标注时纠结半天最后标了模型学到的是噪声。我自己的做法是只保留宽度超过 3 个像素、长度超过 50 个像素的裂缝精标 500 张效果比粗标 2000 张好两个点mAP0.5 从 72% 提到 79%。第二个习惯验证集里故意放几种训练时没见过的光照条件。比如训练集多放晴天照片验证集必须混入阴天、逆光、有阴影的照片。裂缝检测的泛化瓶颈往往不在裂缝形态而在光照鲁棒性——混凝土阴影和裂缝在灰度特征上非常像。我发现模型在阴影边缘会产生大量误检全部集中在验证集得分低的那几类图片上。从那以后我每次标注训练集都会刻意保留一部分「难样本」只在验证集里出现用它来卡模型过拟合。第三个习惯微调时把 freeze 层数设大一点。YOLOv5 迁移学习时默认 freeze 前 10 层对裂缝这种语义特征和 COCO 差异巨大的场景我一般会--freeze 12把 backbone 的前面部分也冻住。原因是裂缝的低层纹理特征边缘、梯度和 COCO 场景的通用特征是共享的冻住能让模型专注学高层语义。我实测 freeze 12 比 freeze 10 在 500 张裂缝数据上高 1.8 个 mAP 点而且收敛更稳不会后期 loss 震荡。三个习惯合起来我的毕设裂缝检测项目从「能跑」变成了「能讲清楚为什么这么设计」。在这些细节上代码只是载体你对数据、对模型配置的理解才是答辩时老师真正追问的东西。这套项目源代码加模型帮我把整个 YOLOv5 训练链路走通了一遍后面我自己换数据集做路面病害检测半天就完成了迁移——希望这套流程同样帮到你。本文还有配套的精品资源点击获取
返回列表