基于深度学习的植物疾病检测识别系统

news2025/1/31 11:24:27

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        农作物病害不仅影响产量,还会导致严重的经济损失。传统的病害检测方法通常依赖人工专家进行目视检查,这种方法费时费力且容易受到主观因素的影响。近年来,深度学习技术的快速发展为植物病害的自动化检测提供了新的解决方案。本项目基于迁移学习策略,以VGG卷积神经网络为 base 模型,利用 TensorFlow、Keras 等工具构建面向植物疾病监测的卷积神经网络,通过模型训练、验证测试,预测准确率达到90%。利用 Flask、Bootstrap等框架搭建交互分析平台,用户通过上传植物叶片图像,实现疾病的在线诊断。

        B站详情与代码下载:基于深度学习的植物疾病检测识别系统_哔哩哔哩_bilibili

基于深度学习的植物疾病检测识别系统

2. 植物疾病数据集读取与可视化

        利用 opencv工具读取图像数据,并利用 matplotlib 进行样本的可视化:

import cv2  # 用于图像处理
from tqdm import tqdm  # 用于显示进度条
import matplotlib.pyplot as plt  # 用于绘制图像

# 加载训练集图像
train_images = []
for name in tqdm(p_train['image_id']):  # p_train['image_id'] 应该是一个包含图像ID的 pandas Series
    path = './dataset/images/' + name + '.jpg'  # 构建文件路径
    img = cv2.imread(path)  # 使用 OpenCV 读取图像
    image = cv2.resize(img, (img_size, img_size), interpolation=cv2.INTER_AREA)  # 调整图像大小
    train_images.append(image)  # 将调整后的图像添加到列表中

# 显示四张样本训练图像
fig, ax = plt.subplots(1, 4, figsize=(15, 15))  # 创建一个子图网格
for i in range(4):
    ax[i].set_axis_off()  # 关闭坐标轴标记
    ax[i].imshow(train_images[i])  # 在子图上显示图像
plt.show()  # 显示绘图

# 加载测试集图像
test_images = []
for name in tqdm(p_test['image_id']):  # p_test['image_id'] 应该是一个包含图像ID的 pandas Series
    path = './dataset/images/' + name + '.jpg'  # 构建文件路径
    img = cv2.imread(path)  # 使用 OpenCV 读取图像
    image = cv2.resize(img, (img_size, img_size), interpolation=cv2.INTER_AREA)  # 调整图像大小
    test_images.append(image)  # 将调整后的图像添加到列表中

# 显示四张样本测试图像
fig, ax = plt.subplots(1, 4, figsize=(15, 15))  # 创建一个子图网格
for i in range(4):
    ax[i].set_axis_off()  # 关闭坐标轴标记
    ax[i].imshow(test_images[i])  # 在子图上显示图像
plt.show()  # 显示绘图

        该数据集的标签包括:healthy、multiple_diseases、rust、scab,以此是一个多标签的图像分类问题,其样本数量分布如下:

3. 缓解类别不均衡问题

        类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题。本文采用 SMOTE 上采样算法,缓解样本类别不均衡。

        SMOTE 算法(Synthetic Minority Over-sampling Technique)是一种用于处理数据集中类别不平衡问题的技术。当数据集中某个类别的样本数量远少于其他类别时,这被称为类别不平衡问题。这种不平衡可能会导致机器学习模型偏向于多数类,从而忽视少数类的预测准确率。

from imblearn.over_sampling import SMOTE 

sm = SMOTE(random_state = 115) 

x_train, y_train = sm.fit_resample(x_train.reshape((-1, img_size * img_size * 3)), y_train)
x_train = x_train.reshape((-1, img_size, img_size, 3))
x_train.shape, y_train.sum(axis=0)

 4. 构建卷积神经网络

        本项目以VGG16(也可以选择其他模型)为base模型,构建卷积神经网络:

input_shape=(img_size, img_size, 3)

base_model = tf.keras.applications.vgg16.VGG16(
    weights='./pretrained_models/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5', 
    include_top=False,
    input_shape=input_shape
)
base_model.trainable = False

model = tf.keras.Sequential()
model.add(base_model)
model.add(tf.keras.layers.Flatten())
......

model.compile(loss='categorical_crossentropy', 
              optimizer=tf.keras.optimizers.Adam(0.001),
              metrics=['acc'])
model.summary()

5. 模型训练与验证

datagen = ImageDataGenerator(rotation_range=45,
                             # shear_range=.25,
                             #  zoom_range=.25,
                              width_shift_range=.25,
                              height_shift_range=.25,
                             #  brightness_range=[.5,1.5],
                              horizontal_flip=True,
                              vertical_flip=True
                              )

epochs = 50
batch_size = 24

checkpoint = tf.keras.callbacks.ModelCheckpoint('save_models/best_model.h5', monitor='val_acc', verbose=1, mode='max',save_best_only=True)
early = tf.keras.callbacks.EarlyStopping(monitor="acc", mode="max",restore_best_weights=True, patience=5)
callbacks_list = [checkpoint, early]

