⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)

news2024/11/26 10:23:57

💛前情提要💛

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


📌导航小助手📌

  • 💡本章重点
  • 🍞一. 概述
  • 🍞二. 演示效果
  • 🍞三.核心逻辑
  • 🫓总结


💡本章重点

  • 农作物病害分类(Web端实现)

🍞一. 概述

农作物病害是国家粮食安全的一个主要威胁,是决定农作物产量和质量的主要因素。 由于传统方法缺乏必要的基础设施,并且极大程度依赖于人工经验,故诸多地区难以迅速高效地防治病害,从而影响农业的发展。因此,精确诊断农作物病害对于促进农业可持续发展至关重要。针对传统的农作物病害识别方法具有主观性并且极大程度依赖于人工经验的不足,利用卷积神经网络对农作物病害进行识别与分类。

  1. 首先,利用数据增强技术扩充农作物病害原始数据集,增加数据的多样性和数量,同时可以提高训练网络的泛化能力和识别精度;

  2. 然后搭建卷积神经网络对农作物图像进行病虫害的特征提取和分类,实现对农作物病害的准确识别和分类。

  3. 最后通过搭建本地Web实现识别分类的可视化,可以详见视频。值得注意的是作者本人使用的是PlantVillage数据集进行训练、验证以及测试的。

Plant Village数据集共包含14中植物类别,分别为苹果、蓝莓、樱桃、玉米、葡萄、柑橘、桃、胡椒、马铃薯、树莓、大豆、南瓜、草莓和番茄。


🍞二. 演示效果

在这里插入图片描述

识别界面

在这里插入图片描述


🍞三.核心逻辑

flask的路由设置代码

import os
from flask import Flask, redirect, render_template, request
from PIL import Image
import torchvision.transforms.functional as tf
import CNN
import numpy as np
import torch
import pandas as pd
import smtplib
from email.mime.text import MIMEText

disease_info = pd.read_csv('static/materials/disease_infov1.csv', encoding='utf-8')

supplement_info = pd.read_csv('static/materials/supplement_info.csv', encoding='utf-8')

model = CNN.CNN(38)
model.load_state_dict(torch.load("static/save_model/plant_disease_model_xhh500.pt"))
model.eval()


def prediction(image_path):
    image = Image.open(image_path)
    image = image.resize((224, 224))
    input_data = tf.to_tensor(image)
    input_data = input_data.view((-1, 3, 224, 224))
    output = model(input_data)
    output = output.detach().numpy()
    index = np.argmax(output)
    return index


app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home_page():
    return render_template('home.html')


@app.route('/contact')
def contact():
    return render_template('contact.html')


@app.route('/services')
def services():
    return render_template('services.html')


@app.route('/about')
def about():
    return render_template('about.html')

@app.route('/typo')
def buchong():
    return render_template('typo.html')

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    if request.method == 'POST':
        image = request.files['image']
        filename = image.filename
        file_path = os.path.join('static/uploads', filename)
        image.save(file_path)
        print(file_path)
        pred = prediction(file_path)
        title = disease_info['disease_name'][pred]
        description = disease_info['description'][pred]
        prevent = disease_info['Possible Steps'][pred]
        image_url = disease_info['image_url'][pred]
        print(f"image_url: {image_url}")
        supplement_name = supplement_info['supplement name'][pred]
        supplement_image_url = supplement_info['supplement image'][pred]
        supplement_buy_link = supplement_info['buy link'][pred]
        return render_template('submit.html', title=title, desc=description, prevent=prevent,
                               image_url=image_url, pred=pred, sname=supplement_name, simage=supplement_image_url,
                               buy_link=supplement_buy_link)


@app.route('/market', methods=['GET', 'POST'])
def market():
    return render_template('market.html', supplement_image=list(supplement_info['supplement image']),
                           supplement_name=list(supplement_info['supplement name']),
                           disease=list(disease_info['disease_name']), buy=list(supplement_info['buy link']))


if __name__ == '__main__':
    app.config['JSON_AS_ASCII'] = False
    app.run(debug=True)

模型训练的代码

import pandas as pd
import torch.nn as nn


