基于YOLOv5的农作物叶片病害识别系统

植物农作物叶片病虫害识别系统:农作物叶片病害AI检测与识别系统 源码 带UI界面+说明视频 模型:yolov5
功能: 农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注、记录和保存病害位置和类型,辅助作物病害防治以增加产值。主要用于常见农作物叶片病害的智能检测,利用相机采集的作物图像,基于深度学习技术识别包括苹果黑星病、绣叶、玉米灰叶斑病等30种常见的病害类型,输出病害处的标记框和对应类别,以辅助自动化农作物病害防治;软件提供登录注册功能,可进行用户管理;软件能有效识别相机采集的图片、视频等文件形式,检测叶片表面病害情况,并记录识别结果在界面表格中方便查看;可开启摄像头实时监测和统计实际农作物叶片,以检测其病害情况,系统支持结果记录、展示和保存

本商品的项目包含以下内容:
1.完整程序文件(.py等)可训练自己数据集
2.UI界面源文件、图标(.ui、.qrc、.py等)
3.训练测试数据集图片、视频文件(.png、.jpg、.mp4等)
4.项目演示视频以及项目使用说明视频(包含运行项目所需要的环境配置讲解)
功能:
1. 选择图片识别

系统允许选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有农作物识别的结果,可通过下拉选框查看单个叶片病害的识别结果。

2.视频识别

很多时候我们需要识别一段视频画面中的病害情况,这里设计了视频选择功能。点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别农作物,并将结果记录在右下角表格中。

3. 摄像头实时检测

在真实场景中,我们往往利用设备摄像头获取实时画面,同时需要对画面中的农作物进行识别,因此本文考虑到此项功能。如下图所示,点击摄像头按钮后系统进入准备状态,系统显示实时画面并开始检测画面中的农作物。

原理介绍
日常生活中常见果蔬的种类繁多,其叶片病害的类别就更多了,如何准确地自动化识别病害以提升作物产量,减少经济损失是当前一个重要问题。对于现有的植物病害检测方法还不能准确且快速地检测植物叶片中病害区域问题,这里采用技术已经成熟的基于YOLOv5的深度学习方法,用于检测马铃薯、番茄叶片等常见病害。通过数据增强和图像标注技术构建马铃薯、玉米、番茄叶片病害数据集,利用YOLOv5主干网络对病害特征的提取能力,实现叶片病害检测和识别。通过调阅资料和训练测试代码,YOLOv5不失为一种为苹果、番茄叶片病害检测的高性能解决方案,能够以较高的准确率对植物叶片病害进行分类与定位。 

系统概述:
  • 名称:农作物叶片病害AI检测与识别系统
  • 模型:YOLOv5
  • 功能
    • 自动化检测农作物叶片病害
    • 标注、记录和保存病害位置和类型
    • 辅助作物病害防治,提高作物产量
主要特性:
  1. 高精度检测:利用YOLOv5深度学习模型,实现对苹果黑星病、绣叶、玉米灰叶斑病等30种常见农作物叶片病害的高精度检测。
  2. 多输入源支持:支持从图片、视频和实时摄像头采集的数据进行病害检测。
  3. 用户友好界面:提供易于操作的图形用户界面(GUI),便于用户选择图片、视频或启动摄像头进行检测。
  4. 用户管理系统:提供用户登录注册功能,支持用户管理。
  5. 结果展示与记录:检测结果以可视化的方式展示,并记录在界面表格中方便查看。
系统功能模块:
  1. 选择图片识别

    • 用户可以选择图片文件进行识别。
    • 识别结果会在界面上展示,并可通过下拉选框查看单个叶片病害的识别结果。
  2. 视频识别

    • 支持视频文件的选择与识别。
    • 自动解析视频逐帧识别农作物,并将结果记录在右下角表格中。
  3. 摄像头实时检测

    • 支持通过摄像头获取实时画面并进行病害检测。
    • 实时画面显示在界面上,并开始检测画面中的农作物。
系统组成:
  1. 完整程序文件:包括Python源代码文件(.py等),支持训练自己的数据集。
  2. UI界面源文件:包括Qt Designer生成的用户界面文件(.ui)、图标文件(.qrc)及其对应的Python文件(.py等)。
  3. 训练测试数据集:包括图片(.png、.jpg等)和视频文件(.mp4等),用于训练和测试模型。
  4. 项目演示视频及使用说明视频:包括项目演示视频以及详细的项目使用说明视频,讲解如何配置环境并运行项目。
工作原理:

本系统基于YOLOv5模型,通过深度学习技术实现对农作物叶片病害的检测与识别。首先,构建包含各种农作物叶片病害的数据集,并对其进行标注。然后,利用YOLOv5模型的强大特征提取能力,训练模型识别病害特征。最后,通过模型预测,实现对输入图像或视频中叶片病害的检测与分类。

