恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

YOLOv8大豆叶病检测实战:从数据标注到ONNX导出全流程

  • 首页
  • 资讯中心
  • /
  • YOLOv8大豆叶病检测实战:从数据标注到ONNX导出全流程

相关资讯

煤和皮带识别数据集:YOLOv11目标检测实战与训练指南 2026/10/11 16:03:01
MCP Gateway 与本地化架构:单语服务器、将 locale 作为参数、客户端状态 2026/10/11 15:58:01
广告服务商选型评估模型与适配方法解析 2026/10/11 15:58:01

最新资讯

AutoClick鼠标自动点击工具实战:原理、实现与避坑指南
MySQL远程连接配置指南:从bind-address到安全组排查
编译原理实验:词法状态图到LL(1)预测分析表的C++实现
食堂消费系统数据库设计:从数据字典到JDBC的完整课设模板
DNS 与 SSL 证书透明度侦察:Legendary OSINT 收录工具详解
运筹学建模训练闭环:从变量分层到影子价格的实战指南

今日推荐

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

YOLOv8大豆叶病检测实战:从数据标注到ONNX导出全流程

发布时间:2026/10/11 16:03:01
YOLOv8大豆叶病检测实战:从数据标注到ONNX导出全流程 简介这份资源围绕Yolov8在大豆叶病目标检测中的应用展开面向希望系统学习Yolo整体框架构建的深度学习初学者与农业视觉方向开发者。内容涵盖数据采集与预处理、网络架构设计、基于PyTorch的训练流程以及模型部署时的优化与压缩思路帮助读者理解从数据集构建到推理输出的完整链路。压缩包共7个文件以6个Python脚本和1份Markdown说明为主脚本分别承担模型定义、数据加载、损失计算、训练与推理等模块职责说明文档用于梳理项目结构与使用方式整体约9KB轻量便于快速阅读与二次修改。目前已有47人学习下载。通过这份实践案例读者可以掌握Yolov8目标检测项目的目录组织方式、各模块间的调用关系并加深对深度学习在农业植保场景中应用价值的认识。1. 大豆叶病检测这套 YOLOv8 资源到底能不能直接跑起来大豆叶片上的褐斑、霜霉、灰斑这些病害早期靠肉眼分拣基本靠经验等人眼看出成片扩散防治窗口已经过去一半。这套资源给的是一个基于 YOLOv8 的大豆叶病目标检测工程核心价值不在模型本身多新而在于它把 YOLO 整体框架从数据组织、配置解析、训练循环到推理验证这条链路完整摊开了。适合两类人一类是刚接触 yolo 目标检测、想找一个真实农业场景把 yolov8 训练自己的数据集流程走通的新手另一类是想拆开 ultralytics 那套黑匣子、搞清楚 yolo 损失函数和网络结构图到底怎么落到代码里的从业者。它解决的不是识别大豆病这一个问题而是让你拿到一个能改类别、能换数据集、能复现训练曲线的骨架。2. 拆开工程目录YOLOv8 框架构建的四个关键层2.1 目录结构与配置驱动逻辑拿到一个 YOLOv8 工程第一件事不是急着train.py而是先看目录怎么分层。这套资源典型的结构是配置、数据、模型、工具四块分离常见做法是长这样soybean_leaf/ ├── data/ │ ├── images/ # 原图jpg/png 混放 │ ├── labels/ # YOLO 格式 txt与 images 同名 │ └── soybean.yaml # 数据集描述文件 ├── models/ │ └── yolov8n.yaml # 网络结构定义 ├── configs/ │ └── train.yaml # 训练超参 ├── utils/ │ ├── split_dataset.py # 划分 train/val │ └── visualize.py # 画损失曲线、热力图 └── train.py这个分层不是摆设。data/soybean.yaml决定模型去哪找图、类别数是多少models/yolov8n.yaml决定网络深度和宽度configs/train.yaml决定学习率、batch、epoch。三者解耦之后你换数据集只动 yaml换模型只换 yaml不用碰训练代码。很多人上手就把路径写死在 train.py 里结果换一次数据集要改十几处这是最常见的翻车起点。soybean.yaml的内容必须严格对齐path: ./data train: images/train val: images/val nc: 4 names: [healthy, brown_spot, downy_mildew, frogeye]nc是类别数names顺序必须和 label txt 里的类别索引一一对应。索引 0 对应 names 第一个元素错一位整个训练标签就全乱了而且 loss 还会正常下降属于典型的玄学问题。2.2 数据标注格式与划分脚本YOLO 用的是归一化中心点格式每行class x_center y_center width height全部是 0 到 1 的相对值。大豆叶病标注最容易出的问题是框贴太紧把病斑边缘的过渡区切掉模型学到的特征不完整。我一般会让标注框比肉眼病斑外扩 2 到 3 个像素。划分脚本别用随机切同一片叶子可能拍了好几张随机切会导致训练集和验证集出现同一叶片的近重复图验证指标虚高。按叶片 ID 分组切更靠谱import os, random, shutil from collections import defaultdict random.seed(42) src_img data/images src_lbl data/labels # 假设文件名前缀是叶片ID如 leaf012_03.jpg groups defaultdict(list) for f in os.listdir(src_img): if f.lower().endswith((.jpg, .png)): leaf_id f.split(_)[0] groups[leaf_id].append(f) leaf_ids list(groups.keys()) random.shuffle(leaf_ids) split int(len(leaf_ids) * 0.8) train_ids, val_ids leaf_ids[:split], leaf_ids[split:] for phase, ids in [(train, train_ids), (val, val_ids)]: for leaf_id in ids: for f in groups[leaf_id]: stem os.path.splitext(f)[0] shutil.copy(os.path.join(src_img, f), fdata/images/{phase}/{f}) shutil.copy(os.path.join(src_lbl, stem .txt), fdata/labels/{phase}/{stem}.txt)逻辑说明先按叶片 ID 聚合成组再对组做 shuffle 和切分保证同一叶片的所有图只进一个集合。random.seed(42)固定随机性方便复现。参数上 0.8 是训练占比农业小数据集样本少时可以调到 0.85但验证集别低于总组数的 15%否则指标抖动大。2.3 网络结构与损失函数在代码里的落点YOLOv8 的 backbone 是 CSPDarknet 变体neck 用 PAN-FPN 做多尺度融合head 是解耦头分类和回归分支分开。看网络结构图容易落到代码里要盯三个地方models/yolov8n.yaml里的backbone、head段ultralytics/nn/modules里的Conv、C2f、SPPF实现以及 loss 计算里的TaskAlignedAssigner。yolo 损失函数这块YOLOv8 用的是分类 BCE、回归 CIoU 加 DFL 分布焦点损失的组合。DFL 是很多人第一次看会懵的点它不直接回归框的四个值而是回归每个边的离散分布再取期望。好处是小目标边界更稳代价是 head 输出通道变多。你如果改类别数nc改了之后 head 的分类分支通道会自动跟着变但如果你手动改过 yaml 里的channels就要同步检查否则会报维度不匹配。验证网络结构是否被正确解析最省事的办法是打印模型from ultralytics import YOLO model YOLO(models/yolov8n.yaml) model.model.info() # 打印每层类型、输出shape、参数量info()会逐层列出模块名和输出尺寸重点看最后几层 head 的输出通道是不是nc 4 * reg_max量级。如果这里对不上训练一定会在 loss 那步炸掉。3. 从零跑通训练环境、参数与损失曲线3.1 环境配置与依赖版本锁定yolov8 环境配置翻车最多的就是 torch 和 ultralytics 版本打架。常见做法是先用 conda 建独立环境再按 CUDA 版本装 torch最后装 ultralytics不要反过来。conda create -n soy_yolo python3.10 -y conda activate soy_yolo # 按本机CUDA选cu118对应11.8 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics8.1.0 opencv-python matplotlib pyyaml参数说明python 3.10 是当前 ultralytics 兼容性最好的版本torch 2.1.0 配 cu118 在 30 系、40 系卡上都稳。如果你用 gtx1660ti 跑 yolov8显存 6Gyolov8n配batch8、imgsz640基本能跑再大就 OOM。装完先验证import torch print(torch.__version__, torch.cuda.is_available())cuda.is_available()返回 False 就别往下走了先解决驱动和 torch 匹配问题否则训练会静默落到 CPU一个 epoch 跑半小时。3.2 训练参数怎么设才不白跑训练入口用命令行或 python 都行关键是参数别照抄。大豆叶病数据集通常几千张量级属于小数据集学习率和 warmup 要保守。from ultralytics import YOLO model YOLO(models/yolov8n.yaml) model.train( datadata/soybean.yaml, epochs150, imgsz640, batch8, lr00.01, # 初始学习率 lrf0.01, # 最终学习率 lr0 * lrf warmup_epochs3, # 前3轮预热防早期梯度爆炸 weight_decay0.0005, mosaic1.0, # 马赛克增强概率 patience30, # 30轮无提升就早停 device0, projectruns/soy, nameexp1 )逻辑说明lr00.01是 YOLOv8 默认值小数据集可以降到 0.005 更稳lrf控制余弦退火的终点太小后期学不动太大后期震荡warmup_epochs3让学习率从极小值爬升避免第一轮就把预训练权重带偏。mosaic1.0对病斑这种小目标增强效果好但如果你的图里病斑占比本来就大可以降到 0.5否则拼出来的图语义太乱。3.3 损失曲线与指标怎么看训练完runs/soy/exp1/下会有results.csv和results.png。yolov8 画损失函数曲线图不用自己写但要看懂三条线train/box_loss、train/cls_loss、train/dfl_loss。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/soy/exp1/results.csv) df.columns df.columns.str.strip() plt.plot(df[epoch], df[train/box_loss], labelbox) plt.plot(df[epoch], df[train/cls_loss], labelcls) plt.plot(df[epoch], df[train/dfl_loss], labeldfl) plt.xlabel(epoch); plt.ylabel(loss); plt.legend() plt.savefig(loss_curve.png, dpi150)判断标准box_loss 和 dfl_loss 应该同步下降如果 box 降但 dfl 平说明框位置在学但边界分布没收敛通常是 reg_max 或学习率问题cls_loss 后期如果反弹多半是过拟合看验证集 mAP 是否同步掉。验证指标重点看metrics/mAP50-95大豆叶病这种类间差异小的任务mAP50 能到 0.85 以上就算可用别只盯 mAP50。4. 推理、可视化与踩坑排查4.1 推理脚本与热力图可视化训练完拿best.pt做推理别用最后一轮的last.pt除非你确认没早停。推理脚本要处理单图和批量两种情况from ultralytics import YOLO import cv2 model YOLO(runs/soy/exp1/weights/best.pt) results model.predict( sourcedata/images/val, conf0.25, # 置信度阈值 iou0.45, # NMS IoU阈值 imgsz640, saveTrue, projectruns/predict ) # 单图热力图看模型关注区域 for r in results[:1]: img r.plot() # 带框可视化 cv2.imwrite(pred_vis.jpg, img)参数说明conf0.25是召回和精度的平衡点漏检多就降到 0.15误检多就升到 0.4iou0.45控制 NMS 合并病斑密集时调低到 0.4 能减少粘连框被误删。yolov8 可视化热力图需要额外挂 Grad-CAM 类钩子常见做法是拿 backbone 最后一层特征做加权判断模型是不是真的在看病斑而不是叶片边缘。4.2 避坑与常见问题排查现象一训练 loss 正常下降但验证 mAP 一直是 0。原因九成是 label 路径或类别索引对不上。YOLO 找不到 label 会当负样本处理loss 照样降。解决跑一遍utils/verify_labels.py检查每张图是否有同名 txttxt 里 class 索引是否小于nc。现象二报RuntimeError: shape mismatch在 head 层。原因是你改了nc但模型 yaml 里 head 的通道没同步或者加载了旧权重的best.pt去训新类别。解决改nc后重新从yolov8n.yaml初始化不要 resume 旧权重确认model.model.info()里 head 输出通道匹配。现象三显存够但训练中途 OOM。原因是mosaic增强在 dataloader 里拼图峰值显存比单图高。解决把batch降到 4或workers从 8 降到 4或mosaic0.5。gtx1660ti 这类 6G 卡尤其要注意。现象四推理框位置对但类别全错。原因是names顺序和训练时不一致或者 label 生成时类别映射表换了。解决把训练时的soybean.yaml和推理时的names逐字比对顺序必须完全一致。现象五mAP 虚高换一批图就崩。原因是数据划分时同一叶片进了训练和验证。解决回到 2.2 的分组划分按叶片 ID 切别按图随机切。5. 进阶把大豆叶病模型导出 ONNX 并验证一致性训练跑通只是第一步真正落地要过导出和部署这关。YOLOv8 导出 ONNX 一行命令但导出后精度掉点、框偏移是高频问题这里给一套验证流程。from ultralytics import YOLO model YOLO(runs/soy/exp1/weights/best.pt) model.export( formatonnx, imgsz640, opset12, # 12兼容性最好 simplifyTrue, # 简化计算图 dynamicFalse # 固定输入尺寸部署更稳 )参数说明opset12在多数推理引擎上支持最全别盲目上 17simplifyTrue会跑 onnx-simplifier能去掉冗余节点但偶尔会改掉某些算子行为导出后必须验证dynamicFalse固定 640 输入如果你要变尺寸推理再开 dynamic但很多边缘设备对动态轴支持差。导出后做一致性验证用同一张图分别跑 pt 和 onnx比对输出import numpy as np import onnxruntime as ort from ultralytics import YOLO img data/images/val/leaf012_03.jpg pt_out YOLO(runs/soy/exp1/weights/best.pt)(img)[0].boxes.data.cpu().numpy() sess ort.InferenceSession(runs/soy/exp1/weights/best.onnx) # 预处理要和训练一致resize 640、归一化、NCHW import cv2 im cv2.resize(cv2.imread(img), (640, 640)) im im[:, :, ::-1].transpose(2, 0, 1)[None].astype(np.float32) / 255.0 onnx_out sess.run(None, {sess.get_inputs()[0].name: im})[0] print(pt boxes:, pt_out.shape, onnx out:, onnx_out.shape)验证标准pt 和 onnx 的框数量、类别、置信度差异在 1e-2 量级内算正常超过说明导出过程改了算子语义常见于simplify把 SiLU 或 Concat 合并出错。这时候关掉 simplify 重导一次对比。导出到部署这条链上rk3588 部署 yolov8 是现在问得最多的场景核心是把 onnx 再转 rknn量化时校准集要覆盖各种病斑尺度否则小病斑量化后直接消失。t4 上 1080p 25 帧用 tensorrt 跑 yolo 640 分辨率单卡大概能撑十几路具体路数取决于 batch 和精度这个得实测别信理论值。从那以后我每次导出模型都强制走一遍 pt 和 onnx 的同图比对哪怕只差一个框也要查到底因为部署端的玄学问题八成都能在导出这步提前暴露。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号