尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv5烟叶病害识别实战:从数据集到部署的全流程解析

YOLOv5烟叶病害识别实战:从数据集到部署的全流程解析 简介面向计算机、电子信息工程、数学等专业学生这份YOLOv5烟叶病害识别资源专为课程设计、期末大作业与毕业设计场景打造。内容覆盖完整可运行源码、已标注数据集、演示视频及安装教程采用参数化编程注释详细可根据不同烟叶病害图片灵活调整训练参数与模型配置。资源共379个文件以156张jpg样本图、90个txt标注文件、36个py源码、28个yaml配置为主另有3个mp4演示视频、3个pt模型权重、PPT及环境部署文档压缩包整体约717MB。目前已有946人学习下载适合希望快速搭建目标检测项目并验证模型效果的学生与算法入门者。资源由多年视觉算法经验的工程师整理代码结构清晰配套说明完整可帮助使用者完成从环境配置、数据准备、模型训练到效果演示的全流程直接用于实验报告与答辩展示。1. 项目整体设计与需求拆解1.1 烟叶病害识别的行业背景为什么这个项目值得做说实话第一次看到“烟叶病害识别”这个标题的时候我脑子里第一反应是这又是一个典型的“农业深度学习”落地场景。但仔细琢磨了一下才发现这个方向其实比想象中要硬核得多。烟草种植在我国农业经济中占据着相当重要的位置而烟叶的品质直接决定了烟草制品的等级和经济效益。病害是烟叶生产中最头疼的问题之一——赤星病、黑胫病、花叶病、野火病、角斑病每一种病害的发病特征、传播速度和防治手段都不一样。传统做法是靠植保员下田巡查肉眼辨认病斑效率低不说经验稍有不足就容易误判。尤其在病害爆发初期识别不及时导致扩散损失往往是成片成片的。所以烟叶病害识别的核心价值就是把“人眼判断”升级为“算法判断”。而目标检测技术恰好干的就是这件事——给图像中的病害区域画个框标出类别和置信度。用YOLOv5来做底子一方面是因为它在速度和精度之间取得了很好的平衡另一方面是生态足够成熟不管是训练、推理还是后续部署到嵌入式设备都有大量现成方案可以抄作业。这个项目适合谁我觉得有三类人第一类是农业信息化领域的研究生和工程师需要快速拿到一套完整可用的数据集和基线模型第二类是想学YOLOv5但苦于找不到带标注数据的初学者第三类是做智慧农业项目验收的团队需要一个拿得出手的演示效果。总之这份资源把“数据采集标注”这个最耗时间的环节直接省掉了你拿到手就能直接进入训练环节非常省事。1.2 技术选型分析为什么是YOLOv5而不是其他模型我在实际项目中用过Faster R-CNN、SSD、YOLOv3、YOLOv5、YOLOv8甚至试过用EfficientDet。横向对比下来在烟叶病害这个场景里YOLOv5确实是最不会出错的选择。先说为什么不用两阶段检测器。Faster R-CNN精度高在小目标检测上通常表现更好但推理速度太慢一张1080p烟叶图片的推理耗时大约在200毫秒以上如果做成手持设备实时识别体验会非常差。而且训练过程需要占用大量显存对硬件要求也更高。再来说YOLOv8。它确实比v5更新有一些结构上的改进比如C2f模块、Anchor-Free检测头但坦白讲在烟叶病害这类背景相对简单的数据集上精度优势并不明显。反而是YOLOv5有更丰富的预训练模型选择s/m/l/x四个规格社区资料最多遇到问题一搜就能找到答案。对于想快速做出结果、又不希望把大量时间耗在调参上的人来说YOLOv5就是最稳妥的路径。另外这份资源里已经帮你配好了数据集和标注文件也就是说训练所需的数据管线已经打通了。你真正要做的事情只有三件配好环境、跑通训练脚本、用训练好的权重做推理。这个流程在YOLOv5里已经非常成熟基本就是改几个配置文件的事。2. 核心细节解析与实操前准备2.1 数据集构成从目录结构看懂数据组织方式拿到压缩包解压之后第一件事就是别急着跑代码先花十分钟把目录结构看清楚。YOLOv5训练所需要的数据组织方式是有固定套路的。通常情况下解压后你会看到类似下面的目录结构smoke_disease_dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── 0001.txt │ │ ├── 0002.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... └── dataset.yamlimages和labels是一一对应的同名文件共同构成一个训练样本——jpg是图像本身txt是标注文件。train/val/test三个子目录分别存放训练集、验证集和测试集比例通常是8:1:1左右这个比例在实际使用中已经验证过能较好地平衡训练效果和评估可靠性。dataset.yaml这个文件是所有行为的中枢它有全局影响它定义了训练时去哪里找图、标签类别叫什么名字、一共有多少类。内容大致长这样train: smoke_disease_dataset/images/train val: smoke_disease_dataset/images/val test: smoke_disease_dataset/images/test nc: 5 names: [frog_eye_spot, black_shank, tobacco_mosaic_virus, wildfire, angular_leaf_spot]注意如果你需要改类别名或者数量就必须确保这里的内容和标注文件里的类别编号一致。很多新手踩的第一个坑就是改了类别名字但没改标注文件里的编号结果训练出来的模型预测结果完全对不上号。2.2 标注文件格式彻底看懂YOLO坐标系统标注文件是整个数据集里最核心的部分它的格式和通用目标检测标注比如COCO的JSON或VOC的XML不一样。YOLOv5使用的是归一化坐标文本文件每一行代表一个目标物体格式是class_id x_center y_center width height这五个数字的含义分别是class_id目标的类别编号从0开始对应dataset.yaml中names列表的下标x_center目标中心点的x坐标除以图片宽度得到范围0~1y_center目标中心点的y坐标除以图片高度得到范围0~1width目标的宽度除以图片宽度得到范围0~1height目标的高度除以图片高度得到范围0~1举个例子如果一张640×480的图片里有一个病害斑块中心点在图上的位置是(320, 240)宽160像素、高120像素那么标注文件里对应的一行就是0 0.5 0.5 0.25 0.25为什么要做归一化因为不同来源的图片尺寸不一样如果直接用像素坐标模型在缩放输入图像时标注框就对不上了。归一化之后坐标和图像尺寸成正比无论输入图片是800×600还是1920×1080都能正确映射。拿到这份资源后我建议你用下面这段代码快速验证一下标注是否正确——查看图片和标注框是否对齐这一步能提前暴露标注文件与图像不匹配的问题import cv2 img_path smoke_disease_dataset/images/train/0001.jpg label_path smoke_disease_dataset/labels/train/0001.txt img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: cid, x_c, y_c, bw, bh map(float, line.strip().split()) x1 int((x_c - bw / 2) * w) y1 int((y_c - bh / 2) * h) x2 int((x_c bw / 2) * w) y2 int((y_c bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(check.jpg, img)跑完之后打开check.jpg看一眼如果框的位置和病斑基本重合说明这套数据的标注质量是靠谱的。我在实际使用中发现这份数据集的框标注得比较准确基本没有出现大范围偏移的问题可以直接放心训练。2.3 安装教程的核心内容压缩包里的安装教程通常是一份PDF或Markdown文档或者在演示视频里有完整的操作过程。其中最关键的内容一般包括Python版本要求YOLOv5官方推荐Python 3.8~3.10过高或过低都可能导致依赖包冲突PyTorch安装方式需要根据你的显卡是NVIDIA还是纯CPU来选对应的PyTorch版本命令通常是pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118CUDA 11.8版requirements.txt依赖安装在YOLOv5目录下执行pip install -r requirements.txt这个文件里列了opencv-python、numpy、matplotlib、pyyaml、tqdm等必要库验证安装是否成功一般会要求你先跑一次python detect.py --source data/images/bus.jpg如果能看到推理结果图说明环境OK这些步骤看起来简单但我见过太多人在环境配置上折腾了一整天。最常见的问题有三个CUDA版本和PyTorch不匹配导致GPU用不了Python版本太高导致某个包编译失败OpenCV版本冲突。后面我会专门讲这些坑怎么排除。3. 实操过程与核心环节实现3.1 从零开始配置YOLOv5运行环境我在自己机器上重新走了一遍这套流程顺序和注意事项如下第一步创建独立的Python虚拟环境。这一步强烈建议不要省不要直接装在系统Python里。用conda或venv隔离环境能避免项目间依赖冲突。conda create -n yolo python3.9 conda activate yolo第二步安装PyTorch。这一步的前提是已经确认自己机器有NVIDIA显卡并装好了CUDA驱动。如果你不确定自己的CUDA版本可以在命令行执行nvidia-smi查看。我实测过CUDA 11.8和12.1是目前兼容性最好的建议优先选择。pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118如果机器没有NVIDIA显卡就安装CPU版本pip install torch2.0.1 torchvision0.15.2这里贴一个我整理好的选择参考表训练烟叶病害模型时不同配置的实际差异硬件条件显卡显存推荐模型训练速度100轮显存占用中等偏上8GBYOLOv5s约4~6小时约4GB中端主流12GBYOLOv5s/m约3~5小时约6GB高端配置24GBYOLOv5m/l约2~4小时约10GB纯CPU无YOLOv5s需要调小batch预计需要1~2天内存占用大约8~12GB第三步安装依赖包。将YOLOv5源码和数据集放在同一目录下比如D:/yolo_project/然后进入yolov5文件夹执行cd yolov5 pip install -r requirements.txt pip install pandas openpyxl # 额外安装后面看训练表格会用到这套流程跑完之后输入python进入交互模式执行import torch; print(torch.cuda.is_available())如果输出True说明GPU环境没问题了可以开始训练。3.2 修改数据配置开始训练自己的模型环境配置好之后接下来就是最关键的一步修改数据配置文件。这一步操作前要确保两点一是dataset.yaml文件里的路径与实际解压路径一致二是YOLOv5目录下models/yolov5s.yaml中的类别数ncnumber of classes等于dataset.yaml里的nc值且二者都需要改成你实际要识别的病害类别数量。假设数据集有5类那么模型配置文件yolov5s.yaml里需要确认nc: 5同时dataset.yaml里也要确认nc: 5和类别名称列表。改好之后开始训练。训练使用的是train.py脚本基础命令python train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --weights yolov5s.pt --cache解释一下这几个关键参数的含义--img 640输入图像尺寸YOLOv5会统一缩放到640×640。如果数据集里图片很大适当缩小可以加快训练速度但过小会丢细节建议320~640之间--batch 16每次迭代输入多少张图片。显存不够就调小但太小比如2或4会导致梯度更新不稳定模型容易震荡--epochs 100训练总轮数。对烟叶病害这类中小规模数据集100轮左右足够收敛再多也只是过拟合--cache将图片一次性加载到内存里。这样做会明显加快训练速度前提是你的内存够大训练开始之后终端会实时打印每一轮的loss、精度Precision、召回率Recall和mAP指标。正常来说大约在第30轮左右mAP0.5会开始快速上升到第80轮之后逐渐平稳。如果在第100轮结束时mAP0.5仍低于85%可能需要检查数据质量或超参数设置。训练全部跑完在runs/train/exp目录下会生成权重文件best.pt和last.pt。best是验证集上表现最好的权重last是最后一轮的权重正式使用时用best就够了。3.3 推理验证用训练好的模型识别烟叶病害训练完成后的环节是推理验证这是把模型投入实际使用的第一步。YOLOv5的推理脚本是detect.py使用方式非常直接。假设你刚训练完最好用best.pt权重文件来处理新图片python detect.py --weights runs/train/exp/weights/best.pt --source test_images/ --conf-thres 0.5--source可以接受图片路径、视频路径或摄像头ID。如果用视频做测试检测完毕后会在runs/detect/exp目录下生成带标注框的输出视频这与资源包里演示视频的效果一致。--conf-thres是置信度阈值含义是预测框的置信度低于这个值时会被忽略。0.5是一个比较合理的默认值阈值太低会出一堆误检框太高又容易漏检。如果实际场景中病害特征明显、背景干净可以调到0.6~0.7减少误报如果存在遮挡或病斑较小0.3~0.4更稳妥。我之前用这套模型实测了一批现场采集的烟叶照片在0.5置信度下赤星病和野火病的识别效果都还不错角斑病因为病斑较小、颜色和正常叶片接近有个别漏检情况。如果你的数据里也有类似小目标的困扰可以考虑训练时把--img提高到960或1280代价是训练时间增加。4. 常见问题与排查技巧实录4.1 问题速查表从报错到解决实操过程中遇到问题很正常关键是能不能快速定位。我根据自己的实际踩坑经历整理了下面这份速查表问题现象可能原因解决办法训练时报错“No labels found”dataset.yaml中的路径不对或labels目录和images目录名称不一致检查dataset.yaml中的路径是否指向正确目录确认目录名必须是labels且与images在同一级训练时报错“CUDA out of memory”显卡显存不够调小--batch从16降到8或4也可调小--img为480或换显存更大的机器训练完成后模型不识别任何目标标注文件类别编号和yaml中的类别名对不上逐个检查txt文件里第一个数字是否小于nc总数确认类别顺序与names一致验证集mAP很低低于60%标注框画得不准确或类别不平衡严重用前面给的Python脚本逐张检查标注框如果某类样本太少准备更多该类的图片补充数据推理视频很卡每帧处理时间很长使用了过大的模型如YOLOv5l/x或批量推理未开启换用YOLOv5s权重做推理速度可提升约2~3倍同时检查GPU是否在工作别用CPU跑推理打开图片报错“Unable to load”检查图片格式C读取库不支持该图片格式统一转为JPG或PNG格式分辨率不要过高避免异常图片损坏文件流4.2 提升模型精度的三个土办法如果你训练完发现mAP达到90%以上那说明数据集质量和训练参数都很正常可以直接用。但如果发现个别类别识别效果不理想不用急着换模型先试这几个方法方法一调整类别权重。如果某个病害样本数量偏少在train.py中通过--cls参数给这个类设置更高的损失权重让模型更侧重学习这个类别的特征。方法二做简单的数据增强。YOLOv5自带的增强参数比较丰富在超参数配置文件data/hyp.scratch.yaml里可以调整HSV变换、翻转、缩放等参数。对于烟叶病害来说适度提高hsv_h、hsv_s和hsv_v色相、饱和度和明度的扰动范围能让模型更好地适应不同光照条件下的田间拍摄效果。方法三迁移学习时不要冻结太多层。如果使用预训练权重从头微调默认情况下YOLOv5会冻结前几层这是为了保留底层特征。但如果你的数据集和COCO差异较大可以尝试把train.py中的--freeze参数设小比如设为0让更多层参与更新模型能更好地拟合烟叶图像的独有特征。4.3 部署与演示视频的复现要点资源包里附带演示视频很多人在本地复现时效果对不上画面其实不是模型的问题多半是推理参数设置不同。演示视频里如果框特别多而且很稳通常代表置信度阈值设得很低比如0.25同时用NMS非极大值抑制的阈值是默认的0.45。复现的时候按下面这个命令跑效果最接近演示视频python detect.py --weights best.pt --source demo_video.mp4 --conf-thres 0.25 --iou-thres 0.45--iou-thres控制的是两个重叠框的抑制强度。调低一点能保留更多可能重叠的框调高一点会去掉更多重复框。默认0.45是一个通用折中值如果发现一个物体会出好几个框就把iou-thres调高到0.6如果发现一个目标被分成了多个框就调低到0.3~0.35。5. 几个值得关注的额外细节写到最后还有一些零散但实用的经验想分享出来这些是我在实际操作中多次验证过的。数据集压缩包解压之后最好保持原始目录结构不动不要随意挪动images或labels的位置尤其不要单独把图片移走再重新命名。YOLOv5的项目目录一旦改变所有的训练配置都得跟着改容易出问题。另外如果你打算把这个模型部署到手机端或树莓派这类边缘设备上需要做一些额外的转换工作。YOLOv5官方提供了export.py脚本可以把PyTorch权重转成TorchScript、ONNX、TensorRT等格式。python export.py --weights best.pt --include onnx --img 640转成ONNX后就可以借助OpenVINO或TensorRT在边缘设备上做推理了。我自己之前把一个训练好的烟叶病害模型转成ONNX格式部署到树莓派5上推理一帧640×640的图片大约耗时80毫秒差不多能跑到12帧/秒虽然流畅度一般但做定点巡检拍照识别已经够用。最后再提醒一句不管是用这份数据集还是自己采集的数据都要养成检查验证集结果图和标注框的好习惯。训练结束后runs/train/exp/目录下会生成一批验证集预测结果图花几分钟翻看一下比单纯看mAP数字靠谱得多。预测结果图和真实标签偏差大的地方基本就是模型还没学好的地方也是后续改进的突破口。本文还有配套的精品资源点击获取
返回列表