ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLOv5牛只识别检测实战:从训练到推理的完整工程解析

2026/9/28 17:20:38 拓冰建站 浏览量
YOLOv5牛只识别检测实战:从训练到推理的完整工程解析 简介本资源面向计算机视觉入门与进阶开发者提供一套基于YOLOv5的牛只识别检测完整工程可直接用于畜牧场景的智能计数与目标检测学习。包内共79个文件涵盖py源码、yaml配置、pt权重、pyc缓存、sh脚本及jpg/png可视化图片等压缩包约42.58MB结构清晰便于按模块查阅。资源包含训练脚本、推理脚本、模型权重与使用说明并附有损失值下降曲线、召回率曲线、精确度曲线及mAP等评估指标图迭代200次后模型拟合较好。训练数据为4000多张图片、8000多个“牛”目标分布均匀可帮助读者理解数据标注、模型训练与指标分析全流程。目前已有273人学习适合希望快速复现牛识别检测、研究YOLOv5训练细节或搭建畜牧智能监测方案的中高级开发者参考。1. 牛只识别检测这套 YOLOv5 源码包到底能落地到什么程度养殖场里做牛只盘点、通道计数、发情行为观察最头疼的往往不是算法本身而是从零搭一套能跑通训练、验证、推理的完整链路。这份基于 YOLOv5 的牛识别检测资源包把源码、权重、评估曲线和使用说明一次性打包省掉了自己拼环境、找数据、调参数的重复劳动。它适合两类人一类是刚接触深度学习目标检测、想拿一个真实场景练手的工程师另一类是养殖信息化项目里需要快速验证牛只检测可行性的开发者。包里迭代了 200 次4000 多张图片、8000 多个牛目标数据分布相对均匀模型拟合程度在评估曲线上能直接看出来。换句话说这不是一个只给你看 demo 的玩具而是一份能让你从训练日志一路读到推理结果的完整工程切片。2. 拆开压缩包先看什么目录结构与 YOLOv5 工程约定2.1 从文件清单反推训练流程拿到压缩包别急着python train.py。先花五分钟把目录扫一遍能避开后面很多低级错误。这份资源的顶层结构基本遵循 YOLOv5 官方仓库的约定同时塞进了训练产物和推理脚本。核心目录和文件大致是这样分布的路径作用是否可改yolov5_code/主代码目录含 train、detect、test 等入口可改但注意依赖models/网络结构 yaml 与预训练权重 yolov5s.pt结构文件慎改data/数据集配置与样本图片按自己数据替换runs/训练输出含 exp_cow、results.png 等只读参考weights/训练好的牛检测权重推理直接加载utils/数据加载、指标计算等工具一般不动requirements.txtPython 依赖清单按环境调整使用说明.txt作者写的操作提示先读一遍runs/exp_cow/里那组文件才是这份资源的精华results.png把训练 loss、验证 loss、precision、recall、mAP 画在一张图上opt.yaml记录了本次训练的全部超参hyp.yaml是数据增强和优化器配置labels.png和labels_correlogram.png反映标注分布。很多人下载完只看权重其实opt.yaml和hyp.yaml才是复现训练结果的关键少了它们你连同样的 200 轮都跑不出接近的曲线。2.2 环境依赖与版本对齐YOLOv5 对 PyTorch 和 CUDA 版本比较敏感版本错位最常见的表现是训练能启动但 loss 不下降或者推理时直接报算子不支持。建议先看requirements.txt再用 conda 建一个干净环境。常见做法是# 创建独立环境避免和系统里其他 torch 版本打架 conda create -n cow_yolo python3.8 -y conda activate cow_yolo # 按 requirements 安装torch 单独指定与 CUDA 匹配的版本 pip install torch1.10.0 torchvision0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt这里把 torch 单独拎出来装是因为requirements.txt里通常只写torch1.7pip 会拉最新版而最新版未必兼容你机器上的 CUDA 驱动。参数上python3.8是 YOLOv5 生态里兼容性最好的版本cu113 对应 CUDA 11.3如果你驱动是 11.6 以上换成 cu116 的 wheel 也行。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 再往下走。这一步翻车的概率不低尤其是 Windows 上多个 Python 混用的时候。3. 训练自己的牛只数据从 data 配置到 200 轮迭代3.1 数据集组织与 yaml 配置这份资源自带的数据已经按 YOLO 格式整理好但你要换成自己场里的图片就得理解它的组织方式。YOLOv5 要求每张图片对应一个同名 txt每行是class x_center y_center width height坐标全部归一化到 0 到 1。目录一般长这样data/ images/ train/ val/ labels/ train/ val/ cow.yamlcow.yaml是数据集描述文件内容通常只有几行# 牛只检测数据集配置 path: ../data # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 nc: 1 # 类别数牛只有一类 names: [cow] # 类别名称nc和names必须和标注文件里的 class 索引严格对应。我见过有人标注时把牛写成 1配置里 nc 写 1 但 names 只有 cow训练不报错但推理时所有框都变成背景排查半天。改完 yaml用test.py先跑一遍验证集确认数据加载没问题再开训。3.2 训练命令与关键参数训练入口是train.py这份资源里已经带了opt.yaml说明作者跑过一次完整训练。你要复现或微调命令大致如下# 基于 yolov5s 预训练权重做迁移学习 python train.py \ --weights weights/yolov5s.pt \ --cfg models/yolov5s.yaml \ --data data/cow.yaml \ --epochs 200 \ --batch-size 16 \ --img-size 640 \ --device 0 \ --workers 4 \ --name cow_exp--weights指向预训练权重迁移学习能显著加快收敛尤其牛只数据只有 4000 多张时从零训很容易过拟合。--epochs 200对应资源里说的迭代次数--batch-size 16是 8G 显存左右的稳妥值显存够可以上 32。--img-size 640是 YOLOv5 的默认输入尺寸牛只目标如果普遍偏小可以提到 1280但显存和速度要重新权衡。--workers在 Windows 上建议设 0 或 2设高了容易卡在数据加载。训练开始后终端会打印每轮的 box_loss、obj_loss、cls_loss 和 mAP同时runs/train/cow_exp/下会生成和资源里exp_cow类似的曲线图。3.3 看懂 results.png 里的四条曲线资源里那张results.png是判断模型好坏的直接依据。它一般包含训练 loss、验证 loss、precision、recall、mAP0.5 和 mAP0.5:0.95。看曲线有几个血泪经验训练 loss 一直降但验证 loss 抬头说明过拟合得加数据或加增强precision 高但 recall 低说明模型保守漏检多可以适当降低置信度阈值mAP0.5 到 200 轮还在缓慢爬说明还能再训但收益递减。这份资源说“模型拟合较好”对应到曲线上应该是验证 loss 和训练 loss 没有明显分叉mAP 趋于平稳。你自己训的时候别只盯着最后一个点要看整条曲线的走势震荡剧烈的往往比平稳收敛的更可疑。4. 推理与视频分析detect.py 怎么接摄像头和视频流4.1 单张图片与视频文件推理训练完拿到weights/best.pt推理入口是detect.py。先拿测试图验证# 对单张图片推理保存带框结果 python detect.py \ --weights weights/best.pt \ --source data/images/test_batch0.jpg \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt--conf-thres是置信度阈值低于它的框直接丢弃牛只场景建议 0.25 到 0.4 之间调--iou-thres控制 NMS 合并重叠框的力度牛群密集时调低一点能减少漏检。--save-txt会把检测框坐标存成 txt方便后续做计数或轨迹分析。视频文件同理把--source换成 mp4 路径即可YOLOv5 会逐帧推理并输出带框视频。4.2 接摄像头做实时视频分析要做实时牛只通道计数把--source设成摄像头索引# 0 代表默认摄像头也可填 rtsp 流地址 python detect.py \ --weights weights/best.pt \ --source 0 \ --img-size 640 \ --conf-thres 0.3 \ --view-img--view-img会弹窗实时显示方便调试。如果是网络摄像头常见做法是填 RTSP 地址但延迟和丢帧要看网络质量。实时场景下--img-size建议降到 416 或 320换取帧率--conf-thres适当提高减少误检带来的计数抖动。这里有个容易忽略的点YOLOv5 默认对每帧独立检测没有跨帧 ID 关联要做计数得自己在detect.py输出上接一个简单的跟踪逻辑比如按检测框中心点做最近邻匹配。资源本身没带跟踪模块这是你二次开发时要补的部分。5. 避坑与排查牛只检测里最容易翻车的五件事5.1 现象训练 loss 正常下降但 mAP 一直是 0原因多半出在标注类别和 yaml 配置对不上。YOLOv5 不会因为类别名写错就报错它只按索引读索引对不上时所有预测都被判为背景。解决方法是打开一个 label txt看每行第一个数字再核对cow.yaml里的nc和names确保索引从 0 开始且数量一致。5.2 现象推理时框的位置整体偏移或缩放这是输入尺寸和训练尺寸不一致导致的。训练用 640推理用 1280YOLOv5 内部会做 letterbox但如果你自己改过detect.py里的预处理就容易出问题。解决方法是保持--img-size和训练时一致或者确认推理脚本用的是官方 letterbox 逻辑不要手动 resize。5.3 现象显存溢出batch-size 调到 1 还是 OOM不一定是 batch 的锅可能是--img-size太大或者模型没释放。先降--img-size到 416 试再检查是不是同时开了多个训练进程。另外--workers设太高会让每个 worker 都复制一份数据到内存显存没爆内存先爆。Windows 上把 workers 设 0Linux 上设 4 到 8 比较稳。5.4 现象验证集指标很好实际场景漏检严重典型的数据分布不一致。训练集里牛只大多是侧面、光照均匀实际通道里可能是俯视、逆光、遮挡。解决办法是在hyp.yaml里加大 HSV 增强和随机遮挡的参数或者补拍实际场景图片重新标注。资源里说数据分布均匀指的是类别和框大小分布不代表光照和角度覆盖全这点要自己判断。5.5 现象detect.py 跑视频越来越慢最后卡死常见于--view-img模式下 OpenCV 窗口阻塞或者视频读取线程没释放。先去掉--view-img用--save-txt或--save-conf输出结果再检查是不是视频分辨率太高导致解码跟不上。把视频转成 720p 再跑或者用--img-size 320降推理开销通常能缓解。6. 把评估指标用起来从 results.txt 反推模型边界6.1 用 results.txt 做阈值扫描runs/exp_cow/results.txt里通常记录了每轮的 precision、recall、mAP0.5 和 mAP0.5:0.95。很多人只看最后一行其实这份文件最大的价值是做阈值扫描。你可以写个小脚本把不同 conf 阈值下的 precision 和 recall 拉出来画一条 P-R 曲线找到 F1 最高的那个点。牛只计数场景里漏检比误检代价高所以我会把阈值往 recall 高的方向偏一点哪怕 precision 掉几个点。# 从 results.txt 提取指标粗略找 F1 最优点 import re rows [] with open(runs/exp_cow/results.txt) as f: for line in f: # 匹配类似 0.85 0.72 0.78 0.65 的指标段 nums re.findall(r0\.\d, line) if len(nums) 4: p, r, map50, map95 map(float, nums[-4:]) f1 2 * p * r / (p r) if (p r) else 0 rows.append((f1, p, r, map50)) rows.sort(reverseTrue) print(最佳 F1 组合:, rows[0])这段代码只是示意实际results.txt的列顺序要以文件头为准。逻辑是先算 F1再按 F1 排序找到 precision 和 recall 最平衡的那一轮。参数上nums[-4:]取的是每行最后四个浮点数如果你的文件格式不同得调整切片位置。这个习惯我每次训完新数据都会走一遍比拍脑袋定阈值靠谱得多。6.2 用 labels.png 判断数据是否真的均匀资源里提到“8000 多个目标数据分布均匀”labels.png就是验证这句话的图。它一般包含四个子图类别分布、框中心点分布、框宽高分布。如果框中心点集中在图像中央说明拍摄角度单一如果宽高分布出现明显的双峰说明远近目标混杂。这些都会影响模型在实际场景的泛化。我一般会拿它和labels_correlogram.png一起看后者反映宽高相关性能看出标注是否规范。发现分布偏了别急着加轮数先补数据这是最省时间的做法。从那以后我每次拿到一个新的检测权重都强制先跑一遍验证集、再看一眼labels.png和results.txt确认数据分布和指标边界对得上才敢往实际场景里接。希望这份拆解能帮到你少走一点我当年踩过的弯路。本文还有配套的精品资源点击获取