暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 Dream-Y.ocean 2024-10-22
171

💛前情提要💛

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

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

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

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

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


📌导航小助手📌


💡本章重点

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

🍞一. 概述

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

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

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

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

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


🍞二. 演示效果

image.png

识别界面

image.png


🍞三.核心逻辑

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'}

🫓总结

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

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

感谢你们的阅读😆

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

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

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论