ARTICLE DETAIL

资讯详情

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

Yolov5裂缝检测系统实战:从数据标注到模型部署全流程

Yolov5裂缝检测系统实战:从数据标注到模型部署全流程 简介这份资源是一个基于Python与Yolov5的裂缝检测识别系统聚焦路面、桥梁与墙体三大应用场景适合计算机视觉方向的在校学生、科研人员及企业算法工程师使用也可直接支撑毕业设计、课程设计或项目初期原型验证。包内含完整源码、模型配置与图文说明代码结构清晰注释规范便于二次开发与算法复现。资源共53个文件涵盖yaml模型配置、py核心代码、sh权重下载脚本、jpg/png示例图片以及docx/pptx/md项目文档压缩包约2.06MB轻量易部署。目前已有292人学习下载。读者可借此掌握Yolov5目标检测在裂缝识别任务中的完整落地流程包括数据配置、模型训练与推理、摄像头实时检测及图片检测等多类接口同时还能参考作者多年工程经验沉淀的代码组织方式与项目文档写法适合作为入门进阶和实战演练的优选资料。1. 裂缝检测不只是跑通Yolov5这份源码包解决的是落地最后一公里路面、桥墩、墙裙上的裂缝靠人工看照片一天看几百张眼睛花不说漏检率高得吓人。Python Yolov5 路面桥梁墙体裂缝检测识别系统文档源码.zip 是一套拿来就能跑的Yolov5目标检测项目输入一张现场照片模型直接框出裂缝位置同时给出置信度。它不是只有几个py文件的半成品weights权重目录、readme.docx、readme.pptx答辩材料、Dockerfile部署文件、完整Yolov5源码都在。适合课程设计、毕设起步更适合第一次用Yolov5训练自己数据集的从业者照着完整流程走一遍把环境配置、超参数调整、后处理这些环节一次性打通。这个项目最值得参考的不是算法有多新而是结构完整——作者是做了十年算法仿真的大厂工程师代码把训练、推理、部署拆得清清楚楚新手能按步骤复现熟手也能直接拿来改自己的裂缝数据集。2. 工程结构拆解从Yolov5s权重到Dockerfile先看懂再动手2.1 压缩包目录拆解拿到压缩包别急着跑demo先把目录结构过一遍搞清楚哪些文件是给你改的哪些是框架底层不用动。我先把核心目录列出来Python-Yolov5-Detection-and-recognition-of-cracks-in-road-bridges-wall-main ├── weights/ # 预训练权重download_weights.sh 的下载目标 ├── data/ │ ├── coco.yaml # COCO 数据集类别配置 │ ├── coco128.yaml # COCO128 快速验证配置 │ ├── voc.yaml # VOC 数据集配置也是训练入口 │ ├── hyp.scratch.yaml # 从头训练用的超参数 │ ├── hyp.finetune.yaml # 迁移学习微调用的超参数 │ ├── images/ # 自带测试图片 │ └── scripts/ # 辅助脚本 ├── models/ │ ├── yolov5s.yaml # 小模型结构配置 │ ├── yolov5m.yaml # 中等模型结构配置 │ ├── yolov5l.yaml # 大模型结构配置 │ ├── yolov5x.yaml # 超大模型结构配置 │ ├── common.py # Focus、CSP、SPP 等基础模块 │ ├── experimental.py # 实验性模块一般不动 │ ├── export.py # 导出 ONNX/TorchScript 用 │ └── yolo.py # Detect 头、损失计算 ├── runs/ # 训练日志与检测结果输出目录 ├── detect_photo.py # 单张图片检测入口 ├── detect_camera.py # 摄像头实时检测入口 ├── Dockerfile # 容器化部署配置 ├── download_weights.sh # 权重下载脚本 ├── hubconf.py # 支持 torch.hub 方式加载 ├── README.md ├── readme.docx # 项目说明文档 └── readme.pptx # 答辩演示文稿这个结构其实就是标准Yolov5官方仓库的布局项目方在此基础上加了detect_photo.py、detect_camera.py和readme文档。你真正要改的只有三处data/voc.yaml类别配置、data/hyp.finetune.yaml训练超参、models/yolov5s.yaml如果要换模型规模。models/common.py和yolo.py这些底层文件除非你要改网络结构否则不要碰。runs/目录是空的正常。Yolov5的train.py和detect功能会自动在这里生成runs/train和runs/detect子目录。readme.docx是作者写的设计说明readme.pptx是答辩用的演示稿这两个文件对课程设计来说价值很高直接省了你自己整理项目背景和系统架构的时间。2.2 模型配置选型yolov5s 到 yolov5x 的取舍models/下给了四个模型配置yolov5s、yolov5m、yolov5l、yolov5x。它们的差别由两个参数决定depth_multiple深度系数和width_multiple宽度系数。配置文件depth_multiplewidth_multiple适用场景yolov5s.yaml0.330.50显存 4GB 以下训练快裂缝检测首选yolov5m.yaml0.670.75显存 6GB 以上精度更高yolov5l.yaml1.001.00要求最高精度推理速度放次要yolov5x.yaml1.331.25超大模型基本只有服务器才跑得动裂缝在图像里属于细长目标长宽比经常到1:5甚至1:10以上这种目标不是模型越大效果越好。我自己的习惯是先用yolov5s把训练流程整个跑通确认数据没问题、loss能降下来再换yolov5m提精度。一上来直接跑yolov5x显存不够翻车不说训练一轮的时间够s模型跑好几轮调参效率完全跟不上。课程设计答辩场景还有个现实考虑显存要求不高只需要给评委看检测效果图——s模型在640分辨率下对明显裂缝已经能框得不错。实际工程巡检再去换m或者针对裂缝做数据增强不要一开始就把资源耗在模型规模上。2.3 为什么选 Yolov5 而不是更新的目标检测框架新框架层出不穷但这份资源用Yolov5是有道理的。源码成熟度是第一位的yolov5的训练、验证、导出链路已经被上万人踩过坑网上随便搜python环境配置、部署教程都有一堆资料遇到问题不会卡死在黑匣子里。YOLO系列的生态也决定了它在边缘设备上的支持最好而裂缝巡检恰恰经常要在工地现场的笔记本上跑。对这个项目来说选Yolov5还有一个现实理由文档和答辩素材齐全。readme.docx、readme.pptx都是配套写好的你只需要把自己的数据集结果替换进去。如果换成新框架这些文档都得重写工作量就大了。不是说新框架不好而是对于一个需要快速交付、拿去答辩的场景Yolov5是性价比最高的选择至少不会在环境依赖上卡你两天。有一点要提醒项目自带的detect_photo.py和detect_camera.py是封装好的入口但训练还是要走train.py这个通用入口源码里没有单独的train脚本文件但完整训练链路是有的。这一点在第4章会展开讲。3. 环境搭建与权重准备conda、download_weights.sh 与预训练模型校验3.1 conda 环境与依赖安装先把环境配好。Yolov5对Python版本的要求是3.8到3.10我一般用3.9踩坑最少。显卡有N卡就用GPU版PyTorch只有CPU也能跑就是训练慢一些推理勉强能看。这里给一套我实测过的命令conda create -n yolov5-crack python3.9 -y conda activate yolov5-crack cd Python-Yolov5-Detection-and-recognition-of-cracks-in-road-bridges-wall-main pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple第一行创建虚拟环境并指定Python 3.9-y跳过确认交互第二行激活环境这步经常被忽略导致后面import torch报错——因为装到了base环境。第三行进入项目根目录注意你的解压路径可能带中文或空格建议把压缩包解压到一个纯英文路径比如D:\code\yolov5-crack能省掉一堆莫名其妙的路径报错。第四行用PyPI镜像装依赖比默认源快得多。依赖装完后单独验证一下PyTorch和GPU是否可用这一步建议每次都做python -c import torch; print(torch.__version__, torch.cuda.is_available())如果输出2.x.x True说明GPU可用如果输出False说明装成了CPU版本。显卡是N卡的去PyTorch官网按你的CUDA版本选安装命令不要用requirements.txt里默认的torch版本那个经常是CPU版训练慢到怀疑人生。装完torch再回来补装其他依赖pip install -r requirements.txt会自动跳过已装的包。conda装不上或者没有conda的用venv也行但conda管理CUDA相关依赖更省事。项目里的Dockerfile那条路后面会讲如果你在Windows上配环境反复失败直接走Docker是更省心的选择。3.2 权重下载脚本与预训练模型校验weights/目录在压缩包里是空的需要你手动把预训练权重放进去。项目自带download_weights.sh直接跑bash download_weights.sh这个脚本本质上就是一组下载命令把yolov5s.pt等预训练权重拉到weights/目录。如果脚本里的下载地址失效备选方案是单独下载yolov5s.pt手动放进weights/。注意权重文件大小yolov5s.pt通常在14MB左右yolov5m.pt在40MB左右——如果你下载的文件只有几KB大概率是下到了错误页面这种文件训练时一定会报错。权重校验有个肉眼可见的标准文件后缀是.pt大小在MB级别而且是能从torch.load正常加载的。你可以在训练前先加载试试python -c import torch; ckpt torch.load(weights/yolov5s.pt, map_locationcpu); print(ckpt[model].type)这里用map_locationcpu是为了避免GPU环境下加载时显存报错print能看到模型类型说明权重没损坏。权重文件是训练的起点它决定了你是在COCO预训练基础上微调还是从头训练。用yolov5s.pt做预训练权重训练收敛速度比随机初始化快一个量级这也是裂缝检测这种小数据集项目能用得起来的关键——裂缝数据往往也就几百到几千张全靠随机初始化很难训练出可用模型。下载脚本还有个隐藏坑如果项目里的脚本用了不同的下载工具Windows下没有对应命令会直接报错。这种情况我一般手动下载权重文件放进weights/比折腾脚本快得多。权重文件属于基础资源整个流程里最不值得花时间的就是这一步。3.3 超参数文件解读hyp.scratch.yaml 和 hyp.finetune.yaml 的差别data/下有两个超参数文件新手经常搞混这两者的选择直接决定训练是否收敛。我从参数角度拆开说明。参数hyp.scratch.yamlhyp.finetune.yaml作用lr00.010.001初始学习率微调要调低lrf0.20.1最终学习率 lr0 * lrfmomentum0.9370.937SGD 动量一般不动weight_decay0.00050.0005权重衰减防过拟合fl_gamma1.51.5Focal Loss 系数正负样本不均衡时有用hsv_h / s / v各 0.015各 0.015颜色增强幅度从我拆过的项目经验看这个资源默认的hyp.scratch.yaml是针对从头训练COCO设计的学习率偏高。而裂缝检测场景下你大概率是用预训练权重做迁移学习应该选hyp.finetune.yaml它把lr0降到了0.001避免预训练权重被大步长冲坏。怎么把超参数喂给训练Yolov5支持在训练命令里直接改也可以在yaml里改优先级是命令行参数高于yaml文件。比如python train.py --hyp data/hyp.finetune.yaml --data data/voc.yaml --epochs 100如果训练过程中发现loss震荡不收敛最直接的办法就是把lr0再往下降一个数量级或者在命令里加--cos_lr用余弦退火。注意fl_gamma这个参数裂缝检测属于典型的目标小、背景多的场景Focal Loss的gamma值可以适当调大到2.0让模型把注意力放在难分的裂缝上这个细节对最终mAP有肉眼可见的影响。超参数这块还有一点要提醒不要同时调多个参数。一次只改一个比如先把lr0从0.001降到0.0005看loss曲线变化再决定要不要动fl_gamma。同时改三四个参数出了问题你根本不知道是哪一步引起的排查成本比训练成本还高。4. 训练自有裂缝数据集格式转换、超参数调参与常见问题排查4.1 数据目录与标签格式从 VOC 到 YOLO 的转换脚本data/voc.yaml这个文件是训练的数据入口它指向了VOC格式的数据集。Yolov5训练要求的标签格式是YOLO格式每张图片对应一个同名.txt文件存在labels/目录下每行是一个目标class_id x_center y_center width height四个坐标都是相对于图片宽高的归一化值。如果你手上是标注软件导出的VOC XML格式需要先转换。我常用的转换脚本逻辑如下import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, txt_path, class_names): # class_names 顺序必须和 data/voc.yaml 里的 names 完全一致 tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue # 跳过不在类别列表里的标注 cls_id class_names.index(name) box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) # 归一化计算YOLO 要求坐标在 0~1 之间 x_center (x1 x2) / 2 / img_w y_center (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h # 越界保护裂缝手工标注经常把框画出图像边界 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(w, 1.0) h min(h, 1.0) lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines))这个脚本的关键在于class_names的顺序一定要和data/voc.yaml里names列表一致否则模型训练的类别ID和真实类别对不上mAP全是零这是我见过最多人翻车的点。越界保护那段是我不敢省掉的——手工标注裂缝时框很容易拖出图像边缘如果不裁剪Yolov5在做数据增强时会把越界框直接丢弃导致一个数据集的真实标签数量少了一大截。转换完后目录结构应该是dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 与训练图片同名的 txt │ └── val/ # 与验证图片同名的 txt └── data.yaml # 引用上面路径的配置文件注意labels目录和images目录是平级的不是放在images下面。Yolov5会在训练时根据image路径自动推导对应label路径——把图片路径里的/images/替换成/labels/、扩展名.jpg换成.txt。如果你目录结构放错了训练过程不会报错但一个标签都读不到loss会一直不降。这个设计是Yolov5的老规矩目录结构对了换自己的数据基本不用改代码。4.2 训练启动与参数解读batch、epochs、img-size 怎么调准备好数据后训练命令如下python train.py \ --data data/voc.yaml \ --cfg models/yolov5s.yaml \ --weights weights/yolov5s.pt \ --hyp data/hyp.finetune.yaml \ --img 640 \ --batch 16 \ --epochs 100 \ --name crack_run各参数含义--data指向数据集配置文件里面写清了类别数量和名称--cfg指定模型结构这里用s模型--weights给预训练权重迁移学习的核心就在这一行--hyp选微调超参数--img输入分辨率裂缝检测推荐640不要低于512太小了细裂缝会被下采样抹掉--batch看显存8GB显存跑s模型一般16没问题不够就降到8或4--epochs微调场景100轮足够多了反而过拟合--name是训练任务名输出会存在runs/train/crack_run/下。训练跑起来后重点看两个指标loss曲线和验证集的mAP0.5。正常迁移学习情况下前几个epoch loss会快速下降到50轮左右趋于平缓。如果loss一直在5到6之间横盘说明学习率不对或者标签有问题不要傻等100轮跑完直接CtrlC回去查。数据集划分上我习惯把裂缝数据按8:1:1分成训练、验证、测试而且一定要保证验证集和训练集来自不同的拍摄地点。很多项目的裂缝照片是在同一条路上连拍的硬划的话验证集虚高mAP看着0.9换一批新照片立刻露馅。data/voc.yaml里train和val的路径要写绝对路径或者相对项目根目录的路径写错路径的报错信息不太直观经常是训练开始了才发现读取的图片数为0。4.3 常见问题排查裂缝检测训练中的五个高频坑把裂缝检测训练里最容易翻车的几个问题整理一下每条都是实际跑过的经验。现象一CUDA out of memory。训练刚开始就报错显存直接被占满。原因是batch太大或img-size太大和模型本身关系不大。解决batch从16降到8再降到4或者--img 512先跑通流程。另外关掉其他占显存的程序Windows下浏览器开几十个标签页也会吃掉不少显存。现象二loss不降一直横在5到6。换了lr0也没用。原因多半是标签文件有问题常见的是labels里出现了空的txt文件或者部分图片没有对应标签。解决统计一下labels目录里的文件数和images目录的图片数比对缺一个就是问题。另一个原因是预训练权重没加载上--weights路径写错会静默走随机初始化这时候100轮根本训不出裂缝。训练启动日志里会打印weight加载信息务必看一眼。现象三训练正常但检测不到细小裂缝。长裂缝能框住短小裂缝漏检严重。原因是输入分辨率太低--img 512下20像素宽的细裂缝经过多层下采样后特征已经消失了。解决把输入分辨率提到640甚至768同时检查标注是否把细小裂缝漏标了——模型学不到没标注过的目标。如果数据集里大部分是长裂缝、很少有短裂缝建议在数据层面做一下裁剪增强把大图裁成小图再标注。现象四mAP为0或者验证集上完全没输出。最隐蔽的原因data/voc.yaml里names的顺序和标签txt的类别ID对不上。比如标签里写的是0裂缝yaml里names第一个却是「完好」整个训练都在错位学习。解决抽查一张验证集图片的txt确认第一列数字对应的类别再对照yaml文件。这个错位问题只能自查训练过程不会给你任何提示。现象五误检严重把阴影、伸缩缝、水渍都当成裂缝。原因是训练数据里负样本太少模型没见过「像裂缝但不是裂缝」的样本。解决收集一批无裂缝图片放进训练集标签文件为空txt让模型学会区分背景。推理时把置信度阈值调到0.3到0.4也能过滤掉一部分低置信度误检。注意空txt文件不是0字节文件——0字节文件Yolov5会当不存在跳过需要写入一行空内容或者确保文件能正常打开。5. 推理与验证的最后一环单图检测、摄像头实时识别与 mAP 复盘模型训练完最后一步是用起来。单图检测走detect_photo.pypython detect_photo.py \ --weights runs/train/crack_run/weights/best.pt \ --source data/images/test.jpg \ --conf-thres 0.3 \ --iou-thres 0.45best.pt是训练过程中验证集mAP最高的权重而不是最后一个epoch的权重--conf-thres是置信度阈值裂缝巡检场景0.3比较合理调太高会漏检调太低误检多--iou-thres是NMS后处理参数默认0.45就好。结果会输出到runs/detect/下框上带置信度数值这张图就是答辩时最直接的素材。摄像头实时检测走detect_camera.pypython detect_camera.py --weights runs/train/crack_run/weights/best.pt --source 0--source 0表示默认摄像头项目里用OpenCV的VideoCapture读帧再逐帧走推理对帧率要求不高的场景够用。想在工地现场长期跑项目还带了Dockerfile把源码和权重打包进容器环境依赖一次性锁死换机器不用重新配python环境这点在部署到现场测试时特别省事。拿到底要不要上线我习惯在测试集上做一次完整的mAP复盘而不是只看几张效果图。用项目自带的val流程统计mAP0.5裂缝检测能做到0.7以上就算可用0.8以上效果已经很漂亮。mAP低先别急着调模型先回看第4章的坑——数据标签错位导致的mAP为0数据里负样本太少导致的误检这两类问题占了九成。从那以后我每次拿到新的检测项目都强制先跑一遍验证集统计再上摄像头实测这个习惯帮我避开了无数次「demo跑得飞起、一上现场就翻车」的尴尬。希望帮到你。本文还有配套的精品资源点击获取
返回列表