history = model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),
                              epochs=epochs,
                              steps_per_epoch=x_train.shape[0] // batch_size,
                              verbose=1,
                              callbacks=callbacks_list,
                              validation_data=datagen.flow(x_val, y_val,batch_size=batch_size),
                              validation_steps=x_val.shape[0]//batch_size
)

 

Epoch 1/50
83/83 [==============================] - ETA: 0s - loss: 1.0818 - acc: 0.5717
Epoch 1: val_acc improved from -inf to 0.39444, saving model to save_models\best_model.h5
83/83 [==============================] - 318s 4s/step - loss: 1.0818 - acc: 0.5717 - val_loss: 2.4739 - val_acc: 0.3944
Epoch 2/50
83/83 [==============================] - ETA: 0s - loss: 0.8818 - acc: 0.6419
Epoch 2: val_acc improved from 0.39444 to 0.61111, saving model to save_models\best_model.h5
83/83 [==============================] - 268s 3s/step - loss: 0.8818 - acc: 0.6419 - val_loss: 1.0368 - val_acc: 0.6111
......
Epoch 16/50
83/83 [==============================] - ETA: 0s - loss: 0.6197 - acc: 0.7616
Epoch 16: val_acc did not improve from 0.69444
83/83 [==============================] - 275s 3s/step - loss: 0.6197 - acc: 0.7616 - val_loss: 0.8742 - val_acc: 0.6444
Epoch 17/50
83/83 [==============================] - ETA: 0s - loss: 0.6494 - acc: 0.7505
Epoch 17: val_acc improved from 0.69444 to 0.74167, saving model to save_models\best_model.h5
83/83 [==============================] - 409s 5s/step - loss: 0.6494 - acc: 0.7505 - val_loss: 0.7470 - val_acc: 0.7417
Epoch 18/50
83/83 [==============================] - ETA: 0s - loss: 0.6689 - acc: 0.7268
Epoch 18: val_acc did not improve from 0.74167
83/83 [==============================] - 391s 5s/step - loss: 0.6689 - acc: 0.7268 - val_loss: 0.8530 - val_acc: 0.7028
......
CPU times: total: 11h 1min 29s
Wall time: 1h 47min 10s

        模型完成训练后,利用验证集进行性能评估:

from sklearn.metrics import roc_auc_score

pred_test = model.predict(x_val)
roc_sum = 0
for i in range(4):
    score = roc_auc_score(y_val[:, i], pred_test[:, i])
    roc_sum += score
    print(f'{score:.3f}')

roc_sum /= 4
print(f'预测的验证集 AUC:{roc_sum:.3f}')

         可以看出,healthy, rust, scab 类别预测 AUC 均达到 92%左右,multiple_diseases 由于样本过少,AUC 为 77%,可以通过进一步扩充 multiple_diseases 类别的样本来进行优化。

6. 基于深度学习的植物疾病检测识别系统

6.1 系统首页

6.2 模型介绍

6.3 植物疾病在线检测

7. 结论

        本项目基于迁移学习策略,以VGG卷积神经网络为 base 模型,利用 TensorFlow、Keras 等工具构建面向植物疾病监测的卷积神经网络,通过模型训练、验证测试,预测准确率达到90%。利用 Flask、Bootstrap等框架搭建交互分析平台,用户通过上传植物叶片图像,实现疾病的在线诊断。该系统不仅可以提高病害检测的效率和准确性,还可以为农民提供及时有效的防治建议,从而减少农作物损失。

 欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python数据挖掘精品实战案例

2. 计算机视觉 CV 精品实战案例

3. 自然语言处理 NLP 精品实战案例

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

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

相关文章

【Unity】3D功能开发入门系列(一)

Unity3D功能开发入门系列(一) 一、开发环境(一)安装 Unity(二)创建项目(三)Unity 窗口布局 二、场景与视图(一)场景(二)游戏物体&…

R语言统计分析——箱线图

参考资料:R语言实战【第2版】 箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数&…

Linux真实机器安装

引言 装机电脑:具有网卡硬件、磁盘空间 > 64G、内存空间 > 4G; 装机工具:rufus,u盘(8G); 装机系统:centos7.iso; 联网工具:路由器,网线 1.…

大学新生如何高效入门编程?全面指南来助力

引言 在当今数字化时代,编程已经成为一项必备技能。无论你未来从事什么职业,编程能力都能为你的职业生涯增添光彩。对于即将步入大学的新生来说,如何高效入门编程是一道关键课题。本文将从如何选择编程语言、制定学习计划、找到顶尖学习资源…

汇昌联信科技拼多多运营如何?

汇昌联信科技拼多多运营如何?在电商行业,拼多多的崛起无疑为许多企业带来了新的机遇。作为一家专注于电子商务解决方案的公司,汇昌联信科技在拼多多的运营方面展现出了不俗的实力。他们不仅成功帮助多个品牌入驻拼多多平台,还通过精细化运营…

缺口将达到1000万?人工智能(AI)专业就业前景分析

