ARTICLE DETAIL

资讯详情

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

Python+YOLOv5路面桥梁裂缝检测:从环境配置到训练部署

Python+YOLOv5路面桥梁裂缝检测:从环境配置到训练部署 简介一套基于Python和Yolov5的路面桥梁裂缝检测识别项目属于高分毕业设计源码面向计算机相关专业正在准备毕业设计、课程设计或期末大作业的学生也适合需要项目实战练习的初学者。项目已经导师指导并评审通过评分高达99分代码完整且可直接运行从环境配置到模型调用均有配套说明小白也能上手。压缩包共85个文件大小1.6MB文件类型涵盖23个yaml配置、23个py源码、24个pyc编译文件、5个sh脚本、2个dockerfile以及若干示例图片目录按data、models、utils等模块划分清晰呈现数据配置、网络结构与核心工具函数便于系统学习检测流程。目前已有80人学习/下载。资源中不仅提供图片检测、摄像头实时识别等完整功能代码还包含模型权重下载脚本、多种Yolov5结构配置和测试样例图片读者可快速跑通路面裂缝识别流程进一步做算法调优或功能扩展是完成相关课题的实用参考。1. 基于PythonYolov5的路面桥梁裂缝检测一套能直接演示的完整链路基于PythonYolov5的路面桥梁裂缝检测识别项目是那种典型的、能直接在毕业答辩上演示的CV落地资源源码、模型权重、数据集配置、图片推理和摄像头实时检测入口全部齐活导师指导后评审99分属于「拿到手就能跑」的类型。这类项目最大的价值不是算法有多新而是把裂缝检测这件事收敛成了三步——准备图片、跑detect_photo.py、去runs目录看带框输出。对有毕业设计、课程设计或期末大作业需求的人来说它省掉了从零搭YOLOv5环境、调通数据集、训练到怀疑人生的过程非常适合计算机相关专业学生用于快速复现、二次改造和答辩演示。2. 把项目跑起来环境配置、权重下载与detect_photo.py首次推理2.1 先看清项目里有什么每个目录都不是摆设拿到压缩包先别急着解压跑命令花三分钟把目录结构过一遍。标准的YOLOv5项目应该有data、models、utils、runs、weights这些核心目录而这份资源在此基础上加了detect_photo.py和detect_camera.py两个入口脚本说明作者把官方detect.py拆成了「图片检测」和「摄像头检测」两个场景毕设演示时直接对应不同实验这个设计本身就可以写进论文的「系统实现」章节。各目录的用途如下表后续所有操作都围绕这几块展开目录/文件在项目里的职责毕设场景下怎么用data/存放数据集配置yaml和标签模板换成自己的裂缝数据时改这里models/网络结构定义yolov5s/m/l/x的yaml想看懂网络结构、换模型规模时看这里utils/数据处理、指标计算、工具函数一般不用动报错时定位逻辑来这里weights/模型权重存放位置配download_weights.sh推理和训练都会用到runs/训练和检测的输出目录答辩演示的带框结果图都在这里detect_photo.py单张/多张图片推理入口主要演示入口detect_camera.py摄像头实时检测入口现场演示的加分项2.2 Python与PyTorch环境装到什么程度才算够用这个项目的运行环境不复杂核心是Python 3.8以上加PyTorch。我一般不建议一上来就照着某个教程装全家桶而是先确认手里显卡的CUDA版本再决定装CPU版还是GPU版的torch。如果是笔记本集成显卡或者显卡显存只有2G那直接装CPU版最省心后面训练也能跑只是慢一些有6G以上显存的话再上GPU版训练效率差好几倍。# 建议新开一个虚拟环境避免和系统Python互相污染 conda create -n crack python3.8 -y conda activate crack # 安装核心依赖先保证推理链路能起来 pip install torch torchvision opencv-python numpy pyyaml tqdm matplotlib这段命令做的事是先建一个干净环境再装YOLOv5推理必需的基础库。torch和torchvision提供模型和算子支持opencv-python负责图像读写numpy处理数组pyyaml解析data目录下的配置文件tqdm用来显示进度条matplotlib在训练画曲线时会用到。如果你的GPU显存小于4G或者压根没有独立显卡pip install torch时加一行--index-url https://download.pytorch.org/whl/cpu装CPU版跑推理完全没有问题。装完可以用python -c import torch; print(torch.__version__)验证一下版本输出。这一步常见的翻车点是torch版本装得过高导致和Python 3.8不兼容。我的做法是装好之后立刻跑一个最小的导入测试确认torch、cv2、yaml三个库都能正常import再继续这十几秒的检查能省掉后面排查环境的一小时。2.3 权重下载与首次推理detect_photo.py的参数这样调环境就绪后先下载预训练权重。资源里带的weights/download_weights.sh就是干这个事的它会从官方地址拉取权重文件你只需要在项目根目录执行下面的命令然后等它下载完成。如果网络下载失败也别慌手动把权重文件放进weights目录也能达到同样效果后面避坑章节会细说。# 在项目根目录执行脚本会自动把权重放到weights目录下 bash weights/download_weights.sh # 跑一张测试图片 python detect_photo.py --source data/images/0001.jpg --weights weights/yolov5s.pt --conf 0.25download_weights.sh本质是一组wget命令依次下载yolov5s.pt、yolov5m.pt等不同规模的权重毕设场景下用yolov5s.pt就够了。detect_photo.py的--source参数接收图片路径--weights指定推理用的权重文件--conf是置信度阈值。这里有个经验值conf设为0.25是比较均衡的口味裂缝这种目标形态不规则、容易和阴影混淆的类别阈值开到0.3以上会漏掉细裂纹开到0.1以下又会出现一堆背景误报。我一般先在0.25跑一遍看输出的框的数量再微调。推理完成后控制台会打印出检测到的目标数量检测结果图默认写到runs/detect/exp目录。打开那张带框的图检查一下如果裂缝位置框得准、置信度分数正常说明整个链路已经通了后面换数据集、训练、调优才有意义。提示首次推理建议用项目自带的示例图先确认环境没问题再跑自己的图片不然出了问题不好定位是环境还是数据导致的。3. 读懂数据与标签coco128.yaml、voc.yaml与裂缝样本的组织方式3.1 data目录里的三个yaml模板、路径与类别打开data目录里面同时躺着coco128.yaml、coco.yaml和voc.yaml三个配置第一次看的人容易懵做裂缝检测到底该用哪个其实这三个文件都不包含真实图片它们只是告诉了YOLOv5「训练时去哪里找图片、标注文件放在哪、检测的目标类别有几个、类名分别叫什么」。coco128是官方提供的百张微型样例用来验证流程是否走得通coco.yaml对应完整的COCO数据集voc.yaml则适配VOC格式的数据。用coco128.yaml举个例子训练时YOLOv5会读取它里面的路径配置# data/coco128.yaml 的核心字段 train: ./images/train2017 val: ./images/train2017 nc: 1 names: [crack]这里的train和val指向存放图片的目录路径路径既可以是相对路径也可以是绝对路径但绝对路径在换机器之后必须重新改否则直接报错找不到文件。nc表示类别数量裂缝检测只有一个类别所以nc设为1names列表里的第一个字符串就是类别名推理时框顶显示的文字就是它。如果训练的是「裂缝破损」两个类别就要把nc改成2、names改成[crack, damage]。把资源和这个机制对应起来就清楚了data目录提供的其实是三套「数据说明书」拿到项目后把yaml按自己的数据改一遍而不是替换整个目录。很多第一次接触YOLOv5的同学把别人的data目录整个复制过来结果训练时读的图片还是别人电脑上的绝对路径训练出来模型自然不对。3.2 标签格式一行一个归一化bbox错一位就全错YOLOv5用的标签不是PASCAL VOC那种XML也不是COCO那种JSON而是每张图片对应一个同名txt文件。每个txt文件里每一行代表一个目标五个数字分别是类别ID、目标中心点x坐标、中心点y坐标、目标宽度、目标高度其中坐标和宽高都做了归一化取值范围0到1。# 假设图片尺寸是640x640裂缝中心在(320, 320)宽100高30 # 归一化后的标签行如下 0 0.5 0.5 0.15625 0.046875这一行的含义拆开看开头的0是类别ID对应names列表里的第0个元素crack0.5是中心点x除以图片宽度0.5是中心点y除以图片高度0.15625是目标宽度除以图片宽度0.046875是目标高度除以图片高度。为什么要归一化因为模型输入尺寸不一定等于原图尺寸归一化之后标签和输入分辨率解耦640的图能用416的图也能用。这个文件组织的坑在于标签文件必须放在yaml里指定的labels目录下且文件名和图片名完全一致——图片叫0001.jpg标签就必须叫0001.txt哪怕只差一个后缀训练时这张图就会被跳过。检查标注是否正确有个土办法把标注按坐标画回原图看位置对不对这在后面避坑章会再提。3.3 把裂缝图片拼成自己的数据集按模板替换而不是从零搭现在把前面的机制串起来说清楚如何把网上下载的裂缝图片整理成YOLOv5能直接训练的数据集。常见做法是这样组织目录结构crack_dataset/ ├── images/ │ ├── train/ # 训练图片比如300张 │ └── val/ # 验证图片比如80张 └── labels/ ├── train/ # 和images/train一一对应的txt标签 └── val/ # 和images/val一一对应的txt标签然后复制一份coco128.yaml改成crack.yaml把train和val的路径指向上面的images目录nc设为1names设为[crack]。这个过程中最容易出错的是路径层级yaml里的路径是相对于项目根目录解析的写./crack_dataset/images/train可以写D:/毕设/图片/测试这种就很容易在换机器时出问题。标签生成有两条路数据量大就用LabelImg或Labelme这类标注工具人工画框软件会自动生成VOC格式的XML再写个小脚本把XML转成YOLOv5需要的txt数据量不大也可以直接用脚本把坐标算出来写入txt但务必用5.2节里的可视化方法验证一遍。裂缝和普通物体不一样细长、走向不规则如果标注的框没完全包住裂缝模型特征就学不全推理时很容易漏检。注意数据集的图片数量不是越多越好。裂缝检测场景下200张标注良好的图片训练出来的效果往往好于800张标注潦草的图片。我见过太多人从网上批量爬图后随便拉了个框就开训结果mAP一直卡在0.1上不去。4. 训练自己的裂缝模型超参配置、模型规模与选择4.1 yolov5s/m/l/x怎么选裂缝场景下跑得动比跑得准重要models目录里放着yolov5s.yaml、yolov5m.yaml、yolov5l.yaml、yolov5x.yaml四个网络结构定义文件它们对应同一套YOLOv5架构的不同深度和宽度。s最轻量、推理最快x最重、精度上限最高。用YOLOv5训练自己的数据集时这四个文件就是这一节的核心选型依据。裂缝检测这类任务有个特点目标在画面里往往是细长的暗色线条背景是灰色路面或混凝土深浅对比通常比较明显没有像行人检测那么复杂的纹理和姿态变化。所以yolov5s或yolov5m在这个场景下完全够用yolov5l和yolov5x精度提升有限但训练时间几乎翻倍推理帧率也会明显下降。毕设场景里如果还打算做摄像头实时检测演示选yolov5s是最稳的。网络结构这块如果答辩被问到其实不用把每层参数背下来抓住三点就行yaml文件里的depth_multiple控制网络深度、width_multiple控制通道宽度、anchors是预设的初始锚框尺寸。小模型结构简单、收敛快适合数据量不大的项目大模型需要更多数据去填充容量数据只有两三百张时反而不如小模型。4.2 超参数文件与训练命令hyp.scratch和hyp.finetune怎么用训练启动时除了指定数据和模型还有两个超参数文件要理解hyp.scratch.yaml是从头训练时用的初始超参学习率、动量、数据增强强度都按默认值走hyp.finetune.yaml是微调时用的学习率更小、增强幅度更温和适合加载预训练权重后继续训练。# 典型训练命令用yolov5s预训练权重在自己的裂缝数据集上继续训练 python train.py \ --data data/crack.yaml \ --weights weights/yolov5s.pt \ --cfg models/yolov5s.yaml \ --epochs 100 \ --batch-size 16 \ --imgsz 640逐项说下参数含义--data指向你自己写的crack.yaml--weights指向预训练权重--cfg指定网络结构--epochs是训练轮数--batch-size是每批图片数量--imgsz是输入分辨率。训练过程最看资源的是batch-size显存6G左右建议设812G以上可以试16设太大直接报CUDA out of memory。epochs也不是越大越好裂缝数据集小的话50到100轮就能看到mAP收敛100轮以后基本不再提升。超参数里值得手动调的主要是下面几个新手一般不用全改超参数位置推荐值调参逻辑lr0hyp.*.yaml0.01scratch/ 0.001finetune学习率微调时降一个量级防震荡momentumhyp.*.yaml0.937动量一般保持默认batch_size训练命令8~16按显存调整OOM就减半epochs训练命令50~100看results.png里曲线是否收敛4.3 runs目录读法best.pt、last.pt与演示时选哪个权重训练结束后去runs/train目录会发现多了一个exp第二次是exp2文件夹里面的内容就是整个训练过程的记录。对毕设来说最重要的两个文件是weights子目录下的best.pt和last.ptbest.pt是验证集上mAP最高的那一版权重last.pt是最后一轮训练结束时保存的权重。绝大多数情况下要用best.pt做推理和演示因为last.pt可能是过拟合后的状态泛化效果反而变差。runs/train/exp下还有几个值得看一眼的文件results.png把每轮的loss、精确率、召回率、mAP画成了曲线这个图直接可以放进论文的实验分析章节混淆矩阵图可以说明裂缝类别有没有被背景误判。训练日志里epoch两字后面的数字是当前轮次GPU显存占用和耗时在括号里能看到如果发现一个epoch耗时异常增加通常是因为验证阶段开始算mAP了不是程序卡死。训练完成后把detect_photo.py的--weights参数换成runs/train/exp/weights/best.pt重新跑一遍测试图片对比和预训练权重的检测效果差异。这一步很关键因为答辩时要回答「预训练模型和自训练模型差别在哪」亲手跑出来的框数、置信度和漏检情况就是最有说服力的数据。提示训练中途断掉不要慌last.pt可以接续训练。把--weights指定为last.pt再跑一遍训练命令YOLOv5会从断点继续之前的训练轮次记录也不会丢。5. 实战避坑6个毕设演示前最容易翻车的点5.1 权重下载失败或校验不过现象跑download_weights.sh时网络超时或者下载完的.pt文件在推理时报错说格式不对。原因一是网络不稳定导致文件下载不完整二是下载脚本里的URL在新版本中已失效。解决优先用浏览器手动下载对应权重文件放入weights目录并检查文件大小yolov5s.pt一般在14MB左右如果只有几KB那一定是下载失败了。下载后先跑一次python detect_photo.py验证能加载再继续。5.2 标签文件和图片没配对训练时漏样本现象训练日志里epoch图正常跑但每个epoch的样本数明显比自己的图片总数少或者验证集的mAP始终是0。原因YOLOv5通过--data配置里的路径找图片再把图片名对应到labels目录下的同名txt标签文件名对不上或标签内容和图片尺寸不匹配时图片会被静默跳过。解决写一行脚本核对两个目录的文件名差集把images里没有对应txt的图片挑出来重新标注。# 列出images目录里有、labels目录里没有对应标签的图片 ls crack_dataset/images/train | sed s/\.jpg$// /tmp/img_list.txt ls crack_dataset/labels/train | sed s/\.txt$// /tmp/lab_list.txt comm -23 (sort /tmp/img_list.txt) (sort /tmp/lab_list.txt)5.3 训练时报CUDA out of memory现象train.py跑起来没几秒就报CUDA out of memory整个进程退出。原因batch-size和imgsz组合超出了显卡显存容量。解决把batch-size减半再试还不行就降到4也可以把imgsz从640降到416显存占用会大幅下降。如果机器只有CPU没有独立显卡那就把训练命令里的--device cpu加上跑得慢但至少能出结果裂缝数据量不大时CPU训练完全等得起。5.4 摄像头检测画面卡顿、掉帧现象detect_camera.py打开后画面能显示但框和数据叠加上去后肉眼可见延迟转头时画面拖影严重。原因摄像头帧读取、模型推理、画面绘制三个操作在同一个线程里串行执行推理耗时直接拖慢了帧率。解决把摄像头读取放到独立线程或独立进程主线程只做推理和绘制同时把--imgsz降到416输入分辨率降低推理速度能提升接近一倍。demo场景下这两个改动同时做帧率表现会明显改善。5.5 推理结果全是框或一个框都没有现象detect_photo.py输出结果时控制台显示检测到了大量目标或者一张图一个框都没有。原因置信度阈值设置不当。阈值太低时背景噪声也被当成裂缝阈值太高时细小的裂缝被过滤掉。解决先输出几张测试图的检测结果把conf从0.5开始往下调每次降0.05观察框数变化。裂缝灰度特征和路面阴影接近的场景一般0.2到0.3之间能找到稳定区间。5.6 项目换电脑后路径失效现象在家里调试正常的训练命令换到实验室电脑报错找不到crack.yaml或图片目录。原因yaml文件里写了绝对路径或者相对路径的基准不对。解决所有数据集路径统一用相对项目根目录的写法权重路径也一样如果非要写绝对路径换机器后把所有yaml和脚本里的路径批量替换一次别漏掉data目录里coco.yaml这类备份文件。6. 批量检测把detect_photo.py改成分目录输出的演示工具毕设答辩前通常要准备一组代表性图片的检测结果一张一张跑detect_photo.py再手动收集费时也容易漏。常见做法是写一个批量处理脚本遍历一个目录下的所有图片统一推理并保存结果顺便生成一张汇总表演示时直接翻结果图比现场一条条敲命令体面得多import os import argparse from pathlib import Path import cv2 import torch def batch_detect(source_dir, weights_path, conf_thres0.25, output_dirruns/batch_detect): 批量检测遍历source_dir下所有jpg/png输出带框图和汇总信息 model torch.hub.load(., custom, pathweights_path, sourcelocal) model.conf conf_thres # 把阈值直接挂到模型上省得每次推理传参 os.makedirs(output_dir, exist_okTrue) img_exts [.jpg, .jpeg, .png, .bmp] files [p for p in Path(source_dir).iterdir() if p.suffix.lower() in img_exts] for img_path in files: img cv2.imread(str(img_path)) results model(img) # 内部完成预处理、推理、NMS results.save(save_diroutput_dir) # 保存带标注的图 print(f{img_path.name}: {len(results.xyxy[0])} crack detected) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--source, typestr, requiredTrue, help图片目录) parser.add_argument(--weights, typestr, requiredTrue, help权重文件路径) parser.add_argument(--conf, typefloat, default0.25, help置信度阈值) args parser.parse_args() batch_detect(args.source, args.weights, args.conf)这段脚本的核心逻辑分三步先把本地训练好的best.pt加载成模型然后遍历目录下所有常见格式的图片逐张推理并保存。值得注意两点一是model.conf conf_thres这句在YOLOv5推理时可以避免每次调用都重复传阈值参数脚本后面更干净二是results.xyxy[0]返回的是当前图片所有检测框的坐标、置信度和类别IDlen()取到的就是这张图裂缝的数量答辩现场想展示统计数字时直接看控制台输出即可。自从我把这个批量脚本整理进自己的毕设工具链后每次拿到新的YOLOv5整理包都会强制走一遍三个检查先确认weights目录下的权重能正常加载再拿单张图过一遍detect_photo.py看链路通不通最后用批量脚本跑一组测试图检查输出目录结构。这三步做完整个项目的运行状态心里就有底了剩下的训练、调参才有意义。希望帮到你。本文还有配套的精品资源点击获取
返回列表