新闻详情

新闻详情

首页 / 资讯中心 / 详情

改进YOLOv5的烟叶病害检测:从环境搭建到注意力机制落地全流程

发布时间:2026/9/29 2:31:11来源:尧图网络
改进YOLOv5的烟叶病害检测:从环境搭建到注意力机制落地全流程
简介一份围绕基于改进YOLOv5的烟叶病害检测系统打造的PPT演示文稿面向计算机视觉与深度学习方向的学生、研究人员特别适合正在做目标检测课题或农业病害识别项目的人群。内容从烟叶病害的经济重要性切入分析传统诊断方法无法及时准确识别病害种类的问题随后系统介绍基于嵌套式YOLOv5的识别方法涵盖数据集采集与标注、YOLOv5环境搭建、训练与识别效果、系统整合等完整流程同时梳理了YOLO算法改进方向如优化函数选用、激活函数调整、损失函数对比以及网络结构修改为论文选题和算法优化提供具体参考。资源包含1个PPTX格式文件压缩包大小约10.34MB便于下载后直接查看或二次编辑。目前已有3118人学习下载适合作为课程答辩、技术分享或项目汇报的素材。通过这份演示文档读者可以快速掌握烟叶病害检测从数据准备到模型部署的关键环节还能借鉴其中关于YOLOv5改进的细节分析例如Adam与SGD的适用场景、Leaky-ReLU与Mish的区别、GIOU与CIOU损失差异等整体内容较为完整具有较高的参考价值。1. 烟叶病害检测为什么要用改进YOLOv5这套PPT能帮你避开什么在田间转一圈拍一百张烟叶照片容易难的是让计算机像植保员一样一眼扫过去就报出每片叶子上有几个病斑、病斑是什么类型。这个需求落到工程上就是基于改进YOLOv5的烟叶病害检测系统整条链路环境搭建、数据集采集与标注、模型训练、系统整合。这套PPT把四步全部拆开讲还给了明确的研究方向——嵌套式YOLOv5和迭代式数据采集。PPT适合两类人一类是做Python与深度学习方向课程设计或毕业论文的学生一类是农业信息化项目里要验证“目标检测能不能用”的工程师。它不重复讲算法原理的皮毛而是把怎么从一张烟叶图片走到一个可用的检测系统的路径完整串起来。2. 环境搭建与数据准备从零到标注完第一批烟叶图像2.1 YOLOv5环境搭建Python、PyTorch与CUDA的选型和验证PPT里的第一步就是YOLOv5环境搭建熟悉的人可能跳过但我建议照做一遍。我复现时的习惯是先用conda开一个独立环境别直接往系统Python里装依赖否则装到后面某个包把环境搞坏了想回退都麻烦。conda create -n yolo python3.9 -y conda activate yolo git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt这段命令做的事是创建名为yolo的Python 3.9虚拟环境克隆YOLOv5官方仓库再安装requirements.txt里的全部依赖。Python版本在3.8到3.10之间都可以别一上来装最新的3.13很多依赖还没适配。requirements.txt会自动装一个匹配当前环境的PyTorch但如果你的机器有NVIDIA显卡建议先单独装CUDA版PyTorch再接后面的依赖安装。pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt第一行指定了PyTorch的CUDA 11.8版本这个版本兼容目前大多数20系、30系、40系显卡。第二行继续装YOLOv5需要的其余依赖。注意两行命令的执行顺序不要反先装PyTorch再装requirements能避免torch版本反复变更带来的问题。装完环境验证三步import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU mode)这段代码只做三件事确认torch版本、确认CUDA是否可用、打印GPU型号。cuda.is_available()返回True说明后面可以正常走GPU训练。如果返回False先别急着调代码大概率是PyTorch装成了CPU版或者显卡驱动版本太老。驱动版本在系统设备管理器里就能看到对照着换一个合适版本的PyTorch即可。环境配置是整套系统里最不该玄学的地方只要版本对得上一次就能过。2.2 烟叶病害数据采集用迭代思想把数据集越攒越准PPT里反复强调“基于迭代思想的数据集采集、标注、训练”这句话落地下来是一个三步循环。先采集几百张烟叶病害图手动标注训练出第一版模型再用这个初版模型去筛后续新采集的图片把模型漏检和误检的挑出来补标最后带着新数据重新训练。这样做比一次性标几千张要省力因为模型会主动把难例“选”出来。我实际跟项目时第一版数据往往只有300到500张跑通整个链路后再逐步扩充。采集时要注意覆盖几种变化光照晴天、阴天、拍摄角度俯拍、侧拍、生育期团棵期、旺长期、成熟期。病斑要有早期小米粒大小的斑点也要有后期连片的大病斑背景里可以有田垄、杂草、滴灌带别只拍干净背景下的单片叶子。这些看起来像杂质的背景恰恰是让模型学会泛化的关键。我一般安排现场人员用手机拍一个病害先拍200到300张保底能用再追加。类别也不要一上来定义太多常见烟叶病害里选两三种主要的先做比如赤星病、花叶病、黑胫病。类别多了标注成本和类别间误检都会成倍增加。2.3 labelimg标注烟叶病害格式规范与检查清单标注工具用的是labelimg命令行安装pip install labelimg labelimg打开界面后用Open Dir选中图片目录Change Save Dir选中标签输出目录然后在File菜单里把标注格式切到YOLO。左侧列表里可以新建类别画框时按W键开始拖出包含完整病斑的矩形存盘后每张图片会生成一个同名txt文件。注意YOLO格式的txt不存图片路径只存归一化后的坐标都是小于1的小数。标注不是画完就结束了我每次都会用一段小脚本批量检查import os label_dir labels/train for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: lines fp.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f, illegal line:, line)这段脚本遍历标签目录里所有txt逐行检查是不是恰好5个字段。YOLO格式一行必须是类别id、中心点x、中心点y、框宽、框高。多一个少一个字段训练时就会报错而且报错信息很隐蔽如果直接开训可能要到中途才崩。标签文件本身也要做一次漏标检查。常见做法是把标注框叠加回图片上人工过一遍或者用一个可视化脚本把全部标注画出来。漏标小病斑是新手最容易出的问题人眼看到小斑点容易忽略但模型会把每个漏标的小框当成背景学习最后推理时就漏检。数据集的目录结构建议固定成下面这样之后所有配置都不用来回改datasets/smoke/ images/ train/ val/ labels/ train/ val/train和val下都放图片和标注val用来做验证集。比例我一般按9比1切图像总量少时也可以8比2。切分时按文件夹随机抽不要只抽某一类病害否则验证集和训练集分布不一致mAP会虚高。最后是训练必须的数据配置train: /home/your_name/datasets/smoke/images/train val: /home/your_name/datasets/smoke/images/val nc: 3 names: 0: brown_spot 1: mosaic_virus 2: black_shanktrain和val填的是图片目录的绝对路径nc是类别总数names是类别名。names的顺序必须和标注txt里的类别id严格对应顺序乱了训练出来的模型输出类别名就全错了。这样一来数据部分就齐了。环境、图片、标注、配置文件都有了下一步就是真正把模型训起来。3. 训练与识别效果让模型学会数清每片叶子的病斑3.1 训练前配置三件套数据yaml、模型yaml和预训练权重训练前要准备好三样东西。第一样是上一章写好的数据yaml第二样是模型结构配置yaml第三样是预训练权重。模型配置用yolov5s.yaml起步就够显存不超过6G就用yolov5n.yaml显存充足追求精度再上yolov5m。我在烟叶病害这种类内差异大的场景里一般先用yolov5s跑通确认数据没有大问题再考虑换更大的模型。预训练权重直接下载官方yolov5s.pt这一步不要省。烟叶病斑的边缘纹理与coco数据集里的物体有很多相似的低层特征用预训练权重做初始化比从零训练少花一半时间收敛也更稳。3.2 train.py训练命令与核心超参数优化器怎么选训练命令python train.py --data data/smoke.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --img 640 --batch-size 16 --epochs 100 --optimizer Adam参数含义和我的建议参数含义建议--data数据集yaml路径填上一步创建的smoke.yaml--cfg网络结构配置初跑用yolov5s.yaml--weights预训练权重官方权重或自定义best.pt--img输入图像尺寸640默认小目标多可调640以上但显存吃紧--batch-size每批图像数8G显存建议8到16--epochs训练轮次100起步数据小可减到80--optimizer优化器小数据用Adam大数据用SGDPPT里专门对比了Adam和SGD。YOLOv5默认是SGD但作者也提供了Adam超参模板。我的实际体验是自定义数据在2000张以内Adam明显省心前期loss掉得快不容易出现那种训练了好几轮还没动作的尴尬数据量上万后SGD的泛化更好。多跑几个项目后我养成了一个习惯先用Adam训80轮看数据和标注有没有问题确认没问题再换SGD从头训100轮出最终权重。超参数文件也要看一眼。YOLOv5把数据增强和优化器参数放在了data/hyps/hyp.scratch-low.yamllr0: 0.01 mosaic: 1.0lr0是初始学习率训练时如果loss震荡把lr0改成0.001再训。mosaic是马赛克增强属于YOLOv5对小目标检测很有用的数据增强手段PPT里也特意提了它对小目标的优势。烟叶早期病斑这种小目标mosaic保持默认开着就行。训练日志、权重和曲线都会输出到runs/train/exp*目录。每个epoch结束会自动保存last.pt和best.ptbest.pt是按验证集mAP挑出来的最优权重最后部署用的就是它。如果不小心关掉了终端训练权重还在last.pt里用--weights last.pt --resume可以直接续训不用从头开始。3.3 效果验证从results.csv到单张图片推理训练结束后用pandas看收敛指标import pandas as pd df pd.read_csv(runs/train/exp/results.csv) print(df[[metrics/precision, metrics/recall, metrics/mAP50]].tail(5))results.csv里每行是一个epoch的指标。metrics/precision是查准率metrics/recall是查全率mAP50是IoU阈值0.5下的平均精度均值。这三个值一起看后3到5轮的数值就是最终能力。如果mAP50能到0.8以上对烟叶病害检测来说已经可以落地试用了如果一直在0.5附近徘徊多半是标注漏检或者类别定义有问题回头查数据比继续调参更值得。指标没问题再跑一次推理看实际效果python detect.py --weights runs/train/exp/weights/best.pt --source test_images/ --conf-thres 0.5--source可以接图片、图片目录或视频文件我通常单独建一个test_images目录放没参与训练的照片。--conf-thres是置信度阈值默认0.5。病斑目标小的场景可以降到0.3代价是会多一些误检框。PPT里描述的理想效果是“每一片烟叶的病害种类、位置和数量都清晰标注在叶片上”detect.py输出的是画好框的图片位置和种类能看到数量需要另算。这部分我在系统整合那一章接着讲。PPT里提到的嵌套式YOLOv5我理解是在整图检测模型之外再挂一个精细分类模型第一个模型在整图上框出疑似病斑区域第二个模型对这些裁剪区域做二次判别一个负责“找得准”一个负责“认得准”。烟叶早期病斑小且形态接近单模型直接输出所有病害类别时容易压不住分类噪声拆成两级反而更好调。如果你手头数据里整株大图多、单片小图少这个思路尤其值得试。4. 系统整合与选型细节从两个损失函数到整套检测服务4.1 把检测模型封装成接口从命令行到Flask服务训练完的best.pt不是一个裸权重文件它带着模型结构加载它可以直接推理import torch model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/exp/weights/best.pt, force_reloadTrue) results model(test_images/smoke_01.jpg) df results.pandas().xyxy[0] print(df[[xmin, ymin, xmax, ymax, confidence, class, name]])torch.hub.load会从本地YOLOv5仓库加载推理模型custom参数指定本地训练出的权重。返回结果的pandas表格里每一行是一个检测框xmin、ymin、xmax、ymax是像素坐标confidence是置信度name是类别名。这个表格就是系统整合的接缝——前端、数据库、巡检报告都需要它。PPT里说的系统整合落到代码层面就是把这个加载过程包成一个对外接口。我在项目里最常用的方式是Flaskfrom flask import Flask, request, jsonify import torch from PIL import Image model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/exp/weights/best.pt, force_reloadTrue).eval() app Flask(__name__) app.route(/detect, methods[POST]) def detect(): img Image.open(request.files[file].stream) results model(img) data results.pandas().xyxy[0].to_dict(records) return jsonify(data) if __name__ __main__: app.run(host0.0.0.0, port5000)这段代码注册了一个/detect路由调用方用POST上传一张图片服务返回JSON数组数组里是每个病斑的坐标、类别和置信度。返回的数据可以直接被前端在图片上画框也可以写入数据库做病害统计。需要注意model实例要全局只加载一次不要写进函数里每次请求都重复加载否则显存会被一路吃满。4.2 损失函数与激活函数GIOU、CIOU、LeakyReLU与Mish怎么选PPT里对损失函数的对比值得细看。两种边界框损失一个叫GIOU一个叫CIOU。CIOU在GIOU的基础上多考虑了中心点距离和宽高比收敛速度更快最终精度也略好。YOLOv5代码里切换它只需改utils/loss.py里的一行# utils/loss.py 里常见的边界框损失计算 iou bbox_iou(pbox.T, tbox[i], x1y1x2y2False, CIoUTrue) # 要用GIOU时改成 CIoUFalse, GIoUTruebbox_iou函数内部根据参数选择不同损失公式CIoUTrue走CIOU分支。我的建议是默认保持YOLOv5的原样因为官方权重就是按这个损失函数调好的只有当实验结果明确显示框回归不准时再换成CIOU做对比实验。激活函数方面PPT提到YOLOv5中间层用LeakyReLU、检测层用SigmoidYOLOv4的CSPDarkNet里用Mish。这个表述基于当时分析所见的版本现在YOLOv5官方代码部分模块已经切到SiLU做法不变但动手替换前最好先打开models/common.py确认当前版本实际用了什么。每个模块换完之后其他超参不动单独跑一轮对比才能判断激活函数带来的收益是不是真的。4.3 锚框与感受野小目标漏检的底层线索YOLOv5的yaml配置里预设了640×640输入下的三组锚框这些锚框是在Coco数据集上统计出来的到了烟叶病斑这种目标尺寸分布差异很大的场景直接沿用会拖慢前期收敛。解决办法是训练时加--autoanchor让YOLOv5在训练前用K-Means按当前数据重新聚类锚框。加了之后训练日志里会输出新锚框和默认值对比就能看出烟叶病斑和Coco目标尺度差多远。锚框只是表面现象底层是PPT里提到的感受野概念。特征图上一点能“看到”原图上多大区域就是感受野。高层特征图感受野大适合检测大目标但小病斑的信息经过多层卷积后被压缩这就是小目标漏检的根源。对应的改进思路有三个一是用Mosaic增强增加小目标样本二是改用更高分辨率输入三是改网络结构让特征融合层更关注小目标。前面两个在训练参数上就能做第三个就是下一章的注意力模块方向。5. 避坑指南训练烟叶数据集最容易翻车的5个问题5.1 小病斑一直检不出来先查标注再查锚框现象训练正常收敛mAP也不算低但推理时就漏掉早期的小斑点大黑胫病斑倒是一个不落。原因训练数据里小目标标注框太小且数量偏少。模型学不到足够多的小目标正样本自然就把它们当背景。解决先做标注复查把漏标的小斑点补上保证每个病害都有几十上百个小目标框再在训练命令里加--autoanchor让锚框重新往小尺寸方向聚类最后推理时把--conf-thres从0.5降到0.3给小目标留下输出空间。标注小框时可以把labelimg的自动保存模式打开画完一框就落盘不容易漏。这一步排查到位之后小斑点的检出率通常能提升10到20个点。5.2 loss不降或剧烈震荡优化器和学习率背锅现象前10个epoch的loss不仅不降有时还往上窜一度让人怀疑数据集是不是坏了。原因大多数时候不是数据问题而是学习率太大或者用了不匹配的预训练权重。解决先把data/hyps/hyp.scratch-low.yaml里的lr0从0.01改成0.001重新跑一遍如果还在震荡检查--weights是不是真的加载成了yolov5s.pt而不是误填成了某个只训了两轮的last.pt。调学习率时每次只动一个超参lr0和lrf最终学习率因子不要同时改。这种情况我在烟叶数据上遇到过两次两次都是lr0的问题数据本身没毛病。5.3 训练正常推理误检负样本缺失才是根源现象训练loss和mAP都正常但一到田间测试模型把正常枯叶、泥土和滴灌带误标成病害。原因训练集里几乎全是带病的叶片模型没见过足够多“没有病”的图像自然倾向于把纹理变化都判成病害。解决单独采集一批无病烟叶、枯叶、田垄背景图直接放进images目录但不写任何txt标注。YOLO训练时处理负样本的方式就是让这些图片没有任何标签模型会学会把这类区域当成背景。注意加负样本后训练集的类别统计不会变这是正常的别怀疑切错了目录。负样本也不是越多越好比例控制在总图片数的四分之一以内比较合适。5.4 OOM中断与训练卡死batch、workers和图像尺寸调节现象训练跑到第3个epoch直接报CUDA out of memory或者界面卡在加载数据一动不动。原因batch-size加上图像尺寸占满了显存workers设置过大也可能让数据加载线程把内存打满。解决OOM优先把--batch-size减半比如16改8还报就改--img 640为512代价是小目标更难检但至少能跑通流程。卡死先检查workers一般改成系统逻辑核数的一半如果本地只有一个8G显存的卡batch-size 8配img 640是比较稳的组合。训练中断不要慌权重还在last.pt里修好环境后用--resume续训就行不用从头来。5.5 换激活函数或损失函数后效果更差现象把LeakyReLU换成Mish或把GIOU调成CIOU训练完对比mAP反而不如改动前。原因这类结构改动会改变梯度流需要更多的epoch收敛训练次数不够对比结果就会失真另外改网络结构的同时也换了预训练权重等于一次对比实验变了两个变量。解决每次只改一处固定预训练权重和epoch数给改动后的模型比基线多训20%的轮次。PPT里也提醒过不要想着同时优化所有方面一次改一个点用数据说话。建议把每次改动记到实验记录里哪一版权重对应哪份配置没有记录对比实验等于白做。6. 改进YOLOv5网络结构添加注意力模块的落地操作6.1 动手改models/common.py和yolo.py注册一个新模块PPT里给了改网络结构的通用思路先在common.py里实现模块再让yolo.py的parse_model能识别它最后用yaml把模块串进backbone。我的落地操作是给C3模块加一个SE注意力分支class SE(nn.Module): def __init__(self, c, r8): super().__init__() self.avg nn.AdaptiveAvgPool2d(1) self.fc nn.Sequential( nn.Linear(c, c // r), nn.ReLU(), nn.Linear(c // r, c), nn.Sigmoid()) def forward(self, x): y self.avg(x).flatten(1) return x * self.fc(y).view(-1, x.shape[1], 1, 1)SE先把每个通道压缩成全局标量再用两层全连接学习通道权重最后乘回原特征图让网络对病斑所在通道更敏感。r是通道压缩比在yolov5s这种小模型上用8或16比较稳。把这段加进models/common.py再在models/yolo.py的parse_model解析列表里加上SE就可以在配置文件中使用这个模块。修改yaml时把某个C3替换成C3SEC3SE不是官方自带模块需要把C3和SE组合成一个新类一种省事的做法是保留C3结构在forward里插入SE。6.2 对比实验验证固定随机种子别让结论翻车改完网络不能只跑一个训练就宣布有效。我一般固定随机种子和验证集用同一份数据、同一个超参文件分别训基线和改进模型各跑两三次最后看平均mAP。记录表可以这样建模型PrecisionRecallmAP0.5备注yolov5s基线0.820.740.79关闭autoanchorseed固定yolov5sC3SE0.850.780.83同上如果改进后没有提升先检查是不是把预训练权重也换掉了、自动锚框是否开着。我在这上面栽过跟头有一版对比实验我把autoanchor开着两边训练时锚框聚类结果不一样最后mAP的差异其实来自锚框而不是注意力模块。从那以后我每次做网络结构对比都强制固定随机种子、关闭autoanchor同一批数据只改网络结构那一行配置。数据、环境、训练参数全部可控结论才站得住。这套流程走完再回头去看PPT里提到的嵌套式YOLOv5、小目标检测这些延伸方向就能清楚每一步改动动的到底是什么。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

