ARTICLE DETAIL

资讯详情

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

YOLOv5路面桥梁裂缝检测项目解析:从环境配置到模型训练

YOLOv5路面桥梁裂缝检测项目解析:从环境配置到模型训练 简介基于Python与YOLOv5的路面桥梁裂缝检测识别项目面向有深度学习基础、需要快速落地检测系统的开发者也适用于毕业设计、课程设计和期末大作业等场景。包内提供可直接运行的源代码与训练好的模型并配有安装指南、使用手册、模型训练说明等文档支持本地运行也可通过Dockerfile快速搭建环境。资源共49个文件以22个YAML配置、8个Python脚本及编译版本为主辅以shell权重下载工具、Dockerfile和样例图片压缩包仅1.98MB结构精炼便于学习与二次开发。项目经本地编译验证可运行性高评审得分98分已有98人学习下载。使用者无需从零搭建复杂系统可直接运行现有代码完成裂缝形态、大小和位置的识别同时理解YOLOv5从模型训练到实际道路桥梁场景部署的完整流程是一个实用且高效的高性价比方案。这一方案在保障识别准确率的同时也显著降低了实际应用门槛。1. 路面桥梁裂缝检测项目拿到源码后第一件事是看清它怎么跑把一张带有裂缝的混凝土桥面照片丢给脚本两三秒后照片上多出一圈红框裂缝的轮廓和置信度一并标好——这就是这套基于 Python YOLOv5 的路面桥梁裂缝检测识别项目做的事。它不是一篇讲深度学习的论文而是一份能直接落地的源码包训练好的模型权重、推理脚本、数据配置、模型定义文件都在里面解压后按步骤配置好环境就能跑出检测结果。对正在做毕业设计、课程设计或者只是想快速验证“深度学习能不能识别裂缝”这个想法的工程师和学生来说最值钱的部分在于它帮你跳过了从零搭框架、从零标数据的漫长过程。接下来我从项目结构讲起把识别链路、运行参数、训练方法和几个高频坑一次说清。2. YOLOv5 在裂缝检测里的角色网络结构、推理入口与文件清单2.1 从一张图到一组框YOLOv5 的识别链路路面裂缝这类目标形态是细长条、走向随机、背景又是复杂的水泥纹理和沥青颗粒传统图像处理用边缘检测和阈值分割很容易把伸缩缝、阴影、水渍误判成裂缝。YOLOv5 能在这个场景里立住核心在于它把“找目标”这件事拆成了三个并行环节。第一步输入图像会被缩放成 640×640默认值的尺寸送进 CSPDarknet 骨干网络提取特征。这一步得到的特征图保留了“哪里有裂缝纹理”的空间信息同时用跨阶段局部连接控制了计算量。第二步特征金字塔 PANet 把浅层的细节信息和深层的语义信息做双向融合小裂缝在 80×80 的特征图上被感知大裂缝在 40×40 甚至 20×20 的特征图上被感知。第三步检测头在每个网格上预设若干锚框回归出每个框的 x、y、w、h 和置信度。这里有个关键概念叫后处理也就是 NMS。一张 640×640 的图上可能同时有十几条裂缝每条裂缝又被多个锚框重复框中NMS 做的事是剔除低置信度的框、合并重叠度高的框最后只保留最可信的那组结果。你日常调参时改的 conf-thres 和 iou-thres作用于的正是这一环节conf-thres 控制“置信度低于多少就不显示”iou-thres 控制“两个框重叠多严重就合并”。裂缝检测里 IO U 阈值一般不建议调得太高细长目标的重叠框本来就比普通目标多。2.2 项目目录拆解哪些文件是核心哪些别乱动解压这份资源后你会看到一个典型的 YOLOv5 工程结构。我按重要程度把它拆成三组。第一组是“跑通推理必须的”路径作用备注weights/存放训练好的模型权重一般放best.pt或last.pt也可能有yolov5s.pt等官方预训练权重detect.py主推理脚本支持单张图、文件夹、摄像头、视频流多数据源detect_photo.py简化版图片推理入口把常用参数写死适合新手直接改路径调用detect_camera.py摄像头实时推理入口接 USB 摄像头或 RTSP 流models/网络结构定义目录yolov5s.yaml、yolov5m.yaml、yolov5l.yaml等data/数据集配置与超参配置包含coco.yaml、voc.yaml、coco128.yaml和hyp系列文件第二组是“重新训练才用得上的”路径作用备注data/hyp.scratch.yaml从头训练的默认超参文件学习率、动量、损失权重都在这data/hyp.finetune.yaml微调场景的超参文件迁移学习时用学习率策略更稳runs/训练和推理的输出目录作者之前跑过的检测结果和训练曲线可能还在里面第三组属于扩展内容Dockerfile说明支持容器化部署hubconf.py说明模型可以走 PyTorch Hub 方式加载export.py负责把模型导出成 TorchScript、ONNX 或 TensorRT 格式。这里提醒一句models/目录下的 yaml 文件描述的是网络结构不是训练配置不要和data/下的 yaml 搞混。改模型的深度和宽度靠前者改数据路径和类别数靠后者。我第一次用 YOLOv5 时想把类别数改成 1结果去改了yolov5s.yaml训练报错报了半天才反应过来。2.3 识别逻辑在代码里怎么走detect.py 主流程读完文件清单再走一遍推理代码的主流程你之后排查问题会快很多。核心逻辑集中在detect.py里的run()函数它做五件事。# 伪代码理解主流程即可不必逐行背 # 1. 加载模型 model DetectMultiBackend(weights, devicedevice) # 支持 .pt/.onnx/.engine model.eval() # 2. 读取数据源图片/文件夹/摄像头/视频 dataset LoadImages(source, img_sizeimgsz, stridestride) # 3. 逐帧推理 for path, img, im0s, vid_cap in dataset: im letterbox(img, new_shapeimgsz)[0] # 等比例缩放不足部分补灰边 im im.transpose((2, 0, 1))[::-1] # HWC - CHW, BGR - RGB im torch.from_numpy(im).to(device) im im.half() if half else im.float() # 半精度推理速度快但精度略降 pred model(im, augmentFalse, visualizeFalse) # 前向传播 pred non_max_suppression( # NMS 后处理 pred, conf_thres, iou_thres, classes, agnostic_nms ) # 4. 画框并保存结果 annotator.box_label(xyxy, label, colorcolors) cv2.imwrite(save_path, im0s) # 5. 输出到 runs/detect/exp 目录并打印耗时信息代码里第一步的DetectMultiBackend是启动入口它在models/common.py里定义支持自动识别权重格式。如果你换了一个.onnx模型入口代码不用动它会自动走 ONNX 的加载分支。第 3 步中的letterbox是 YOLOv5 很讲究的一个细节大部分检测框架直接 resize而 YOLOv5 是等比例缩放后补灰边这样不会把细长的裂缝拉伸变形保持原始宽高比。你推理时看到图片两侧有灰色条带那是正常的不是 bug。第 4 步的non_max_suppression就是 2.1 节说的后处理参数agnostic_nms值得留意它设置为 True 时不同类别的框也会互相参与合并。在裂缝检测里类别通常只有一种开不开影响不大如果项目里混了裂缝、坑槽、修补痕迹多个类别建议保持默认 False否则不同类别靠太近时会被误合并掉。3. 环境搭建与权重下载半小时跑起第一个推理3.1 Python 环境与依赖安装YOLOv5 对 Python 版本不算挑剔Python 3.8 到 3.10 都能跑但建议尽量用 3.9 或 3.10。太老的版本比如 3.6PyTorch 新版已经不再支持太新的 3.12 刚出来时部分依赖如 PyYAML 的编译安装容易出问题。我自己习惯用 conda 单独建一个虚拟环境避免把系统 Python 搞乱。# 创建并激活虚拟环境任选一种方式 conda create -n yolov5 python3.9 -y conda activate yolov5 # 进入项目根目录后安装依赖 pip install -r requirements.txtrequirements.txt里列出了 torch、torchvision、opencv-python、pyyaml、matplotlib 等核心库。这里有个常见的翻车点如果你机器上已经装过 PyTorch并且版本和 YOLOv5 代码不匹配直接执行pip install -r requirements.txt可能不会自动升级 torch因为依赖关系里写的是torch1.7.0。我建议先确认 torch 版本python -c import torch; print(torch.__version__)如果是 2.x 基本没问题代码没做版本强校验。如果需要在 GPU 上跑torch 要装 CUDA 版本pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118命令里的 cu118 对应 CUDA 11.8具体按你的显卡驱动版本选。3.2 模型权重从哪来download_weights.sh 与路径检查这个项目的weights/目录下除了预训练好的裂缝模型还放着一个download_weights.sh脚本这个脚本是给官方 COCO 预训练权重准备的。简单说这份资源有两种“权重来源”裂缝检测专用权重weights/best.pt或类似命名是作者在裂缝数据集上训练出来的结果直接用于推理路面、桥梁、墙体裂缝。COCO 预训练权重yolov5s.pt这类官方权重用于迁移学习——比如你想在自己的数据集上重新训练拿它做初始化收敛速度会比随机初始化快得多。如果打开weights/目录发现没有.pt文件先别急着重下整个压缩包运行一下下载脚本# 在项目根目录执行 bash weights/download_weights.sh这个脚本本质上是去官方仓库下载对应尺寸的 pt 文件。网络不好的情况下容易中断常见做法是手动下载后再放到weights/目录下。判断权重是否加载成功的标准是运行detect.py时日志里会出现模型参数数量的提示比如加载 yolov5s 时会打印出大约 702 万参数。如果日志里没有那行“N params”说明加载路径有问题。3.3 第一次运行 detect.py参数怎么给、结果怎么看环境就绪、权重就位之后先跑一张测试图验证整条链路通不通。项目里有data/images目录里面放了示例图片正好用来做首次验证。python detect.py --weights weights/best.pt --source data/images --conf-thres 0.25 --iou-thres 0.45 --project runs/detect --name demo结果输出在runs/detect/demo/目录下同时终端会打印出每张图耗时、检测到的目标数量和类别。--name demo这个参数是给本次任务起名字下次换一个名字就不会覆盖上一次的结果。主要的推理参数有个 5 分钟就能记完的清单参数默认值说明--weightsyolov5s.pt模型权重路径--sourcedata/images数据源支持图片、文件夹、视频、摄像头索引--conf-thres0.25置信度阈值低于此值的检测框被丢弃--iou-thres0.45NMS 的 IoU 阈值--imgsz640输入图片尺寸会被 letterbox 到该尺寸--devicecpu默认自动指定0表示第一块 GPUcpu表示纯 CPU 推理--save-txt不开保存检测结果的坐标 txt后续做批量处理用得上--projectruns/detect结果输出父目录--nameexp结果输出子目录名重名时自动加序号第一次跑的时候如果你是 CPU 推理裂痕图片大概需要 1 到 3 秒一张这个是正常速度。如果一张图超过 10 秒检查一下是不是误用了大模型yolov5x在 CPU 上跑非常吃力一般 CPU 推理用yolov5s就够了。4. 训练自己的裂缝数据集标注、改配置、跑 train.py4.1 数据标注YOLO 格式与目录组织用现成权重做推理只是第一步真要用于毕设或者项目交付几乎一定会遇到“我有一批自己拍的裂缝照片想让它认得更准”的需求。这时候就得走训练流程。YOLOv5 的数据标注格式是业界通用的 YOLO 格式一张图配一个同名的.txt文件每行代表一个目标五个数字用空格隔开class_id x_center y_center width height 0 0.5352 0.4123 0.1832 0.0945重点是后四个数全部是归一化坐标除以了图片宽高取值范围 0 到 1。比如图片宽 2000 像素、高 1500 像素某条裂缝的中心点在 x1070、y618 的位置框宽 366、高 142那么 txt 里就写0 0.535 0.412 0.183 0.0947。标注工具用 labelImg 或者 labelme 都行导出时选择 YOLO 格式即可。这里有个容易翻车的细节有的工具默认导出的是 VOC 格式的 xml要做一次格式转换转的时候小心边界情况比如 w 小于 0、x_center 超出 0~1 范围。目录结构按 YOLOv5 的标准组织方式建datasets/ ├── crack/ │ ├── images/ │ │ ├── train/ # 训练集图片 │ │ └── val/ # 验证集图片 │ └── labels/ │ ├── train/ # 与 images/train 一一对应的 txt │ └── val/注意 images 和 labels 下目录名要一致而且每一张图必须在对应的 labels 里有同名 txt没有目标的图片可以放一个空 txt 文件但不能缺失文件本身否则程序读取会报错。4.2 配置文件修改data yaml 与两个 hyp 的区别训练前需要新建一个自己的数据集配置文件放在data/目录下内容参考项目自带的coco128.yaml。# data/crack.yaml train: datasets/crack/images/train val: datasets/crack/images/val nc: 1 # 类别数这里只有裂缝一类 names: [crack] # 类别名和标注时的一致nc和names必须和标注工具里的对应少了一类别物、顺序乱了训练时 loss 会莫名其妙地高。超参配置方面项目里data/hyp.scratch.yaml和data/hyp.finetune.yaml我建议按下面场景二选一不要混用对比项hyp.scratch.yamlhyp.finetune.yaml适用场景从零训练用预训练权重微调初始学习率较高如 0.01较低如 0.001训练速度慢快数据量要求数据量大才有好效果少量数据也能收敛典型用途新数据集 有钱有卡毕设、课程设计、小样本裂缝检测这种场景绝大多数人手上的标注数据不会超过几千张直接用hyp.finetune.yaml做微调更靠谱。我见过有人拿 scratch 超参去训 500 张的裂缝图训练到第 50 个 epoch loss 还在震荡换成 finetune 之后 30 个 epoch 就稳定了。4.3 训练命令与关键超参说明配置做完训练命令如下python train.py \ --data data/crack.yaml \ --weights weights/yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --imgsz 640 \ --hyp data/hyp.finetune.yaml \ --name crack_exp几个参数值的依据解释一下。--weights传yolov5s.pt是做迁移学习的标准做法模型会加载 COCO 预训练权重只替换最后一层的类别头去适配你的单一类别。--batch-size 16是 8GB 显存的常见选择显存小于 6G 就降到 8实在不够还能用--batch-size 4 --accumulate 4的组合效果相当于每步攒 16 张图再更新一次梯度。--epochs取 100 是个均衡值裂缝检测目标形状单一微调场景下 100 个 epoch 足够收敛多于 200 个就有过拟合风险了。训练日志里重点看两个指标box_loss和obj_loss。裂缝是小目标obj_loss下降得比box_loss慢是正常的。等训练完后最佳权重自动存在runs/train/crack_exp/weights/best.pt不要拿last.pt去部署last 是最后一个 epoch 的权重可能会因为训练尾部震荡而浮点精度略差。跑训练时还有两个 YOLOv5 超参数值得你在hyp.finetune.yaml里手动调一下比默认值更适合裂缝场景# data/hyp.finetune.yaml 中推荐调整的部分 lr0: 0.0008 # 初始学习率 lrf: 0.2 # 学习率衰减到初值的比例 anchor_t: 4.0 # 锚框长宽比阈值增大对细长目标有容忍度裂缝的长宽比经常超过 10:1默认anchor_t: 4.0对太长的裂缝会筛掉部分锚框调大到 5.0 或 6.0 能让模型对细长裂缝更敏感但要付出一点训练周期的代价。先按 5.0 试看 mAP 有没有提升。5. 裂缝检测避坑清单四个高频问题与处理5.1 权重路径报错现象运行detect.py时提示FileNotFoundError: weights/best.pt does not exist或者类似No such file or directory。原因压缩包解压后weights/目录里其实没有.pt文件只有下载脚本下载脚本没跑成功或者手动下载的权重放错目录了。解决先执行bash weights/download_weights.sh脚本会从云端拉取权重文件。如果网络不稳定把脚本里的下载链接复制到浏览器手动下载完成后放到weights/目录确认文件名拼写一致best.pt和last.pt大小应该在几 MB 到几十 MB 之间。这个坑占了 YOLOv5 项目一半以上的报错权重文件缺失不算项目问题属于分发时的常见行为。5.2 Python 环境报错集中在 torch 版本不匹配现象detect.py运行到import torch后报某个函数参数错误比如TypeError: forward() got an unexpected keyword argument training或者 pyyaml 加载 yaml 时报语法错。原因PyTorch 版本跨了太大跨度。老版本 YOLOv5 代码对 torch 1.7 到 2.x 的兼容性总体还行但如果你装了 0.x 的 torchvision或者 Python 3.12 上装了最新 torch 而代码里某些调用已经在新版 torch 中被移除就会踩雷。解决干净做法是删掉当前虚拟环境重建pip install -r requirements.txt直接装不要单独手动装 torch。装完用python -c import torch, torchvision; print(torch.__version__, torchvision.__version__)确认版本torch 2.0 以上配 torchvision 0.15 以上是稳妥组合。如果项目里用到hubconf.py走 PyTorch Hub 加载注意 Hub 缓存目录里也可能残留旧权重导致冲突清一下~/.cache/torch/hub再试。5.3 训练时显存不足CUDA out of memory现象train.py 刚进第一个 iteration 就报RuntimeError: CUDA out of memory或者训练到一半崩掉。原因显存占用主要由 batch-size、imgsz、模型宽度三个因素叠加产生。裂缝图片分辨率经常是 4000×3000 的原始巡检照片有人直接以原图尺寸设置--imgsz 1280一张图就把 8GB 显存吃满了。解决把--imgsz降回 640--batch-size从 16 降到 8再不行降到 4。如果必须用大图训练打开train.py里--rect参数让程序按图片宽高比动态批次组合减少同一批次内的冗余 padding。记住一句判断口诀batch-size导致的 OOM 通常在训练一开始就爆imgsz导致的 OOM 通常会在中途换到高分辨率阶段才爆根据爆的时间点反推先调哪个参数。5.4 检测效果差漏检多、框不准问题不一定在模型现象推理能跑通但对细裂缝漏检严重或者框画得比实际裂缝宽很多。原因三种可能。第一--conf-thres设得太高比如 0.5一条小裂缝的置信度只有 0.35 就被滤掉了。第二训练时imgsz和推理时imgsz不一致比如训练用 640、推理用 1280模型在两种尺度下提取的特征错位。第三权重是在别人数据集上训的你的裂缝场景光照、拍摄距离差别太大迁移性不足。解决先把推理的conf-thres降到 0.1 看原始输出如果 0.1 能检测出来而 0.25 检不出来说明模型本身没问题是阈值卡得太紧。如果 0.1 也不行检查推理imgsz是否和训练时一致。训练巡检照片时用 640 推理就够不要盲目加大。最后再考虑用你自己的数据微调权重Q 场景不匹配时微调 30 个 epoch 比调参有用得多。5.5 数据标注比例失衡裂缝类别计数对不上现象训练开始时报AssertionError: train: No labels in ...或者训练日志里显示类别统计为 0。原因images/train下的图片和labels/train下的 txt 文件对不上号。可能图片是 JPG 后缀、标签文件是 JPEG 后缀生成出来而工具没识别出来也可能标注工具输出的 class_id 比你 yaml 里定义的nc还大。解决写一个十几行的脚本检查每张图有没有同名 txtimport os img_dir datasets/crack/images/train label_dir datasets/crack/labels/train for f in os.listdir(img_dir): stem os.path.splitext(f)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): print(f标签缺失: {f})跑完脚本后把缺失的标签补上或用代码批量生成空 txt。这一步值得养成习惯每次训练前先跑一遍能省下至少半天的排错时间。6. 推理侧的两个常用动作批量处理与摄像头实时检测如果训练好权重后只是单张图跑我觉得还没完全发挥这份源码的价值。项目里的detect_photo.py和detect_camera.py是两条更贴近实际应用的入口。detect_photo.py适合批量目录处理。它的内部逻辑和detect.py几乎一样只是把参数封装成了固定值你只需要改文件里source和weights两个变量就能跑。实际巡检场景给到的往往不是一两张图而是一整个文件夹上千张巡检照片逐条执行detect.py命令太低效直接改detect_photo.py里的路径变量再一次性运行结果会集中写入runs/detect/每个文件名保留原样后续做 GIS 坐标关联很方便。detect_camera.py走的是实时推理链路。它内部循环读摄像头帧逐帧做前向推理处理完的帧直接推流显示。这里有个性能上的取舍实时推理建议把imgsz从 640 降到 416帧率能提升不少而裂缝这种宽大目标在 416 下损失不明显。用 USB 摄像头测试时如果画面延迟超过 1 秒先看是不是 CPU 推理CPU 实时推理基本都会掉帧有 GPU 的话确认device0参数有没有生效。再补一个导出环节的操作。训练好的best.pt如果要部署到边缘设备比如 RK3568 这类带 NPU 的板子或者 Jetson标准流程是用export.py导出成 ONNX 格式python export.py --weights runs/train/crack_exp/weights/best.pt --include onnx --imgsz 640导出后同目录下会出现best.onnx它不依赖 PyTorch 环境可以被 ONNX Runtime 加载也可以再转成 RKNN 或 TensorRT 格式。从个人经验说YOLOv5 导 ONNX 的坑主要是--dynamic参数动态输入尺寸在 ONNX Runtime 里打开后有些版本会报不支持自定义 op 的错误固定 640×640 输入最省事。这套项目里让我印象最深的其实不是模型精度而是download_weights.sh这个细节——作者把权重分发了和代码分开逼着你理解“权重是模型、代码是骨架”这层关系。从那以后我做类似部署第一件事永远是先看一眼weights/里有没有东西再决定是补下载还是调路径而不是一头扎进调参里。把这些基本动作做成肌肉记忆你在裂缝检测上的试错成本会低很多。希望这篇拆解能帮到你。本文还有配套的精品资源点击获取
返回列表