基于【EasyDL】【图像分类】实现农作物病害识别小程序

news2024/11/30 12:52:16

内容、数据集来源:基于飞桨的农作物病害智能识别系统 - 飞桨AI Studio

项目背景 

        联合国粮食及农业组织的一份报告表明,每年农业生产的自然损失中有三分之一以上是由农业病虫害造成的,使这些成为当前影响农业生产和农业生产的最重要因素。需要考虑的农业病虫害众多,依赖于实验室观察和实验的传统方法很容易导致错误的诊断。除此之外,缺乏专业的农业技术人员往往难以及时发现病虫害以采取适当的补救措施。为了克服这些问题,许多研究人员转向使用机器学习方法和计算机视觉技术来识别农业病虫害。这首先涉及分析和处理与植物病虫害相关的图像数据。在此之后,建立机器学习模型以获得与不同图像特征相关的不同层次。最后,使用分类器来快速准确地识别不同类型的病虫害。所有采用这种方法的研究的最终目的都是为农业病虫害的防治提供技术指导。
  农业病害的图像识别比农业病虫害的识别更具挑战性。各种机器学习方法已经解决了这个问题。这些包括聚类方法、SVM分类器、贝叶斯分类器和浅层神经网络方法。许多这项工作正在进行中。然而,传统的机器学习方法在用于农业病害图像识别的实际应用中,往往存在一些不足:它们高度依赖于原始疾病图像的质量;这些方法的实现通常非常复杂;如果训练样本的数量很大,使用这些传统的机器学习方法很难有效地构建相应的模型。
  随着现代智能农业的发展,使得使用更先进、更智能的机器学习方法来利用这些数据提供的机会来提高农业病害图像的有效性变得越来越重要。机器学习方法的最新进展,如深度学习和迁移学习,在许多应用领域取得了重大突破,并开始被用于农业病害图像识别。

数据来源与数据详情 

访问顶部连接 即可自行下载数据集

        基于AI Challenger农作物叶子图像数据集包含10种植物(苹果、樱桃、葡萄、柑桔、桃、草莓、番茄、辣椒、玉米、马铃薯)的27种病害(其中24个病害有分一般和严重两种程度),合计61个分类(按“物种-病害-程度”分)的特性,训练图像总数为31718张,测试图像总数为4540张。每张图包含一片农作物的叶子,叶子占据图片主要位置。

对数据进行分类处理

EasyDL 上传的数据集为压缩包 两种类似 一种JSON文件、图片文件命名都为分类名称、另一种文件夹为分类名称,图片命名随意。小帅丶选择后者。为了快速处理、使用Java代码进行文件的迁移和文件夹创建。代码执行完进行打包生成压缩包文件。

 

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import disease.bean.DiseaseTypeBean;

import java.io.File;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created by 小帅丶 on 2023-05-11 12:34.
 * Version 1.0
 */

public class DiseaseTypeSample {

    public static void main(String[] args) {
       trainDisease();
       validDisease();
    }