面试中如何用三句话介绍项目?黄金模型与实战技巧 2026/9/29 3:26:51

面试中如何用三句话介绍项目?黄金模型与实战技巧

1. 同一道题,两种结局:真实面试现场的两幕对比先还原两个真实画面,你感受一下差距是怎么拉开的。A君的“三句话过关”:面试官:“介绍一下你的项目吧。”A君:“我接手的是一个日均调用量约800万次的用户画像…

阅读更多 →
分布式数据库算子下推实战:从执行计划到SQL调优 2026/9/29 3:26:51

分布式数据库算子下推实战:从执行计划到SQL调优

1. 为什么分布式数据库必须聊算子下推1.1 数据库算子和图像 kernel 算子不是一回事“算子”这个词在不同的技术圈子里含义完全不同。做图像处理的人,张口就是 sobel 算子、canny 算子、拉普拉斯算子;做 AI 加速的人,关心的是 GPU 上的 kernel…

阅读更多 →
定制USB线缆组件实战:从协议细节到量产调试避坑指南 2026/9/29 3:26:51

定制USB线缆组件实战:从协议细节到量产调试避坑指南

刚开始画智能硬件的时候,我把USB接口当成板上一个插座,标注好D/D-就以为万事大吉。直到第一次样机联调,设备插上电脑要么枚举不上,要么反复RESET。折腾了整整一天,最后发现罪魁祸首不是PCB封装,也不是固件配…

