简介:面向计算机、电子信息工程、数学等专业学生,这份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~1
- y_center:目标中心点的y坐标,除以图片高度得到,范围0~1
- width:目标的宽度,除以图片宽度得到,范围0~1
- height:目标的高度,除以图片高度得到,范围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/cu118(CUDA 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 python=3.9 conda activate yolo第二步,安装PyTorch。这一步的前提是已经确认自己机器有NVIDIA显卡并装好了CUDA驱动。如果你不确定自己的CUDA版本,可以在命令行执行nvidia-smi查看。我实测过,CUDA 11.8和12.1是目前兼容性最好的,建议优先选择。
pip install torch==2.0.1 torchvision==0.15.2 --index-url https://download.pytorch.org/whl/cu118如果机器没有NVIDIA显卡,就安装CPU版本:
pip install torch==2.0.1 torchvision==0.15.2这里贴一个我整理好的选择参考表(训练烟叶病害模型时,不同配置的实际差异):
| 硬件条件 | 显卡显存 | 推荐模型 | 训练速度(100轮) | 显存占用 |
|---|---|---|---|---|
| 中等偏上 | 8GB | YOLOv5s | 约4~6小时 | 约4GB |
| 中端主流 | 12GB | YOLOv5s/m | 约3~5小时 | 约6GB |
| 高端配置 | 24GB | YOLOv5m/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中的类别数nc(number 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轮左右,mAP@0.5会开始快速上升,到第80轮之后逐渐平稳。如果在第100轮结束时mAP@0.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数字靠谱得多。预测结果图和真实标签偏差大的地方,基本就是模型还没学好的地方,也是后续改进的突破口。
本文还有配套的精品资源,点击获取