ARTICLE DETAIL

资讯详情

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

Python+Yolov5裂缝检测实战:从源码运行到训练部署全流程

Python+Yolov5裂缝检测实战:从源码运行到训练部署全流程 简介这份资源面向计算机视觉方向的学生与开发者提供一套基于Python与Yolov5实现路面、桥梁裂缝检测识别的完整项目源码及配套模型权重可用于毕业设计、期末大作业、课程设计或算法入门实践帮助读者快速跑通从数据配置到推理检测的全流程。压缩包共85个文件约1.58MB以py脚本、yaml配置、pyc缓存为主辅以sh权重下载脚本、Dockerfile部署文件及少量jpg、png、jpeg示例图片涵盖模型定义、数据配置、训练与检测脚本等模块。目前已有179人学习下载。项目源码经本地编译验证可运行评审分达98分内容经助教审定难度适中读者可据此掌握Yolov5网络结构、数据集yaml配置、权重加载与图片、摄像头检测等关键环节并借助目录中models、utils、data等模块理解工程组织方式为后续调参与二次开发提供参考。1. 拿到这套 PythonYolov5 裂缝检测源码先别急着 pip install路面和桥梁裂缝检测这个方向这两年从传统图像处理往深度学习迁移已经非常彻底。你手上如果有一份基于 PythonYolov5 的裂缝检测识别源码加权重模型本质上拿到的是一个已经跑通的端到端目标检测工程输入一张路面或桥梁的实拍图输出裂缝的边界框、类别和置信度。它解决的不是裂缝有多宽这种定量问题而是图里有没有裂缝、在哪、大概多大范围的定位问题这对巡检初筛、批量图片归档、毕业设计和期末大作业来说刚好够用。这套资源适合三类人一是做道路桥梁方向毕业设计、需要可运行 demo 和可复现指标的学生二是想拿一个真实工业场景数据集练 YOLOv5 全流程的算法新手三是需要快速搭一个裂缝检测基线、再往上叠自己模块的从业者。它不适合指望开箱即得 SOTA 精度的人也不适合完全没碰过 Python 环境的人——环境这关该踩的坑一个都不会少。下面按资源是什么、怎么跑起来、坑在哪、怎么往上改的顺序拆开讲。2. 拆开压缩包目录结构、权重加载与推理链路2.1 目录里每个文件夹到底管什么解压后你会看到一套标准的 YOLOv5 工程骨架加上几个为裂缝场景定制的脚本。先认清结构再动手能省掉大量文件找不到的低级报错。路径作用是否要改models/网络结构定义含yolov5s.yaml到yolov5x.yaml及common.py、yolo.py换主干或改 head 时才动data/数据集配置coco128.yaml、voc.yaml、coco.yaml及hyp.*.yaml超参训练自己的数据必须改utils/数据加载、损失、指标、绘图、anchor 等工具一般不动weights/存放.pt权重配合download_weights.sh拉取放自己的权重runs/训练和推理输出目录结果图、日志都在这不用改detect_photo.py单张/批量图片推理入口改路径和权重detect_camera.py摄像头实时推理入口改摄像头编号export.py导出 ONNX/TensorRT 等部署格式部署时才用weights目录和download_weights.sh是这套资源的关键——它把预训练权重和裂缝场景微调权重分开管理。hyp.finetune.yaml是微调超参hyp.scratch.yaml是从零训练超参这个区分很重要后面训练章节会展开。2.2 权重加载与一次推理的最小闭环先别管训练第一步是让模型在一张图上出结果确认环境和权重都对。常见做法是先建虚拟环境再跑推理脚本。# 建独立环境避免和系统 Python 打架 conda create -n crack python3.8 -y conda activate crack # 装依赖torch 版本要和 CUDA 对齐没 GPU 就装 CPU 版 pip install torch1.12.1 torchvision0.13.1 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt # 拉取权重脚本里通常是 wget 或 curl 下载 .pt 文件 bash weights/download_weights.sh依赖装完跑单图推理python detect_photo.py --weights weights/best.pt --source data/images/test_crack.jpg --conf 0.25 --img-size 640这里几个参数直接决定结果好坏。--weights指向裂缝微调权重不是官方 COCO 权重用错了会检测出一堆无关类别。--conf 0.25是置信度阈值裂缝这种细长目标建议先给低一点宁可多检也别漏检后面再靠 NMS 和人工复核收敛。--img-size 640是推理分辨率裂缝在图中占比小的时候把它提到 1280 往往能明显改善小目标召回代价是显存和耗时上升。推理脚本内部走的是标准链路letterbox 缩放保持长宽比、归一化、前向推理、NMS 去重、坐标反映射回原图、画框保存到runs/detect/。如果你发现框的位置整体偏移八成是 letterbox 的 padding 计算和反映射对不上这是自己改预处理时最容易翻车的地方。2.3 摄像头实时推理怎么接detect_camera.py把 source 换成摄像头编号即可python detect_camera.py --weights weights/best.pt --source 0 --conf 0.3 --view-img--source 0是默认摄像头--view-img开实时窗口。实时场景下--img-size别开太大640 在普通笔记本上勉强能到 15 到 20 FPS开到 1280 基本就卡成幻灯片。如果要做巡检车上的边缘部署正确路径是先用export.py导出 ONNX 或 TensorRT再挂到推理引擎上而不是硬跑 PyTorch。3. 用自己的裂缝数据训练数据集配置与超参怎么设3.1 数据集目录与 yaml 配置YOLOv5 对数据组织有固定要求图片和标签分目录标签是每行class x_center y_center width height的归一化 txt。裂缝场景通常就一个类别crack所以类别数nc: 1。crack_dataset/ images/ train/ val/ labels/ train/ val/对应的 yaml 这样写# data/crack.yaml path: ../crack_dataset train: images/train val: images/val nc: 1 names: [crack]path用相对路径时是相对train.py所在目录解析的这点经常把人绕晕。稳妥做法是写绝对路径或者确认你从项目根目录启动训练。nc和names必须和标签里的类别索引严格对应标签里出现1而nc是 1只有索引 0训练会直接报索引越界。3.2 微调还是从零训hyp 文件的选择逻辑资源里给了hyp.finetune.yaml和hyp.scratch.yaml两套超参这不是摆设。裂缝数据集通常几千张量级从零训容易过拟合且收敛慢正确姿势是加载预训练权重做微调。# 微调加载预训练权重用 finetune 超参 python train.py --data data/crack.yaml --weights weights/yolov5s.pt \ --cfg models/yolov5s.yaml --hyp data/hyp.finetune.yaml \ --epochs 100 --batch-size 16 --img-size 640 --device 0关键参数逐个说。--weights给预训练权重而不是空这是微调的核心。--hyp选 finetune 版本它的初始学习率更低常见 0.003 量级、warmup 更短避免把预训练学到的特征一把冲掉。--batch-size 16在 8G 显存上跑 640 分辨率差不多是上限显存不够就降到 8 并配合--accumulate做梯度累积。--img-size训练和推理最好一致训练 640 推理 1280 会有尺度失配精度掉得莫名其妙。从零训才用hyp.scratch.yaml学习率更高、warmup 更长适合数据量上万且和 COCO 分布差异极大的情况。裂缝检测一般用不上。3.3 anchor 重聚类小目标召回的关键一步YOLOv5 默认 anchor 是在 COCO 上聚出来的裂缝又细又长和 COCO 目标形状差很远。不重聚类 anchor小裂缝召回会明显偏低。项目里utils/autoanchor.py就是干这个的训练启动时会自动检查 anchor 和数据的匹配度匹配度低会提示重算。# 单独跑 anchor 聚类看当前 anchor 对裂缝数据的适配情况 python utils/autoanchor.py --data data/crack.yaml --weights weights/yolov5s.pt输出里的Best Possible RecallBPR如果低于 0.98说明 anchor 明显不匹配应该让训练脚本自动重算或者手动把聚类结果写回 yaml。这一步是很多训练 loss 正常但小裂缝检不出问题的根因别跳过。4. 训练与推理的避坑排查五个真实翻车现场4.1 现象训练 loss 一直不降mAP 卡在 0.0x原因通常是标签格式错了。YOLOv5 要的是归一化中心点加宽高很多人直接塞了 VOC 的xmin ymin xmax ymax像素坐标模型学不到任何东西。也可能是类别索引从 1 开始而nc: 1只认索引 0。解决写个脚本抽查标签确认每行五个值、后四个都在 0 到 1 之间、类别索引从 0 开始。归一化坐标乘回图像宽高应该落在图内超出范围说明标注或转换有 bug。4.2 现象显存爆了报 CUDA out of memory原因不一定是 batch 太大也可能是--img-size开太高或者 dataloader 的workers太多导致内存和显存一起涨。解决先把--batch-size减半再把--img-size从 1280 降到 640还不行就--workers 2。用nvidia-smi盯着显存曲线确认是训练峰值爆还是推理阶段爆两者处理方式不同。4.3 现象推理结果框位置整体偏移或框比目标大一圈原因是预处理和反映射不一致。自己改过 letterbox 的 padding、或者推理时--img-size和训练不一致都会导致坐标映射错位。解决回到官方 letterbox 实现确认缩放比例和 padding 在前后处理里用的是同一组值。训练和推理分辨率尽量对齐非要改就同步改两边的缩放逻辑。4.4 现象验证集 mAP 很高实际图片上啥都检不出原因是验证集和真实场景分布不一致或者过拟合。裂缝数据集如果验证集是从同一批图里随机切的指标会虚高。解决验证集按拍摄路段、光照条件、相机型号分层切分别随机切。真实场景测试图单独留一批永远不参与训练和验证用它做最终判断。4.5 现象download_weights.sh跑完权重文件是 0 字节或损坏原因是下载中断或链接失效脚本没做校验。解决手动确认.pt文件大小合理yolov5s 通常十几 MB 量级用python -c import torch; torch.load(weights/best.pt)验证能否加载。加载报错就重新下别硬跑损坏权重会报一堆看不懂的 key 错误。5. 从能跑到好用导出部署与精度验证的收尾技巧跑通训练和推理只是及格线真正让这套资源在答辩或项目里站住脚的是两件事把模型导出成可部署格式以及用一套可信的验证流程证明它确实work。先说导出。PyTorch 权重在服务器上跑没问题但要嵌到巡检设备或做成独立 demoONNX 是更通用的选择# 导出 ONNXopset 12 兼容性较好dynamic 支持变长输入 python export.py --weights weights/best.pt --include onnx --opset 12 --img-size 640 640 # 验证导出结果和原模型输出一致 python export.py --weights weights/best.pt --include onnx --img-size 640 640 --verify--opset 12是兼容性和算子支持的平衡点太低有些算子不支持太高部分推理引擎还没跟上。--verify会跑一遍前后向对比确认导出没引入数值偏差这一步别省我见过太多导出后精度悄悄掉一截的案例。要上 TensorRT 就把--include换成engine但注意 engine 和具体 GPU 架构绑定换卡要重新导。再说验证。答辩或交付时光说能检测没用得拿数字说话。建议固定一套评估流程留一批从未参与训练的真实场景图跑批量推理统计召回和误检。# 批量推理整个测试目录保存带框结果 python detect_photo.py --weights weights/best.pt --source test_real/ \ --conf 0.25 --img-size 1280 --save-txt --project runs/final_eval--save-txt会把每张图的检测框存成 txt方便你写脚本和人工标注对比算指标。--img-size 1280在最终评估时用高分辨率把训练时 640 漏掉的小裂缝捞回来。评估时重点看两类错误漏检裂缝存在但没框和误检把接缝、阴影、水渍当成裂缝。裂缝场景误检往往比漏检更影响观感如果误检多优先提高--conf到 0.4 以上或者补一批负样本无裂缝的路面图进训练集让模型学会这不是裂缝。一个我踩过的坑早期我只用 mAP 判断模型好坏结果 mAP 0.85 的模型在实拍图上误检一堆。后来养成习惯任何模型上线前都强制走一遍真实场景图 人工过目 分类统计误检来源的流程指标只是参考眼睛看到的才算数。这套裂缝检测资源本身已经把工程骨架搭好了你要做的是把数据这关和验证这关补扎实它就能从能跑的 demo变成敢拿出手的项目。希望帮到你。本文还有配套的精品资源点击获取
返回列表