一、数据集介绍
【数据集】农作物病害识别数据集 11498 张,目标检测,包含YOLO/VOC格式标注。
数据集中包含30种分类 :names: ['Apple Scab Leaf', 'Apple leaf', 'Apple rust leaf', 'Bell_pepper leaf spot', 'Bell_pepper leaf', 'Blueberry leaf', 'Cherry leaf', 'Corn Gray leaf spot', 'Corn leaf blight', 'Corn rust leaf', 'Peach leaf', 'Potato leaf early blight', 'Potato leaf late blight', 'Potato leaf', 'Raspberry leaf', 'Soyabean leaf', 'Squash Powdery mildew leaf', 'Strawberry leaf', 'Tomato Early blight leaf', 'Tomato Septoria leaf spot', 'Tomato leaf bacterial spot', 'Tomato leaf late blight', 'Tomato leaf mosaic virus', 'Tomato leaf yellow virus', 'Tomato leaf', 'Tomato mold leaf', 'Tomato two spotted spider mites leaf', 'grape leaf black rot', 'grape leaf'],涵盖苹果、菜椒、蓝莓、樱桃、玉米、桃子、土豆、树莓、大豆、南瓜、草莓、番茄、葡萄等等。
数据集来自国内网站、视频抽帧;
可用于无人机作物病害巡检,监控农作物病虫害检测等。
检测场景为田地、蔬菜大棚、果园、果蔬加工厂等场景 ,可用于田间实时预警,精准施药指导,品种抗病性评估,区域病害监测等。
文章底部或主页私信获取数据集~


1、数据概述
农作物病害识别的重要性
农作物病害(如小麦锈病、水稻稻瘟病、番茄晚疫病等)是影响粮食产量与品质的关键威胁,若发现不及时,易快速扩散至整片农田,导致作物减产甚至绝收,直接关系粮食安全与农户收益。
传统病害检测存在显著短板:依赖人工巡查,需农户或技术员逐株观察叶片、果实状态,不仅耗时耗力,且受经验限制大 ------ 新手易漏判早期轻症,老手也难以覆盖大规模种植区域;病害确诊后,信息传递滞后,常错过最佳防治时机,导致病害进一步蔓延。
YOLO 算法恰好破解这些痛点:其一,依托田间摄像头或无人机航拍,可实现高帧率实时检测,无需人工逐株排查,能快速覆盖大面积农田;其二,对常见作物病害的识别精度高,可精准捕捉叶片上的斑点、霉变、卷曲等早期病征,甚至区分相似病害(如番茄早疫病与晚疫病),避免误判;其三,检测结果可实时同步至农户手机或农业管理平台,实现 "病害即发现、信息即同步",为及时防治提供关键支撑,是推动农业从 "经验防治" 向 "精准防控" 转型的核心技术。
基于YOLO的农作物病害识别算法
-
田间实时预警:YOLO 通过田间部署的监控设备或无人机巡检,实时识别作物病害迹象,一旦发现异常立即推送预警(含病害类型、发生区域)至农户,帮助在病害早期介入处理,避免扩散至更大范围,有效减少产量损失。
-
精准施药指导:检测时可同步定位病害发生的具体区域与严重程度,农户无需全田喷洒农药,只需针对病株区域精准施药,既降低农药使用量、减少土壤与水体污染,又节约种植成本,契合绿色农业发展需求。
-
品种抗病性评估:在农业科研或育种场景中,YOLO 可长期监测不同作物品种在相同环境下的病害发生情况,量化统计各品种的抗病能力,为培育更优抗病品种提供数据支撑,助力从源头降低病害风险。
-
区域病害监测:多区域部署 YOLO 检测设备后,可汇总各地块病害数据,形成区域病害分布图谱,农业管理部门能据此预判病害传播趋势,提前调配防治物资、组织技术指导,预防区域性病害爆发。
该数据集含有 11498 张图片,包含Pascal VOC XML 格式和YOLO TXT 格式,用于训练和测试田地、蔬菜大棚、果园、果蔬加工厂等场景进行农作物病害识别。
图片格式为jpg格式,标注格式分别为:
YOLO:txt
VOC:xml
数据集均为手工标注,保证标注精确度。
2、数据集文件结构
Plant_Disease/
------test/
------------Annotations/
------------images/
------------labels/
------train/
------------Annotations/
------------images/
------------labels/
------valid/
------------Annotations/
------------images/
------------labels/
------data.yaml
- 该数据集已划分训练集样本,分别是:test 目录(测试集)、train 目录(训练集)、valid目录(验证集);
- Annotations文件夹为Pascal VOC格式的XML文件 ;
- images文件夹为jpg格式的数据样本;
- labels文件夹是YOLO格式的TXT文件;
- data.yaml是数据集配置文件,包含农作物病害识别的目标分类和加载路径。



