智能果树叶部疾病识别实践,基于HOG+SVM和轻量级的CNN模型分别开发构建苹果果树叶部疾病识别分析系统

news2024/11/25 0:41:59

在农业领域中,将机器学习和深度学习模型结合应用有着广泛的实用意义,在这块相关的实践中以往的项目开发实践则是主要集中在农作物种植相关的,今天本文的主要目的就是开发构建果树叶部疾病识别分析系统,这里是以苹果果树叶部疾病数据集为例的,首先看下效果图:

 接下来看下数据集,一共包含5个类别的数据集,如下:

【AlternariaBoltch】

 【BrownSpot】

 【GreySpot】

 【Mosaic】

 【Rust】

 这里轻量级的CNN模型采用的是3层卷积神经网络,模型详情参数结构图如下所示:

 默认200次epoch迭代计算,日志输出如下所示:

 整个训练过程中准确率曲线和损失值曲线如下所示:

 结果详情如下所示:

Epoch 00194: val_loss did not improve from 0.02363
Epoch 195/200
26377/26377 [==============================] - 6s 237us/step - loss: 0.0310 - acc: 0.9814 - val_loss: 0.0270 - val_acc: 0.9833

Epoch 00195: val_loss did not improve from 0.02363
Epoch 196/200
26377/26377 [==============================] - 6s 237us/step - loss: 0.0303 - acc: 0.9799 - val_loss: 0.0249 - val_acc: 0.9799

Epoch 00196: val_loss did not improve from 0.02363
Epoch 197/200
26377/26377 [==============================] - 6s 237us/step - loss: 0.0291 - acc: 0.9804 - val_loss: 0.0243 - val_acc: 0.9841

Epoch 00197: val_loss did not improve from 0.02363
Epoch 198/200
26377/26377 [==============================] - 6s 237us/step - loss: 0.0283 - acc: 0.9821 - val_loss: 0.0246 - val_acc: 0.9837

Epoch 00198: val_loss did not improve from 0.02363
Epoch 199/200
26377/26377 [==============================] - 6s 235us/step - loss: 0.0286 - acc: 0.9802 - val_loss: 0.0238 - val_acc: 0.9837

Epoch 00199: val_loss did not improve from 0.02363
Epoch 200/200
26377/26377 [==============================] - 6s 235us/step - loss: 0.0289 - acc: 0.9807 - val_loss: 0.0243 - val_acc: 0.9833

Epoch 00200: val_loss did not improve from 0.02363
dict_keys(['val_loss', 'val_acc', 'loss', 'acc'])
Accuracy: 98.33%
=====================Finish=========================

可以看到:模型的识别效果还是很不错的,达到了98%以上。

到这里本身就结束了,但是突然想尝试基于机器学习方法也开发这样的疾病识别模型,作为和深度学习模型的对比。首先看下整体效果:

这里机器学习模型采用的路线是HOG+SVM这一经典的组合。

HOG(Histogram of Oriented Gradients)是一种用于图像特征提取的算法,广泛应用于计算机视觉领域,特别是目标检测任务。HOG算法通过计算图像局部区域的梯度方向直方图来描述图像的纹理和形状特征。以下是HOG算法的基本原理:

  1. 图像梯度计算:首先,将输入图像转换为灰度图像,然后计算每个像素的梯度信息。通常使用Sobel算子计算图像的水平和垂直梯度。

  2. 图像划分为小块:将图像划分为小的重叠区域(cell)。每个小区域通常为正方形,并包含一组像素。每个小区域的大小和形状可以根据具体需求进行选择。

  3. 梯度方向直方图计算:对于每个小区域,计算其内像素的梯度方向直方图。直方图将梯度方向范围划分为多个离散的方向区间,统计每个方向区间内梯度的强度值。

  4. 块归一化:将相邻的几个小区域(通常为2x2个)组合成一个块(block)。对每个块内的梯度方向直方图进行归一化,以增加算法对光照变化的鲁棒性。

  5. 特征向量生成:将所有块的归一化直方图串联起来,生成最终的特征向量。这个特征向量包含了图像的纹理和形状特征,并可以用于后续的目标检测或分类任务。

  6. 目标检测:使用生成的特征向量进行目标检测。通常使用滑动窗口的方法在图像上进行扫描,提取局部区域的特征向量,并使用分类器(如支持向量机)判断该区域是否包含目标。

HOG算法通过对图像局部区域的梯度方向进行统计和描述,捕捉了图像的纹理和形状信息,从而具备一定的不变性和鲁棒性。它在人体检测、行人检测等任务中取得了很好的效果,并成为了计算机视觉领域的重要算法之一。