class CNN(nn.Module):
    def __init__(self, K):
        super(CNN, self).__init__()
        self.conv_layers = nn.Sequential(
            # conv1
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(32),
            nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(32),
            nn.MaxPool2d(2),
            # conv2
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(64),
            nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(64),
            nn.MaxPool2d(2),
            # conv3
            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(128),
            nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(128),
            nn.MaxPool2d(2),
            # conv4
            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(256),
            nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.BatchNorm2d(256),
            nn.MaxPool2d(2),
        )

        self.dense_layers = nn.Sequential(
            nn.Dropout(0.4),
            nn.Linear(50176, 1024),
            nn.ReLU(),
            nn.Dropout(0.4),
            nn.Linear(1024, K),
        )

    def forward(self, X):
        out = self.conv_layers(X)

        # Flatten
        out = out.view(-1, 50176)

        # Fully connected
        out = self.dense_layers(out)

        return out


idx_to_classes = {0: 'Apple___Apple_scab',
                  1: 'Apple___Black_rot',
                  2: 'Apple___Cedar_apple_rust',
                  3: 'Apple___healthy',
                  4: 'Blueberry___healthy',
                  5: 'Cherry___healthy',
                  6: 'Cherry___Powdery_mildew',
                  7: 'Corn___Cercospora_leaf_spot Gray_leaf_spot',
                  8: 'Corn___Common_rust',
                  9: 'Corn___Northern_Leaf_Blight',
                  10: 'Corn___healthy',
                  11: 'Grape___Black_rot',
                  12: 'Grape___Esca_(Black_Measles)',
                  13: 'Grape___Leaf_blight_(Isariopsis_Leaf_Spot)',
                  14: 'Grape___healthy',
                  15: 'Orange___Haunglongbing_(Citrus_greening)',
                  16: 'Peach___Bacterial_spot',
                  17: 'Peach___healthy',
                  18: 'Pepper,_bell___Bacterial_spot',
                  19: 'Pepper,_bell___healthy',
                  20: 'Potato___Early_blight',
                  21: 'Potato___Late_blight',
                  22: 'Potato___healthy',
                  23: 'Raspberry___healthy',
                  24: 'Soybean___healthy',
                  25: 'Squash___Powdery_mildew',
                  26: 'Strawberry___Leaf_scorch',
                  27: 'Strawberry___healthy',
                  28: 'Tomato___Bacterial_spot',
                  29: 'Tomato___Early_blight',
                  30: 'Tomato___Late_blight',
                  31: 'Tomato___Leaf_Mold',
                  32: 'Tomato___Septoria_leaf_spot',
                  33: 'Tomato___Spider_mites Two-spotted_spider_mite',
                  34: 'Tomato___Target_Spot',
                  35: 'Tomato___Tomato_Yellow_Leaf_Curl_Virus',
                  36: 'Tomato___Tomato_mosaic_virus',
                  37: 'Tomato___healthy'}


🫓总结

综上,我们基本了解了“一项全新的技术啦” 🍭 ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

【传知科技 – 了解更多新知识】

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

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

相关文章

国家超算互联网测评——用一分钱的显卡做大模型微调

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 背景信息 算力、算法、数据,…

Vulhub Rickdiculously Easy 靶机详解

项目地址 https://download.vulnhub.com/rickdiculouslyeasy/RickdiculouslyEasy.zip实验过程 将下载好的靶机导入到VMware中,设置网络模式为NAT模式,然后开启靶机虚拟机 使用nmap进行主机发现,获取靶机IP地址 nmap 192.168.47.1-254根据对…

1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接&#x…

uniapp 常用的地区行业各种多选多选,支持回显,复制粘贴可使用

uniapp 常用的地区行业各种多选多选,支持回显 必须导入uni-popup 弹出层 该组件 1.目前项目开发中使用到这类似挺多的,记录一下,方便以后是使用 2.使用前提,目前不做无限级,只支持二维数组,模板里只循环了两…

在此处打开Powershell窗口出现“Set-Location : 找不到接受实际参数“xxx”的位置形式参数。”