    //训练数据集
    private static void trainDisease() {
        String dealPath = "F:\\share\\数据集\\disease\\";
        String filePath = "F:\\share\\数据集\\data\\AgriculturalDisease_trainingset\\";
        String fileName = "AgriculturalDisease_train_annotations.json";
        String fileContent = FileUtil.readString(filePath + fileName, Charset.defaultCharset());
        List<DiseaseTypeBean> diseaseTypeBeanList = JSON.parseArray(fileContent, DiseaseTypeBean.class);
        //基于ID分类
        Map<Integer, List<DiseaseTypeBean>> diseaseClassMap = diseaseTypeBeanList.stream()
                .collect(Collectors.groupingBy(DiseaseTypeBean::getDisease_class));
        long startTime = System.currentTimeMillis();
        //数据拆分
        for (Integer diseaseClass : diseaseClassMap.keySet()) {
            System.out.println("===当前分类:\t" + diseaseClass);
            String newFilePath = dealPath + diseaseClass;
            File file = new File(newFilePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            //读取指定分类的图片信息 存入新的文件夹
            List<DiseaseTypeBean> diseaseTypeBeans = diseaseClassMap.get(diseaseClass);
            System.out.println("===当前分类:\t" + diseaseClass +"分类数量:\t"+diseaseTypeBeans.size());
            for (DiseaseTypeBean diseaseTypeBean : diseaseTypeBeans) {
                FileUtil.copy(filePath + "images\\" + diseaseTypeBean.getImage_id(),
                        newFilePath + File.separator+diseaseTypeBean.getImage_id(),
                        true);
            }
        }
        //===总耗时:510874
        System.out.println("===总耗时:" + (System.currentTimeMillis() - startTime));
    }

    //验证数据集
    private static void validDisease() {
        String dealPath = "F:\\share\\数据集\\diseasetrain\\";
        String filePath = "F:\\share\\数据集\\data\\AgriculturalDisease_validationset\\";
        String fileName = "AgriculturalDisease_validation_annotations.json";
        String fileContent = FileUtil.readString(filePath + fileName, Charset.defaultCharset());
        List<DiseaseTypeBean> diseaseTypeBeanList = JSON.parseArray(fileContent, DiseaseTypeBean.class);
        //基于ID分类
        Map<Integer, List<DiseaseTypeBean>> diseaseClassMap = diseaseTypeBeanList.stream()
                .collect(Collectors.groupingBy(DiseaseTypeBean::getDisease_class));
        long startTime = System.currentTimeMillis();
        //数据拆分
        for (Integer diseaseClass : diseaseClassMap.keySet()) {
            System.out.println("===当前分类:\t" + diseaseClass);
            String newFilePath = dealPath + diseaseClass;
            File file = new File(newFilePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            //读取指定分类的图片信息 存入新的文件夹
            List<DiseaseTypeBean> diseaseTypeBeans = diseaseClassMap.get(diseaseClass);
            System.out.println("===当前分类:\t" + diseaseClass +"分类数量:\t"+diseaseTypeBeans.size());
            for (DiseaseTypeBean diseaseTypeBean : diseaseTypeBeans) {
                FileUtil.copy(filePath + "images\\" + diseaseTypeBean.getImage_id(),
                        newFilePath + File.separator+diseaseTypeBean.getImage_id(),
                        true);
            }
        }
        //===总耗时:55716
        System.out.println("===总耗时:" + (System.currentTimeMillis() - startTime));
    }


}

登录EasyDL平台

1.登录EasyDL平台EasyDL-零门槛AI开发平台EasyDL面向企业开发者提供零门槛AI开发平台,一站式支持智能标注、模型训练、服务部署等功能,内置丰富的预训练模型,支持公有云/私有化/设备端等灵活部署方式,已在工业、零售、制造、医疗等领域落地。EasyDL面向零售行业场景还提供了深度定制的EasyDL零售行业版。https://ai.baidu.com/easydl/2.上传数据集。等待平台处理完成

3.开始训练模型。小帅丶使用的为默认配置的资源(总训练耗时5小时19分钟 自身有4+小时免费额度、后续扣款使用了10块 这个价格个人还是可以接收)

4.等待训练完成(总耗时有8小时以上、反正会发短信通知)

看下图了解训练的精确率、F1召回率等

 

发布模型并接入小程序

1.发布模型、等待审核通过即可自行调用API

2.体验H5也可以。无需任何代码。即可由官方生成H5的页面进行体验

 查看小程序演示

 

 

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

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

相关文章

浅谈Vue响应式

什么是响应式 不管是自己面试还是八股文告诉你的是&#xff0c;响应式描述的是视图与数据变化之间的一种关系。但这不够准确。 要要了解什么是响应式&#xff0c;我们必须了解不管是React,还是Vue其实本质就是一个函数。 那么我们可以形象的说&#xff1a;响应式描述的就是函数…

编译C++ makefile ZXing-cpp生成条型码 二维码及识别 再试验证成功vs2022

下载ZXing-cpp源码及vs2022 cmake --help看看支持的vs 为什么没有win32呢 进到目录&#xff0c;//新建编译目录//生成vs工程 mkdir build & cd build cmake .. 中间提示opencv和qt等缺东西不要紧&#xff0c;我只用到生成条型码 release也正常。生成成功。 默认是MD 先…

记一次 .NET 某医院门诊软件 卡死分析

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他们的软件在客户那边卡死了&#xff0c;让我帮忙看下是怎么回事&#xff1f;我就让朋友在程序卡死的时候通过 任务管理器 抓一个 dump 下来&#xff0c;虽然默认抓的是 wow64 &#xff0c;不过用 soswow64.…

FreeRTOS学习笔记(四)——应用开发(二)

文章目录 0x01 互斥量互斥量的优先级继承机制互斥量应用场景互斥量运作机制互斥量控制块互斥量接口函数xSemaphoreCreateMutex()xQueueCreateMutex()prvInitialiseMutex&#xff08;&#xff09;xSemaphoreCreateRecursiveMutex()vSemaphoreDelete()xSemaphoreTake()xQueueSema…

通过nginx配置 将vue项目运行到阿里云linux服务器上

先将 我们的vue项目打包起来 打包好之后 我们在项目根目录下 找到 dist 下的 index.html 保证这个文件要能正常运行 然后 我们将这个dist文件夹 压缩一下 然后 回到项目终端 执行 scp -r ./dist.zip 用户名(如果之前没设置过就是 root)服务器公网地址:/root然后 他会要求我…

多语言网站的外包开发流程

随着互联网/移动互联网的全球普及&#xff0c;越来越多的企业希望将产品卖向全球&#xff0c;这就首先需要有一个多语言的网站来宣传公司的产品&#xff0c;那设计和开发这样的网站需要注意什么呢&#xff0c;今天和大家分享这方面的知识。北京木奇移动技术有限公司&#xff0c…

C-函数栈帧

文章目录 函数栈帧栈帧创建栈帧销毁根据栈帧关系更改值拓展 可变参数列表基本原理整形提升 命令行参数打印环境变量 函数栈帧 int MyAdd(int a, int b) {int c 0;c a b;return c; } int main() {int x 0xA;int y 0xB;int z MyAdd(x,y);system("pause");return …

怎么隐藏回收站?3个方法轻松隐藏回收站!

案例&#xff1a;怎么隐藏回收站 【我不太想把回收站放到桌面上&#xff0c;想把它隐藏了&#xff0c;请问大家有什么好的方法可以隐藏回收站吗&#xff1f;】 回收站是一个非常常见的功能&#xff0c;允许用户恢复已删除的文件。然而&#xff0c;有些人可能不希望回收站一直…

SpringMVC高手进阶

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【MySQL】-- 数据库基础

目录 MySQL概述 MySQL初期概念 小结 主流数据库 连接服务器 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 存储引擎 查看存储引擎 MySQL概述 #问&#xff1a;什么是数据库&#xff1f; MySQL初期概念 这个所谓的mysql严格…

从零开始Vue3+Element Plus后台管理系统(七)——手写一个简单的多页签组件

以前都是用别人现成的多页签组件&#xff0c;自己也想尝试下做个Vue3的版本&#xff0c;目前还只有基本功能&#xff0c;慢慢完善。 主要思路 使用 Pinia 记录页签数据、处理操作初始状态没有页签数据&#xff0c;使用默认路由数据填充右击页签&#xff0c;显示更多关闭操作…

移动云与启明星辰联合发布移动云|星辰安全品牌

数字中国时代&#xff0c;企业数字化转型不断深化&#xff0c;云安全市场发展持续高增&#xff0c;其安全更需自主可控、全程可信。基于此&#xff0c;移动云和启明星辰共同打造移动云|星辰安全品牌&#xff0c;聚力协行共筑安全云的压舱石&#xff0c;携手共塑中国云安全产业发…

原神服务器服务端多人联机教程

原神服务器服务端多人联机教程 大家好&#xff0c;我是艾西在上一篇文章中我们说了win系统服务器怎么搭建原神服务端&#xff0c;在最后结尾时有带一嘴怎么改为多人联机但不是很详细。哪么这篇文章艾西会给小伙伴们说清楚原神服务端怎么改为多人联机&#xff0c;毕竟玩游戏肯定…

MySQL高级语句(一)

一、SQL高级语句 1、 SELECT 显示表格中一个或数个栏位的所有资料 语法&#xff1a;SELECT "字段" FROM "表名"; select * from test1; select name from test1; select name,sex from test1;2、DISTINCT 不显示重复的内容 语法&#xff1a;SELECT D…

pdf怎么转换成ppt?4种方法1分钟处理

​ pdf怎么转换成ppt&#xff1f;在日常的办公中&#xff0c;经常需要进行PDF文件格式的转换。例如&#xff0c;我们从互联网上下载的许多资料都是以PDF格式保存的。此外&#xff0c;在使用Microsoft Office时&#xff0c;有些用户需要将Word文档转换为PDF格式&#xff0…

MySQL的概念、编译安装,以及自动补全

一.数据库的基本概念 1、数据&#xff08;Data&#xff09; • 描述事物的符号记录 • 包括数字&#xff0c;文字&#xff0c;图形&#xff0c;图像&#xff0c;声音&#xff0c;档案记录等 • 以“记录”形式按统一的格式进行存储 2、表 • 将不同的记录组织在一起 • …

JavaWeb08(MVC应用02[家居商城]连接数据库)

目录 一.绑定分类 1.1 效果预览 1.2 代码实现 ①底层代码 ②前端代码 二.绑定所有商品 2.1 效果预览 2.2.代码实现 ①底层代码 ②前端代码 三.分类查询 3.1效果预览 3.2代码实现 ①底层代码 ②前端代码 四.模糊查询 4.1 效果预览 4.2代码实现 ①底层代码 ②前…

一图看懂 zipp 模块:ZipFile 的一些兼容子类和补充接口,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 zipp 模块&#xff1a;ZipFile 的一些兼容子类和补充接口&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块图&#x1f9ca;类关…

直观理解torch.gather函数(带图)

直观理解torch.gather函数 1. gather的作用 因为深度学习里面&#xff0c;像分类或者分割&#xff0c;有时候去进行loss计算或准确度计算的时候&#xff0c;需要挑选某个维度特定的值&#xff0c;所以有了这么个函数。注意不要高估这个函数的能力&#xff0c;这个函数只是在指…

大数据技术之Sqoop

第1章 Sqoop简介 Sqoop是一款开源的工具&#xff0c;主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如 &#xff1a; MySQL ,Oracle ,Postgres等&#xff09;中的数据导进到Hadoop的HDFS中&…