SVM(Support Vector Machine)是一种用于分类和回归分析的机器学习算法。它基于统计学习理论中的结构风险最小化原则,通过找到一个最优超平面来划分不同类别的样本。以下是SVM算法的基本原理:

  1. 数据表示:假设我们有一个训练数据集,其中包含带有标签的样本。每个样本由一个特征向量和对应的类别标签组成。

  2. 构建超平面:SVM的目标是找到一个超平面,将不同类别的样本完全分开。超平面是一个(N-1)维的决策边界,其中N是样本的特征维度。对于二分类问题,超平面将数据空间划分为两个不同的区域,使得同一类别的样本在同一边,不同类别的样本在不同边。

  3. 最大化间隔:SVM选择具有最大间隔(Margin)的超平面。间隔是指超平面到最近的样本点的距离,SVM试图找到使得间隔最大化的超平面。最大间隔有助于提高分类器的鲁棒性,使其对新样本的泛化能力更强。

  4. 支持向量:在构建超平面的过程中,只有一部分样本被用来确定超平面,这些样本被称为支持向量(Support Vectors)。支持向量是离超平面最近的样本点,它们对于确定超平面的位置和形状起着关键作用。

  5. 核函数:对于非线性可分的问题,SVM可以通过使用核函数来将数据映射到高维空间中进行处理。核函数可以将低维空间中的样本映射到高维空间,使得在高维空间中可以更容易地找到一个线性可分的超平面。

  6. 分类和回归:一旦超平面确定,SVM可以用于分类新的未标记样本。通过计算新样本点到超平面的位置关系,可以确定其所属的类别。SVM也可以扩展到回归问题中,通过拟合一个带有最小误差的超平面来预测连续型目标变量。

SVM具有在高维空间中进行分类和回归的能力,并且对于少量支持向量的改变具有鲁棒性。它在许多实际应用中表现良好,如文本分类、图像识别、生物信息学等领域。

特征向量化核心代码实现如下所示:

def dataset2Feature(dataDir="dataset/", save_path="hogFeature.json"):
    """
    特征向量化
    """
    feature = []
    for one_person in os.listdir(dataDir):
        oneDir = dataDir + one_person + "/"
        for one_pic in os.listdir(oneDir):
            one_path = oneDir + one_pic
            print("one_path: ", one_path)
            one_vec = singleImg2Vector(pic=one_path)
            one_label = one_person
            one_vec.append(one_label)
            print("one_vec_length: ", len(one_vec))
            feature.append(one_vec)
    with open(save_path, "w") as f:
        f.write(json.dumps(feature))

模型建模核心代码实现如下所示:

#训练拟合
if not os.path.exists(model_path):
    model.fit(X_train, y_train)
else:
    model = loadModel(model_path)
#预测
y_predict = model.predict(X_test)
y_pred = y_predict.tolist()
#计算准确率
accuracy = model.score(X_test, y_test)
print("SVM model accuracy: ", accuracy)
Precision,Recall,F1=calThree(y_test,y_pred)
saveModel(model,save_path=model_path)
result={}
result['accuracy'],result['F_value']=accuracy,F1
result['precision'],result['recall']=Precision,Recall
print('type: ', type(y_test), type(y_pred))
result['y_true'],result['y_pred']=y_test,y_pred
plotConfusionMatrix(y_test, y_pred, save_path = saveDir + 'ConfusionMatrix.png')

接下来我们看下结果详情:

 准确率相关评估指标如下所示:

 可以看到:机器学习达到了85%以上的准确率,虽说也是不错的效果了,但是和深度学习CNN模型相比来说还是逊色不少的。

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

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

相关文章

springcloud环境搭建

目录 1、创建一个父项目 ​编辑 2、创建子项目 2.1创建订单系统-order ​编辑 2.2创建库存系统-stock 3、创建rest服务 3.1添加web依赖 3.2编写controller 3.3订单中需要调用库存中的扣减库存的接口 通过idea开发工具进行搭建 1、创建一个父项目 通过spring initializr…

Django基础入门:后台管理 超级用户 数据表注册操作③

Django基础入门:后台管理 超级用户 数据表注册操作③ Django Admin数据表后台管理超级用户数据表注册admin操作日志 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新星创作者,CSDN实力新星…

使用randoop自动化生成测试用例

1. 综述 使用randoop自动化生成测试用例 2. 操作 下载randoop的jar包;将jar包和所要测试的类(如Calculate.class)放在同一个文件夹;在此文件夹打开命令行提示符,输入如下命令: java -ea -classpath .;ra…

嵌入式Linux驱动开发 05:阻塞与非阻塞

文章目录 目的基础说明开发准备驱动程序应用程序 O_NONBLOCK应用程序驱动程序程序演示 poll应用程序驱动程序程序演示 异步通知应用程序驱动程序程序演示 总结 目的 不管在应用开发还是驱动开发中阻塞和非阻塞都是绕不开的话题。这篇文章将介绍相关的基础内容。 这篇文章中内…