在此处打开Powershell窗口出现“Set-Location : 找不到接受实际参数“xxx”的位置形式参数。” 0x00 缘起0x01 方法1. 打开注册表编辑器2. 修改注册项数据3. 验证效果 0x02 结论0x03 参考0x04 后记 0x00 缘起 使用带有空格的用户文件夹名称(如:My PC&a…

驱动模块操作以及printk命令

文章目录 一、驱动模块操作命令1. 安装模块 insmod2. 查看模块 lsmod3. 卸载模块 rmmod4. 问题总结 二、printk打印语句1. 内核中的打印级别2. 通过级别过滤打印信息3. 修改默认消息级别4. 测试消息级别① 原始终端查看② dmesg命令 5. 打印信息的宏定义 一、驱动模块操作命令 …

光纤光学——弱导光纤与线偏振模

一、基本思想 弱导光纤:n1≈ n2 , k0n1 ≈ k0n2,亦即: k0n1 ≈ k0 n2 ≈ 光线与纤轴的夹角小;芯区对光场的限制较弱; 消逝场在包层中延伸较远。 弱导光纤场的特点: HEι1,m模式与EHι-1,m色散曲线相近…

企智汇项目管理软件:工程版,弱电版,集成版,生产制造等多个行业版本,全行业覆盖

企智汇项目管理软件是一款功能全面且适用于多行业的项目管理工具,以下是对该软件及其不同版本的详细介绍: 企智汇项目管理软件是一款集CRM、OA、PMS、CMS、ERP等多个子系统于一体的全方位平台,旨在为企业提供一站式项目管理解决方案。该软件…

Qt项目实战:图片轮播器

目录 一.设置背景于初始化图像 二.设置定时器 三.定时器到更新图片 四.鼠标点击暂停更新和打开更新 五.效果 六.代码 1.h 2.cpp 一.设置背景于初始化图像 二.设置定时器 三.定时器到更新图片 四.鼠标点击暂停更新和打开更新 五.效果 六.代码 1.h #ifndef WIDGET_H #d…

MyHdfs代码分享

关于hdfs协议层相关的的解析已经比较全面,但是大多的分析停留在理论层面。为此笔者通过对hadoop源码的整理,完成了myhdfs项目。此项目有个特点是不依赖于任何hadoop的maven包,但却可以作为原生的hadoop客户端的server。项目暂时已经完成了rpc…

10月24日程序员节!GameViewer远程体验副屏串流和远程办公功能

10月24日是程序员节,在这里祝所有编程爱好者和专业人士节日快乐! 我相信,对于程序员来说,拥有一件称心如意的工具提高办公生产力,要比任何一件礼物都重要。这么特别的日子,当然要选择一款合适的远程控制软件…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载:https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器:192.168.20.128(Windows操作系统) 靶机:192.168.20.0/24 目标:获取2个flagroot权限 具体流程 …

026_net基于Net的鲜花销售系统2024_97irnin0

目录 系统展示 设计思路 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的:分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明:由于Gif录制工具帧率不够,渲染60帧用了4.6秒,平均帧率在12Hz左右,所以展示效果不好,想要看好些的效果可以看文章下面…

《地下蚁国》风灵月影十项修改器使用教程

《地下蚁国》是一款引人入胜的模拟策略类游戏,玩家可以在游戏中体验蚂蚁王国的生存与壮大。为了进一步提升玩家的游戏体验,地下蚁国修改器应运而生。这款修改器能够协助玩家轻松获得游戏中的各种资源和优势,使游戏过程更加顺畅和便捷。通过利…

Java基于SSM框架的教学辅助微信小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

iOS Swift逆向——deMangle过程中的偏移计算

碰到好多函数最开始都会调用这个函数&#xff0c;xref了一下&#xff0c;发现有上万个xref。 __int64 __fastcall sub_1000B6ED0(__int64 *a1) {__int64 result; // x0result *a1;if ( result < 0 ){result swift_getTypeByMangledNameInContext((char *)a1 (int)result…

国家唯一认证的防脱发产品,双11速速囤

脱发的一定都深刻知道掉发严重反复折磨的痛苦&#xff01;为了能早点调理好掉发严重的问题&#xff0c;真的买了一堆育发液&#xff0c;也是踩了不少雷&#xff0c;今天就把用过好用的分享出来&#xff0c;有需要的趁着双十一赶紧囤点~ 一、露卡菲娅防脱精华液&#xff1a;科技…

哈希表模拟封装unordered_map和unordered_set

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 前言&#xff1a; 一哈希表的调用&#xff1a; 二底层hash的修改操作…

Linux隐藏权限介绍

隐藏权限概览 在Linux系统中&#xff0c;有时即便是以root用户身份&#xff0c;你也可能遇到无法修改特定文件的情况。这种限制往往源自chattr命令的应用&#xff0c;该命令用于为文件或目录设置“隐藏权限”&#xff0c;即底层属性&#xff0c;以增强系统安全性。值得注意的是…