Annotations目录下的xml文件 内容如下 :
XML
<annotation>
<folder></folder>
<filename>bfb5b4fb0d9a0dbe476ca7002b41fe4d_jpg.rf.ac7fc00f7e592ac5363d207c5cb4b82d.jpg</filename>
<path>bfb5b4fb0d9a0dbe476ca7002b41fe4d_jpg.rf.ac7fc00f7e592ac5363d207c5cb4b82d.jpg</path>
<source>
<database>plant</database>
</source>
<size>
<width>640</width>
<height>640</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Strawberry leaf</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<occluded>0</occluded>
<bndbox>
<xmin>53</xmin>
<xmax>559</xmax>
<ymin>200</ymin>
<ymax>639</ymax>
</bndbox>
</object>
<metadata>
</metadata>
</annotation>
labels目录下的txt文件内容如下:
bash
19 0.61015625 0.5828125 0.5703125 0.834375
3、数据集适用范围
- 目标检测 场景,无人机 检测,监控识别
- yolo训练模型或其他模型
- 田地、蔬菜大棚、果园、果蔬加工厂等场景
- 可用于田间实时预警,精准施药指导,品种抗病性评估,区域病害监测等。
4、数据集标注结果
4.1、数据集内容
- 多角度场景:行人视角数据样本,监控视角数据样本;
- 标注内容:数据集中包含30种分类,涵盖苹果、菜椒、蓝莓、樱桃、玉米、桃子、土豆、树莓、大豆、南瓜、草莓、番茄、葡萄等等;
- 图片总量:11498张图片数据;
- 标注类型:含有Pascal VOC XML 格式和yol o TXT格式;
5、训练过程
5.1、导入训练数据
下载YOLOv8项目压缩包,解压在任意本地workspace文件夹中。
下载YOLOv8预训练模型,导入到ultralytics-main项目根目录下。
在ultralytics-main 项目根目录下,创建data文件夹,并在data文件夹下创建子文件夹:Annotations、images、imageSets、labels, 其中,将pascal VOC格式的XML文件 手动导入到Annotations文件夹中,将JPG格式的图像数据导入到images文件夹中,imageSets和labels两个文件夹不导入数据。
data目录结构如下:
data/
------Annotations/ //存放xml文件
------images/ //存放jpg图像
------imageSets/
------labels/
整体项目结构如下所示:
5.2、数据分割
首先在ultralytics-main目录下创建一个split_train_val.py文件,运行文件之后会在imageSets文件夹下将数据集划分为训练集train.txt、验证集val.txt、测试集test.txt,里面存放的就是用于训练、验证、测试的图片名称。
python
import os
import random
trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
5.3、数据集格式化处理
在ultralytics-main目录下创建一个voc_label.py文件,用于处理图像标注数据,将其从XML格式(通常用于Pascal VOC数据集)转换为YOLO格式。
convert_annotation函数
-
这个函数读取一个图像的XML标注文件,将其转换为YOLO格式的文本文件。
-
它打开XML文件,解析树结构,提取图像的宽度和高度。
-
然后,它遍历每个目标对象(
object),检查其类别是否在classes列表中,并忽略标注为困难(difficult)的对象。 -
对于每个有效的对象,它提取边界框坐标,进行必要的越界修正,然后调用
convert函数将坐标转换为YOLO格式。 -
最后,它将类别ID和归一化后的边界框坐标写入一个新的文本文件。
python
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train', 'val', 'test']
classes = ['Apple Scab Leaf', 'Apple leaf', 'Apple rust leaf', 'Bell_pepper leaf spot', 'Bell_pepper leaf', 'Blueberry leaf', 'Cherry leaf', 'Corn Gray leaf spot', 'Corn leaf blight', 'Corn rust leaf', 'Peach leaf', 'Potato leaf early blight', 'Potato leaf late blight', 'Potato leaf', 'Raspberry leaf', 'Soyabean leaf', 'Squash Powdery mildew leaf', 'Strawberry leaf', 'Tomato Early blight leaf', 'Tomato Septoria leaf spot', 'Tomato leaf bacterial spot', 'Tomato leaf late blight', 'Tomato leaf mosaic virus', 'Tomato leaf yellow virus', 'Tomato leaf', 'Tomato mold leaf', 'Tomato two spotted spider mites leaf', 'grape leaf black rot', 'grape leaf'] # 根据标签名称填写类别
abs_path = os.getcwd()
print(abs_path)
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def convert_annotation(image_id):
in_file = open('data/Annotations/%s.xml' % (image_id), encoding='UTF-8')
out_file = open('data/labels/%s.txt' % (image_id), 'w')
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text),
float(xmlbox.find('xmax').text),
float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
b1, b2, b3, b4 = b
# 标注越界修正
if b2 > w:
b2 = w
if b4 > h:
b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for image_set in sets:
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
list_file = open('data/%s.txt' % (image_set), 'w')
for image_id in image_ids:
list_file.write(abs_path + '/data/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
5.4、修改数据集配置文件
在ultralytics-main目录下创建一个data.yaml文件
python
train: data/train.txt
val: data/val.txt
test: data/test.txt
nc: 30
names: ['Apple Scab Leaf', 'Apple leaf', 'Apple rust leaf', 'Bell_pepper leaf spot', 'Bell_pepper leaf', 'Blueberry leaf', 'Cherry leaf', 'Corn Gray leaf spot', 'Corn leaf blight', 'Corn rust leaf', 'Peach leaf', 'Potato leaf early blight', 'Potato leaf late blight', 'Potato leaf', 'Raspberry leaf', 'Soyabean leaf', 'Squash Powdery mildew leaf', 'Strawberry leaf', 'Tomato Early blight leaf', 'Tomato Septoria leaf spot', 'Tomato leaf bacterial spot', 'Tomato leaf late blight', 'Tomato leaf mosaic virus', 'Tomato leaf yellow virus', 'Tomato leaf', 'Tomato mold leaf', 'Tomato two spotted spider mites leaf', 'grape leaf black rot', 'grape leaf']
5.5、执行命令
python
model = YOLO('yolov8s.pt')
results = model.train(data='data.yaml', epochs=200, imgsz=640, batch=16, workers=0)
也可以在终端执行下述命令:
bash
yolo train data=data.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 workers=0 device=0
5.6、模型预测
你可以选择新建predict.py预测脚本文件,输入视频流或者图像进行预测。
代码如下:
python
import cv2
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO("./best.pt") # 自定义预测模型加载路径
# Open the video file
video_path = "./demo.mp4" # 自定义预测视频路径
cap = cv2.VideoCapture(video_path)
# Get the video properties
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # Be sure to use lower case
out = cv2.VideoWriter('./outputs.mp4', fourcc, fps, (frame_width, frame_height)) # 自定义输出视频路径
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLOv8 inference on the frame
# results = model(frame)
results = model.predict(source=frame, save=True, imgsz=640, conf=0.5)
results[0].names[0] = "道路积水"
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Write the annotated frame to the output file
out.write(annotated_frame)
# Display the annotated frame (optional)
cv2.imshow("YOLOv8 Inference", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture and writer objects
cap.release()
out.release()
cv2.destroyAllWindows()
也可以直接在命令行窗口或者Annoconda终端输入以下命令进行模型预测:
python
yolo predict model="best.pt" source='demo.jpg'
6、获取数据集
文章底部或主页私信获取数据集~
二、基于QT的目标检测可视化界面
1、环境配置
bash
# 安装torch环境
pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装PySide6依赖项
pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装opencv-python依赖项
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
2、使用说明
界面功能介绍:
- 原视频/图片区:上半部分左边区域为原视频/图片展示区;
- 检测区 :上半部分右边区域为检测结果输出展示区;
- 文本框 :打印输出操作日志,其中告警以json格式输出,包含标签框的坐标,标签名称等;
- 加载模型:下拉框绑定本地文件路径,按钮加载路径下的模型文件;
- 置信度阈值 :自定义检测区的置信度阈值,可以通过滑动条的方式设置;
- 文件上传 :选择目标文件,包含JPG格式和MP4格式;
- 开始检测:执行检测程序;
- 停止:终止检测程序;
3、预测效果展示
3.1、图片检测
切换置信度再次执行:
上图左下区域可以看到json格式的告警信息,用于反馈实际作业中的管理系统,为管理员提供道路养护决策 。
3.2、视频检测
3.3、日志文本框
4、前端代码
python
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_gui()
self.model = None
self.timer = QtCore.QTimer()
self.timer1 = QtCore.QTimer()
self.cap = None
self.video = None
self.file_path = None
self.base_name = None
self.timer1.timeout.connect(self.video_show)
def init_gui(self):
self.folder_path = "model_file" # 自定义修改:设置文件夹路径
self.setFixedSize(1300, 650)
self.setWindowTitle('目标检测') # 自定义修改:设置窗口名称
self.setWindowIcon(QIcon("111.jpg")) # 自定义修改:设置窗口图标
central_widget = QtWidgets.QWidget(self)
self.setCentralWidget(central_widget)
main_layout = QtWidgets.QVBoxLayout(central_widget)
# 界面上半部分: 视频框
topLayout = QtWidgets.QHBoxLayout()
self.oriVideoLabel = QtWidgets.QLabel(self)
# 界面下半部分: 输出框 和 按钮
groupBox = QtWidgets.QGroupBox(self)
groupBox.setStyleSheet('QGroupBox {border: 0px solid #D7E2F9;}')
bottomLayout = QtWidgets.QHBoxLayout(groupBox)
main_layout.addWidget(groupBox)
btnLayout = QtWidgets.QHBoxLayout()
btn1Layout = QtWidgets.QVBoxLayout()
btn2Layout = QtWidgets.QVBoxLayout()
btn3Layout = QtWidgets.QVBoxLayout()
# 创建日志打印文本框
self.outputField = QtWidgets.QTextBrowser()
self.outputField.setFixedSize(530, 180)
self.outputField.setStyleSheet('font-size: 13px; font-family: "Microsoft YaHei"; background-color: #f0f0f0; border: 2px solid #ccc; border-radius: 10px;')
self.detectlabel = QtWidgets.QLabel(self)
self.oriVideoLabel.setFixedSize(530, 400)
self.detectlabel.setFixedSize(530, 400)
self.oriVideoLabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top:75px;')
self.detectlabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top: 75px;')
topLayout.addWidget(self.oriVideoLabel)
topLayout.addWidget(self.detectlabel)
main_layout.addLayout(topLayout)
5、代码获取
更多其他数据集
注:以上均为原创内容,转载请私聊!!!