从年初以来,人工智能一直占据着热话题榜首。随着人工智能技术的不断发展和应用,人工智能(AI)专业已经成为了近年来大学校园里最热门的专业之一,成为连续四年新增最多专业。 今天给大家介绍一下,为感兴趣的…

申瓯通信在线录音管理系统Thinkphp远程代码执行漏洞

目录 1.产品简介 2.漏洞概述 3.搜索语法 4.漏洞复现 1.产品简介 申瓯通信在线录音管理系统是一款功能强大的录音管理解决方案,旨在满足公司、集团单位在区域分布下对录音数据的集中管理需求。该系统基于SOC1900、S0C1600等系列录音盒开发,是一个多线…

VMWare虚拟机共享主机的网络访问外网

1.主机中启动客户端并连接外网 2.设置虚拟网络类型为NAT 3.启动虚拟并通过主机访问外网

从“人巡”到“智控”:EasyCVR智能视频监控技术变革河道违建监测模式

一、背景分析 随着城市化进程的加快,河道作为城市生态系统的重要组成部分,其保护与管理日益受到重视。然而,非法侵占河道、违规建设等行为时有发生,不仅破坏了河道的自然生态,还严重威胁到防洪安全和水质安全。为了有…

Google发布三款开放式人工智能模型 重点关注安全问题

Google发布了三款新的、“开放的"人工智能生成模型,并称这些模型比大多数模型"更安全”、“更小巧”、“更透明”。它们是Google Gemma 2生成模型系列的新成员,该系列于今年 5 月首次亮相。这些新模型包括 Gemma 2 2B、ShieldGemma 和 Gemma S…

Xpath元素定位

Xpath元素定位 xpath初识元素失效的场景元素失效的原因语法书写如何进行校验 xpath实战元素定位分析流程书写(一)流程书写(二) xpath初识 元素失效的场景 元素失效的原因 元素缺少class和index的定位其中class和id的属性会改变元…

计算机网络-IGMP Snooping特性

一、以太网的组播转发问题 当组播数据从最后一跳路由器发往组播组成员时,往往会经过交换机。由于组播数据的目的MAC地址是组播MAC地址,默认情况下交换机将泛洪此类数据帧,有可能导致不同组的组播流量会被别组的成员接收。 当Router将组播报文…

mysql更改密码后,若依 后端启动不了解决方案

我原先的mysql 密码是 数字字符串 我想改成000 纯数字 改完之后,连接的数据库的代码 也更改后 ,后端启动不了 因为原先 密码数字字符串 不需要用引号" " 括起来 我改成纯数字 需要用 " " 括起来 如下图 然后就可以运行成功了

KineFX —— Skeleton

一,KineFX skeletons介绍 在KineFX内,每件事都是SOP point,点的世界变换(translation, rotation, scale)由positionmatrix3*3定义; 当一个点具有transform和name属性,点就是一个joint&#xff…

RabbitMQ发送者重连、发送者确认

RabbitMQ发送者重连、发送者确认 一、发送者重连 spring:rabbitmq:connection-timeout: 1s #设置MQ的连接超时时间template:retry:enabled: true #开启超时重试机制initial-interval: 1000ms #失败后的初始等待时间multiplier: 1 #失败后下次的等待时长倍数,下次等…

Axure中文版资源免费下载!

Axure是一种专业的原型设计工具,可以帮助用户以最快的速度将产品想法转化为可视化原型,为设计师、产品经理和开发人员之间的沟通搭建桥梁。Axure功能强大,可绘制高保真原型、建立动态面板、使用复杂函数库、多人合作设计、标准化导出等功能&a…

一文带你读懂GPU算力在不同行业的应用!

随着科技的飞速发展,图形处理器(Graphics Processing Unit, GPU)已经不仅仅局限于图形渲染的传统领域,其强大的并行计算能力在多个行业得到了广泛应用。GPU算力,即图形处理器所提供的计算能力,正逐步成为推…

大模型之多模态大模型技术

本文作为大模型综述第三篇,介绍语言大模型多模态技术。 不同于语言大模型只对文本进行处理,多模态大模型将文本、语音、图像、视频等多模态数据联合起来进行学习。多模态大模型融合了多种感知途径与表达形态, 能够同时处理和理解来自不同感知通道(例如视觉、听觉、语言和触…

Python数值计算(1)——Numpy中数据的保存和加载

这里讨论一下在进行数值计算中,对计算数据的保存和加载。 1. 文本格式 这种方式可以采用文本的方式保存numpy数组,函数原型如下: numpy.savetxt(fname, X, fmt%.18e, delimiter , newline\n, header, footer, comments# , encodingNone) …

全源最短路问题:Floyd算法详解【经典算法,限时免费】

文章目录 最短路问题概述带边权的图的全源最短路径Floyd算法解决全源最短路问题dist数组初始化dist数组迭代以及动态转移方程Floyd算法求解dist数组完整代码pythonjavacpp时空复杂度 *Floyd算法正确性证明证明过程初始情况归纳假设归纳步骤终止条件 完整证明 相关题目 最短路问…