Redis命令-认识NoSQl和Redis常见的通用命令

1. 认识NoSQL 非关系型数据库 NoSQL是指一类非关系型数据库,它们采用的数据模型不同于传统的关系模型,它通常使用键值对、文档、图形等非传统的数据结构进行数据存储,不遵循预定义的模式和模型。NoSQL数据库通常分布式、高可扩展性&#xff0…

理解Java ThreadLocal

原文链接 理解Java ThreadLocal ThreadLocal是Java提供的为每个线程存储线程独立的数据的存储方式,也就是说用ThreadLocal来保存的数据,只能被当前线程所访问,其他线程无法访问,因为只有(一个线程)当前线程…

六级备考6天|CET-6|听力第五六讲|6月11日|19:44~20:07

目录 第五讲 第六讲 第五讲 第六讲 ​​​​​​​

支付宝认证的作用是什么?考试方向有哪些?

通过考证书来提升自己的能力,是现在的打工人经常会做的事,而对于从事信息通信技术行业的人来说,可以选择的证书非常多,其中支付宝认证是一个新设立的证书,但是实用性非常高。支付宝作为我们生活中常用的软件&#xff0…

arthas 的初使用

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信…

PD QC诱骗取电应用IC《乐得瑞LDR6328S》广泛应用于各大小家电

随着现在智能家居的应用越来越广泛,带电池的产品一天比一天多,今天这篇文章就来讲一下那些支持快速充电(PD QC)的产品应用电路是怎么实现的 USB PD受电端取电芯片(乐得瑞取电受电)LDR6328S 支持多协议快充取电! 1、概述 LDR6328S…

推荐5款你可能没见过的效率软件

你有没有想过,有些软件能让你的电脑用起来更方便,更快,更好看?这篇文章就为你介绍了五款这样的软件,它们分别是BreeZip,ClipClip,燃精灵,Sticky Notes和Tabby。下面我们来看看它们都…

增强 Kubernetes 可观测性:API Server Tracing 特性已到达 Beta 版本

标题 在分布式系统中,很难弄清楚问题在哪里。 想象一个场景,这也是 Kubernetes 集群管理员最常遇到的问题,Pod 无法正常启动,这时候作为管理员,我们会先去思考这可能是哪个组件出了问题,然后去对应的组件查…

Parallel Desktop下的Centos 9 ping通网络,配置静态ip的全过程

目录 一、发现问题1. 找不到网卡配置文件2. 网络重启的命令一直无法执行成功 二、分析问题三、解决问题系统环境1. 打开网卡配置文件2. 修改ipv4配置3. 重载网卡配置文件4. ping通,可以正常上网了 四、疑问1. 如何确定自己是不是设置了静态ip2. DHCP是固定静态ip 的…

OC(iOS)中常见的面试题汇整(大全)

你如何理解OC这门语言的?谈一下你对OC的理解? OC语言是C语言的一个超集,只是在C语言的基础上加上了面向对象的语言特征,如:继承,封装,多态. 封装:把属性和方法封装成一个类,方便我们使用 多态:不同对象对于同一消息的不同响应,子类可以重写父类的方法,且…

SpringMVC简介及入门案例

1.SpringMVC简介 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点:相较于Servlet使用简单,开发便捷。灵活性比较强。 后端做表现层技术开发的框架有Servlet,SpringMVC技术同样也是做表现层技术开发框架,JDBC以及Mybatis数…

Linux内核中内存管理相关配置项的详细解析6

接前一篇文章:Linux内核中内存管理相关配置项的详细解析5 六、Memory hotplug 此项只有选中和不选中两种状态,默认为选中。 此项展开后如下图所示: 1. Online the newly added memory blocks by default 对应配置变量为:CONFIG…

神经网络编程基础

1、二分类(Binary Classification) (1)、逻辑回归(logistic regression)是一个用于二分类(binary classification)的算法。所谓二分类是由输入到判断输出结果是或者不是。比如输入一个包含动物的图片,判断这张图片中的动物是否包含猫&#x…

成为优秀自动化测试工程师的7个步骤

在这里,我将详细解释成为测试自动化工程师的七个最重要的步骤。因此,所有希望将职业转向自动化测试的人都要注意所有这些。 1. 不要忽视手动测试 虽然我了解公司正在转向无代码自动化测试工具,达到专家级别并跟上行业自动化测试工程师的竞争…

ELK 日志采集使用

1.安装ELK整体环境 1.1.安装docker环境 Docker 最新版Version 20.10安装_docker最新版本是多少_猿小飞的博客-CSDN博客 1.2.先安装docker compose 安装docker compose_猿小飞的博客-CSDN博客 1.3.使用 Docker Compose 搭建 ELK 环境 1.3.1.编写 docker-compose.yml 脚本启…