技术优势:
  • 高效性:YOLOv5模型具有较快的检测速度,适合于大规模数据的实时处理。
  • 准确性:经过精心训练的模型能够在复杂背景下准确识别病害。
  • 灵活性:支持多种输入源,包括图片、视频和实时摄像头流。
应用场景:
  • 农业领域:在农业生产中,利用本系统进行病害检测,提高作物产量和品质。
  • 科研机构:用于植物病理学研究,加速病害识别的研究进程。
  • 教育领域:作为教学工具,帮助学生理解植物病害检测的基本原理和技术实现。

关键代码示例

数据加载(以VOC格式为例)
1import os
2import cv2
3import xml.etree.ElementTree as ET
4import numpy as np
5
6# 数据集路径
7DATASET_PATH = 'path/to/dataset'
8IMAGES_DIR = os.path.join(DATASET_PATH, 'JPEGImages')
9ANNOTATIONS_DIR = os.path.join(DATASET_PATH, 'Annotations')
10
11# 加载数据集
12def load_dataset(directory):
13    images = []
14    annotations = []
15
16    for img_file in os.listdir(IMAGES_DIR):
17        if img_file.endswith('.jpg') or img_file.endswith('.png'):
18            img_path = os.path.join(IMAGES_DIR, img_file)
19            annotation_path = os.path.join(ANNOTATIONS_DIR, img_file.replace('.jpg', '.xml').replace('.png', '.xml'))
20            
21            image = cv2.imread(img_path)
22            tree = ET.parse(annotation_path)
23            root = tree.getroot()
24            
25            objects = []
26            for obj in root.findall('object'):
27                name = obj.find('name').text
28                bbox = obj.find('bndbox')
29                xmin = int(bbox.find('xmin').text)
30                ymin = int(bbox.find('ymin').text)
31                xmax = int(bbox.find('xmax').text)
32                ymax = int(bbox.find('ymax').text)
33                objects.append((name, [xmin, ymin, xmax, ymax]))
34            
35            images.append(image)
36            annotations.append(objects)
37
38    return images, annotations
39
40train_images, train_annotations = load_dataset(os.path.join(DATASET_PATH, 'train'))
41val_images, val_annotations = load_dataset(os.path.join(DATASET_PATH, 'val'))
42test_images, test_annotations = load_dataset(os.path.join(DATASET_PATH, 'test'))
模型训练
1# 初始化YOLOv5模型
2from ultralytics import YOLO
3
4model = YOLO('yolov5s.pt')
5
6# 转换VOC格式到YOLO格式
7def convert_voc_to_yolo(annotations, image_shape=(640, 640), class_names=['Apple Scab', 'Rust', 'Corn Gray Leaf Spot', ...]):
8    yolo_annotations = []
9    class_map = {name: i for i, name in enumerate(class_names)}
10    
11    for ann in annotations:
12        converted = []
13        for name, obj in ann:
14            class_id = class_map[name]
15            x_center = (obj[0] + obj[2]) / 2 / image_shape[1]
16            y_center = (obj[1] + obj[3]) / 2 / image_shape[0]
17            width = (obj[2] - obj[0]) / image_shape[1]
18            height = (obj[3] - obj[1]) / image_shape[0]
19            converted.append([class_id, x_center, y_center, width, height])
20        yolo_annotations.append(converted)
21    return yolo_annotations
22
23# 定义训练参数
24EPOCHS = 100
25BATCH_SIZE = 16
26
27# 转换并训练模型
28train_yolo_annots = convert_voc_to_yolo(train_annotations)
29val_yolo_annots = convert_voc_to_yolo(val_annotations)
30
31results = model.train(data='crop_leaf_disease_detection.yaml', epochs=EPOCHS, batch=BATCH_SIZE)
模型检测
1# 加载训练好的模型
2model = YOLO('best.pt')
3
4# 检测图像
5def detect_leaf_diseases(image):
6    results = model.predict(image)
7    for result in results:
8        boxes = result.boxes
9        for box in boxes:
10            x1, y1, x2, y2 = box.xyxy[0]
11            conf = box.conf
12            class_id = box.cls
13            
14            # 显示结果
15            cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
16            class_name = ['Apple Scab', 'Rust', 'Corn Gray Leaf Spot', ...][class_id]
17            cv2.putText(image, f'{class_name}, Conf: {conf:.2f}', (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
18    
19    return image
20
21# 测试图像
22test_image = cv2.imread('path/to/test_image.jpg')
23result_image = detect_leaf_diseases(test_image)
24cv2.imshow('Detected Leaf Diseases', result_image)
25cv2.waitKey(0)
26cv2.destroyAllWindows()
配置文件 crop_leaf_disease_detection.yaml
 
1train: path/to/train/images
2val: path/to/val/images
3test: path/to/test/images
4
5nc: 30  # Number of classes
6names: ['Apple Scab', 'Rust', 'Corn Gray Leaf Spot', ...]  # Class names
7
8# Training parameters
9batch_size: 16
10epochs: 100
11img_size: [640, 640]  # Image size
用户界面(使用PyQt5)
 

python

深色版本

1import sys
2from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QFileDialog, QVBoxLayout, QWidget, QTableWidget, QTableWidgetItem, QMessageBox
3from PyQt5.QtGui import QPixmap, QImage
4import cv2
5
6class MainApp(QMainWindow):
7    def __init__(self):
8        super().__init__()
9        self.initUI()
10
11    def initUI(self):
12        self.setWindowTitle('农作物叶片病害识别系统')
13        self.setGeometry(100, 100, 800, 600)
14
15        self.image_label = QLabel(self)
16        self.image_label.setGeometry(10, 10, 400, 400)
17
18        self.result_table = QTableWidget(self)
19        self.result_table.setGeometry(420, 10, 360, 400)
20        self.result_table.setColumnCount(2)
21        self.result_table.setHorizontalHeaderLabels(['病害名称', '置信度'])
22
23        self.load_button = QPushButton('选择图片', self)
24        self.load_button.clicked.connect(self.loadImage)
25        self.load_button.move(10, 420)
26
27        self.detect_button = QPushButton('检测病害', self)
28        self.detect_button.clicked.connect(self.detectDiseases)
29        self.detect_button.move(120, 420)
30
31    def loadImage(self):
32        options = QFileDialog.Options()
33        file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.bmp);;所有文件 (*)", options=options)
34        if file_name:
35            pixmap = QPixmap(file_name)
36            self.image_label.setPixmap(pixmap.scaled(400, 400, Qt.KeepAspectRatio))
37            self.image_path = file_name
38
39    def detectDiseases(self):
40        if hasattr(self, 'image_path'):
41            image = cv2.imread(self.image_path)
42            result_image = detect_leaf_diseases(image)
43            cv2.imwrite('detected_image.jpg', result_image)
44            pixmap = QPixmap('detected_image.jpg')
45            self.image_label.setPixmap(pixmap.scaled(400, 400, Qt.KeepAspectRatio))
46
47            self.result_table.clearContents()
48            self.result_table.setRowCount(len(result_image['labels']))
49            for row, label in enumerate(result_image['labels']):
50                item = QTableWidgetItem(label['name'])
51                self.result_table.setItem(row, 0, item)
52                item = QTableWidgetItem(f"{label['confidence']:.2f}")
53                self.result_table.setItem(row, 1, item)
54
55if __name__ == '__main__':
56    app = QApplication(sys.argv)
57    ex = MainApp()
58    ex.show()
59    sys.exit(app.exec_())

说明

  1. 数据加载:用于加载训练、验证和测试数据集,并转换成模型所需的格式。
  2. 模型训练:初始化YOLOv5模型,并进行训练。
  3. 模型检测:加载训练好的模型,并进行图像检测。
  4. 用户界面:使用PyQt5创建一个简单的图形用户界面,允许用户选择图片并显示检测结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143033.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis XML映射文件编写【后端 18】

MyBatis XML映射文件编写 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs …

红帽7—Mysql的源码编译

到官网选择源码进行安装 使用wget命令下载链接 下载安装后对文件包进行解压 [rootnginx ~]# tar zxf mysql-boost-5.7.44.tar.gz 安装cmake编译工具 [rootnginx ~]# yum install cmake 使用源码编译安装mysql [rootmysql-node10 mysql-5.7.44]# cmake \ -DCMAKE_INSTALL_PRE…

6个Python小游戏项目源码【免费】

6个Python小游戏项目源码 源码下载地址: 6个Python小游戏项目源码 提取码: bfh3

Stable diffusion 学习过程

diffusion model 讲解: 【较真系列】讲人话-Diffusion Model全解(原理代码公式)_哔哩哔哩_bilibili stable diffusion【CVPR2022】 原始论文: https://arxiv.org/pdf/2112.10752 讲解:【论文简介】Stable Diffusion的基础论文:2112.High…

JZ2440开发板——S3C2440的UART的使用

以下内容源于韦东山课程的学习与整理,如有侵权请告知删除。 一、UART硬件简介 UART,全称是“Universal Asynchronous Receiver Transmitter”,即“通用异步收发器”,也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

牛客周赛 Round 60(下)

构造序列 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> #include<stdio.h> #include<math.h> using namespace std; int main() {int n, m;cin >> n >> m;int minVal min(n, m);int maxVal max(n, m);cout …

右值生命周期的延长

第一个例子&#xff1a; output&#xff1a; result&#xff08;&#xff09;创建了一个临时对象&#xff0c;它是一个右值&#xff0c;通过结果我们可以看到直到main函数结束时这个对象才调用了析构函数&#xff1b; result&#xff08;&#xff09;返回右值&#xff0c;我…

面向对象分析与设计-系统架构师(六十七)

1网络设计过程包括逻辑网络设计和物理网络设计两个阶段&#xff0c;下面的选项中&#xff0c;&#xff08;&#xff09;应该属于逻辑网络设计阶段的任务。 A选择路由协议 B设备选型 C结构化布线 D机房设计 解析&#xff1a; 物理网络设计的内容包括&#xff1a;设备选型、…

pdf去水印怎么去掉免费?6个pdf去除水印的方法快码住,超级好用!

pdf去水印怎么去掉免费&#xff1f;您是否有一些带有水印的pdf文档&#xff0c;让您感觉到头疼&#xff1f;您又是否希望能够去除这些水印&#xff0c;或者想用其他水印来替换现有的水印&#xff1f;如果是这样的话&#xff0c;我非常推荐您继续阅读本篇文章。本文将为您提供一…

Gateway网关的实现

API网关 网关路由必须支持负载均衡&#xff0c;服务列表是从注册中心拉取的客户端发出请求的URL指向的是网关&#xff0c;URL还必须要包含目标信息网关收到URL&#xff0c;通过一定的规则&#xff0c;要能识别出交给哪个实例去处理网关有能力对请求响应进行修改 引入依赖包 …

使用LangGPT提示词让大模型比较浮点数

使用LangGPT提示词让大模型比较浮点数 背景介绍环境准备创建虚拟环境安装一些必要的库安装其他依赖部署大模型启动图形交互服务设置提示词与测试 LangGPT结构化提示词 背景介绍 LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-cha…

计算机视觉—3d点云数据基础

点云数据 3d点云数据由来 3d点云 3D Point Cloud是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中&#xff0c;它是一个包含多个三维坐标点&#xff08;X, Y, Z&#xff09;的集合。这些点是通过对实际物体或场景表面进行离散采样而获得的&#xff0c;因此&a…

代码随想录:动态规划4-5

42.接雨水 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,…

python正则表达式如何不区分大小写

使用python的re模块做模式匹配时&#xff0c;有时需要忽略大小写&#xff0c;只需要在re.search()函数中添加参数re.IGNORECASE即可。 mystring some string pattern some pattern match re.search(pattern, mystring, re.IGNORECASE)

【Linux】理解和解释shell命令的工具

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;C语言编程&…

2025年最新大数据毕业设计选题-Hadoop综合项目

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向&#xff0c;比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向&#xff0c;比如民宿分析、电商行为分析、天气分析等等。。。…

必备工具,AI生成证件照,再也不用麻烦他人,电子驾驶证等多种证件照一键生成

最近有一个生成证件照的开源项目很火&#xff0c;今天我们来学习一下。之前我生成证件照都是线下去拍照&#xff0c;线上使用也是各种限制&#xff0c;需要付费或看广告&#xff0c;而且效果也不是很理想&#xff0c; 今天要分享的这个 AI 证件照生成工具可以一键可以生成一寸…

深度学习之图像数据集增强(Data Augmentation)

文章目录 一、 数据增强概述二、python实现传统数据增强参考文献 一、 数据增强概述 数据增强&#xff08;Data Augmentation&#xff09;是一种技术&#xff0c;通过对现有数据进行各种变换和处理来生成新的训练样本&#xff0c;从而增加数据集的多样性和数量。这些变换可以是…

一文入门生成式AI(理解ChatGPT的原理)

一、什么是生成式AI&#xff1f; 以ChatGPT为代表的生成式AI&#xff0c;是对已有的数据和知识进行向量化的归纳&#xff0c;总结出数据的联合概率。从而在生成内容时&#xff0c;根据用户需求&#xff0c;结合关联字词的概率&#xff0c;生成新的内容。 可以这么联想&#x…

C++对象拷贝时的优化编译

在现代编译器中&#xff0c;当我们在 C中进行对象的拷贝操作时&#xff0c;编译器并非只是机械地执行逐字节的复制。相反&#xff0c;它会进行优化&#xff0c;避免不必要的拷贝构造等等&#xff0c;这种优化包括“返回值优化”&#xff08;RVO&#xff09;&#xff0c;“拷贝省…