阅读更多 →
Python字符串操作全攻略:从基础方法到实战避坑 2026/9/29 3:26:51

Python字符串操作全攻略:从基础方法到实战避坑

说实话,编程入门最容易被忽视却又最绕不开的东西,就是字符串。我当年刚学Python时,觉得字符串不就是一堆文字嘛,print出来完事,直到后来写爬虫、做数据处理、调接口,才发现字符串操作简直无处不在——解析日…

阅读更多 →
大学生从Windows转Mac实用指南:系统设置、开发环境与常见问题排查 2026/9/29 3:26:51

大学生从Windows转Mac实用指南:系统设置、开发环境与常见问题排查

刚拿到 MacBook 的大学生,十有八九会在前半个小时遇到类似的崩溃时刻:习惯性去找右键菜单里的“刷新”,发现没有;想把窗口右上角的叉号点掉,发现那个红点只是关闭窗口而不是退出应用;下载了一个 .dmg 文件&…

阅读更多 →
TensorFlow本质:从计算引擎到工业级AI落地框架 2026/9/29 3:26:44

TensorFlow本质:从计算引擎到工业级AI落地框架

1. 这不是“装个库”那么简单:TensorFlow到底在解决什么问题?你搜“tensorflow安装”,页面跳出的全是pip install、conda install、CUDA版本匹配、cuDNN路径报错——但真正卡住你的,从来不是那行命令敲得对不对。我带过二十多个从…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