基于Python机器学习实现的花卉识别

article/2025/9/12 22:28:38

目录

  1. 问题分析 3
  2. 问题求解 3
    2.1. 数据预处理 3
    2.1.1. 预处理流程 3
    2.1.2. 预处理实现 4
    2.2. 降维可视化 4
    2.2.1. 降维流程分析 4
    2.2.2. PCA 方法降维 4
    从图中给出的结果得到各个阶段的用时 6
    2.2.3. t-SNE 方法求解 7
  3. 随机产生初始解,得到在低维空间中的映射样本𝑌 7
  4. 通过梯度下降和动量法对结果进行更新 7
  5. 算法在达到指定的迭代步数时,停止迭代 7
    2.2.3.3.t-SNE 实现结果 7
    2.2.4. LDA 方法求解 10
    2.2.4.1. LDA 算法原理 10
    2.2.4.2. LDA 实现过程 10
  6. 则降维后的结果为𝑧𝑖 = 𝑊𝑇𝑥𝑖 10
    2.2.4.3. LDA 实现结果 10
    2.2.4.4. LDA 模型性能 12
    从图中给出的结果得到各个阶段的用时 12
    2.2.5. 自编码器方法求解 13
    2.2.5.1 .自编码器算法原理 13
    2.2.5.2 .自编码器实现过程 13
    2.2.5.3 .自编码器实现结果 14
    2.2.5.4 .自编码器模型性能 15
    2.2.6. 不同降维可视化方法比较和分析 16
    2.2.6.1 .不同降维可视化方法比较 16
    2.2.6.2 .不同降维可视化方法分析 16
    2.3. 聚类分析 16
    2.3.1. 聚类流程分析 16
    2.3.2. 聚类评价标准说明 17
    2.3.2.1 .标准化后的互信息 17
    2.3.2.2 .调整后的兰德系数 17
    2.3.2.3.Fowlkes-Mallows 分数 17
    2.3.2.4.准确率 17
    2.3.3. K-Means 方法聚类 17
    2.3.3.1.K-Means 聚类原理 17
    2.3.3.2.K-Means 聚类实现过程 18
  7. 初始划分 K 个聚类,选择中心点 18
    2.3.3.3.K-Means 聚类结果 18
    2.3.3.4.K-Means 聚类性能 18
    2.3.4. K-Means++方法聚类 18
    2.3.4.1.K-Means++聚类原理 18
    2.3.4.2.K-Means++聚类实现过程 18
    2.3.4.3.K-Means++聚类结果 19
    2.3.4.4.K-Means++聚类性能 19
    2.3.5. SOM 方法聚类 19
    2.3.5.1. SOM 聚类原理 19
    2.3.5.2. SOM 聚类实现过程 19
    2.3.5.3. SOM 聚类结果 20
    2.3.5.4. SOM 聚类性能 20
    2.3.6. PCA+K-Means 方法聚类 20
    2.3.7. PCA+K-Means++方法聚类 20
    2.3.8. PCA+SOM 方法聚类 21
    2.3.9. 聚类方法对比和总结 21
    2.4. 深度学习和非深度学习识别分类 22
    2.4.1. 非深度学习识别分类 22
    2.4.1.1 .数据处理 22
  8. PCA 降维原理:在降维中已经做过说明,这里不再阐述 22
    2.4.1.3 .实现过程 22
    2.4.1.4 .实验结果 22
    2.4.1.5 .模型性能 23
    2.4.2. 深度学习识别分类 23
    2.4.2.1 .数据处理 23
    2.4.2.2 .算法原理 23
    2.4.2.3 .实现过程 25
    2.4.2.4 .实验结果与模型性能结果 25
    2.4.2.5 .模型性能分析 26
  9. 总结 26
    1.问题分析
    本次任务以花卉识别为题,借用机器学习方法,完成降维可视化、聚类分析、识别分类等任务。
    降维可视化是在以 PCA、tSNE 等方法,将花卉数据进行降维,得到降维后的二维图像, 这样便可以将其在平面上展示出来。聚类分析是利用合适的聚类方法,对花卉数据进行聚类, 将聚类之后的结果与标签进行对应,讨论不同聚类方法的结果。使用非深度学习和深度学习的方法,对已经标注完成但是可能含有误标数据的花卉样本进行分类,得到最终的花卉识别准确率。
    2.问题求解
    2.1.数据预处理
    2.1.1.预处理流程
    给定的数据集为 jpg 格式的数据,由于读取 jpg 格式的图片比较慢,所以将 jpg 格式存储在 numpy 的多维数组中,将提取出的多维数组存储在磁盘中,并且在下一次读取数据时, 先判断是否存在已经打包好的多维数组文件。如果存在,那么直接读取多维数组的数据;如果不存在,那么读取源文件,并将数据存到多维数组中,再存到磁盘里,供下次使用。
    这次实验中,我分别针对降维可视化、聚类以及图片分类问题做了研究。在读入图片数据方面,我才用了事先将图片存为 numpy 数组的方式加速数据读取;降维可视化中,我采用了 PCA、t-SNE、LDA、自编码器等四种方式进行,本文转载自http://www.biyezuopin.vip/onews.asp?id=16710其中,有监督的降维方法 LDA 的降维后的图片分类效果很好,而其余的非监督方法则相对比较差;在聚类问题中,我采用了 K-
    Means、K-Means++、SOM 的方法进行聚类,之后我又结合了降维方法,对上面的三种聚类方法进行了加速,最终取得了和直接聚类相似的聚类效果、同时大大提升了运算效率;在图像分类问题中,在非深度学习方法中,我使用了 SVM 进行多分类任务,考虑到 SVM 的分类效率,我先对数据进行了降维,由于其中需要调整两个参数,我采用了两重循环遍历的方法对两个参数进行了调整,最后发现当降维数为 256、SVM 分类器的惩罚系数设为 16 时, 取得的分类效果最好,能够达到 55.5%;在深度学习方法中,我采用了 resnet50 进行分类, 在数据处理阶段,加入了 resize 和随机水平翻转的方式对数据进行增强,同时我才用了 SAM 优化器,得到了泛化能力很好的网络结果。
    从这次实验中,我又系统地回顾了模式识别过程课上学习到的各种降维、聚类以及分类方法,有了很大的收获。
from MyData import MyData
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from time import time
# PCA降维
if (__name__=="__main__"):# 是否显示降维结果show_plot = False# 是否显示各个阶段的用时show_plot_Time = True# 记录各个关键时刻的时间keyTime = []keyTime.append(time())data = MyData()pictures,labels=data.getData()vectorPictures=pictures.reshape((-1,3*80*80))keyTime.append(time())# 降到二维model = PCA(n_components=2)model.fit(vectorPictures)keyTime.append(time())result = model.transform(vectorPictures)keyTime.append(time())if(show_plot):x_min = np.min(result[:,0])x_max = np.max(result[:,0])y_min = np.min(result[:,1])y_max = np.max(result[:,1])plt.figure(1)for i in range(8):indexLabel = labels==itmpResult = result[indexLabel]tmpLabel = labels[indexLabel]plt.subplot(2,4,i+1)plt.scatter(tmpResult[:,0],tmpResult[:,1],s=1)plt.axis([x_min-0.1*(x_max-x_min),x_max+0.1*(x_max-x_min),y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])plt.title(data.Flowers[i])plt.show()plt.figure(2)legends = []for i in range(8):indexLabel = labels==itmpResult = result[indexLabel]tmpLabel = labels[indexLabel]plt.scatter(tmpResult[:,0],tmpResult[:,1],s=1)plt.legend(data.Flowers)plt.axis([x_min-0.1*(x_max-x_min),x_max+0.1*(x_max-x_min),y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])plt.show()keyTime.append(time())model = PCA(n_components=3)model.fit(vectorPictures)keyTime.append(time())result = model.transform(vectorPictures)keyTime.append(time())if(show_plot):x_min = np.min(result[:,0])x_max = np.max(result[:,0])y_min = np.min(result[:,1])y_max = np.max(result[:,1])z_min = np.min(result[:,2])z_max = np.max(result[:,2])f=plt.figure(1)for i in range(8):indexLabel = labels==itmpResult = result[indexLabel]tmpLabel = labels[indexLabel]ax=plt.subplot(2,4,i+1,projection='3d')# ax=Axes3D(f)ax.scatter(tmpResult[:,0],tmpResult[:,1],tmpResult[:,2],s=1)ax.set_zlim3d(z_min-0.1*(z_max-z_min),z_max+0.1*(z_max-z_min))ax.set_xlim3d(x_min-0.1*(x_max-x_min),x_max+0.1*(x_max-x_min))ax.set_ylim3d(y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min))plt.title(data.Flowers[i])plt.show()plt.figure(2)ax=plt.subplot(projection='3d')legends = []for i in range(8):indexLabel = labels==itmpResult = result[indexLabel]tmpLabel = labels[indexLabel]ax.scatter(tmpResult[:,0],tmpResult[:,1],tmpResult[:,2],s=1)plt.legend(data.Flowers)ax.set_zlim3d(z_min-0.1*(z_max-z_min),z_max+0.1*(z_max-z_min))ax.set_xlim3d(x_min-0.1*(x_max-x_min),x_max+0.1*(x_max-x_min))ax.set_ylim3d(y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min))plt.show()print(keyTime)if(show_plot_Time):tmp_KeyTime = np.array(keyTime)# plt.plot(tmp_KeyTime)# plt.show()yticks = np.diff(tmp_KeyTime)plt.plot(yticks)plt.yticks(yticks,yticks)plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/yho0G2j4.shtml

相关文章

如何扫一扫识别花草树木?教你高效识别花草的小妙招

如何扫一扫识别花草树木?如今金秋九月,很快桂花、菊花、满天星等这些花竞相开放,秋高气爽,毫无疑问是出门游玩的好时节。除了一些常见的花草之外,我们还可能遇到许多不认识的花草,那么这个时候我们应该怎么…

【01】花卉识别-基于tensorflow2.3实现

------------------------------------------------2021年6月18日重大更新-------------------------------------------------------------- 目前已经退出bug修复之后的tensorflow2.3物体分类代码,大家可以训练自己的数据集,快来试试吧 csdn教程链接&…

花卉识别--五个类别的检测

花卉识别–五个类别的检测 文章目录 花卉识别--五个类别的检测一、数据集的观察与查看二、将数据集分为data_train(训练集)和data_test(测试集)三、明确网络流程、建立网络结构四、定义损失函数、学习率、是否使用正则化五、存储模型、已经调用现有的训练好的模型进行测试六、画…

花卉识别(tensorflow)

参考教材:人工智能导论(第4版) 王万良 高等教育出版社 实验环境:Python3.6 Tensor flow 1.12 人工智能导论实验导航 实验一:斑马问题 https://blog.csdn.net/weixin_46291251/article/details/122246347 实验二:图像恢复 http…

常见花卉11种集锦及识别

一、月季花(蔷薇科植物) 矮小直立灌木;小枝有粗壮而略带钩状的皮刺,有时无刺。羽状复叶,小叶3-5,少数7,宽卵形或卵状矩圆形,长2-6厘米,宽1-3厘米,先端渐尖&am…

三分钟让你学会怎么识别花卉品种

有一次,我和朋友一起去旅游,来到了一个生态公园。在公园里,看到了很多美丽的花卉,但是有一种花都不认识它是什么品种,我们非常想知道它的名字和背后的故事。于是我便开始在网上搜索一些可以识别花卉的软件,…

基于TensorFlow的花卉识别

概要设计 数据分析 本次设计的主题是花卉识别,数据为TensorFlow的官方数据集flower_photos,包括5种花卉(雏菊、蒲公英、玫瑰、向日葵和郁金香)的图片,并有对应类别的标识(daisy、dandelion、roses、sunfl…

Spring Boot集成微信扫码登录(实测通过)

微信实现扫码登录 一:具体流程:1、先登录你的 [微信开放平台](https://open.weixin.qq.com)2、创建网站应用3、设置你的AppSecret和授权回调域(不用加http/https)4、开始编码实现 二:实现效果三:注意事项&a…

pc端实现微信扫码登录

pc端实现微信扫码登录 流程:使用vue-wxlogin组件当我们打开微信扫一扫,此时二维码组件会有变化,显示扫描成功 我们的手机就会弹出一个授权页面。记住让后端绑定一个微信公众,通过授权该公众就可以了 效果: 当点击同意…

Java实现微信扫码登录

微信扫码登录 1. 授权流程说明第一步:请求 code第二步:通过 code 获取 access_token第三步:通过 access_token 调用接口 2. 授权流程代码3. 用户登录和登出4. Spring AOP 校验用户有没有登录5. 拦截登录校验不通过抛出的异常 1. 授权流程说明…

vue 使用企业微信扫一扫

vue 使用企业微信扫一扫 vue 使用企业微信扫一扫 第一次调用企业微信功能,有点坑,折腾了好几天,终于好了,记录一下操作过程。 了解功能所需权限(config和agentConfig) 首先要确定使用的功能需要获取的权…

VUE实现微信扫码登录

获取access_token时序图&#xff1a; public中index.html引入 <script src"https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> 微信登录操作 new WxLogin({// 以下操作把请求到的二维码嵌入到id为"weixin"的标签中i…

微信扫码登录原理解析

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/qq_25827845/article/details/78823861冷血之心的博客&#xff09; 最近针对扫码登录机制做了一个调研&#xff0c;以下以微信网页扫码登录为例进行一个总结。 1、微信扫码登录过程&…

web微信扫码登录

微信web扫码登录的大致流程&#xff0c;最后有源码基本是够用了&#xff0c;后续登录这一块会继续完善&#xff0c;会加上shiro、redis&#xff0c;前端准备用react来做&#xff0c;搞个全套的 开始之前我们先来看几个问题&#xff0c;有兴趣的可以了解下欢迎发表评论提出意见…

使用码上登录实现微信扫一扫登录

微信扫一扫登录测试 码上登录开发和使用登录的时序图准备工作后台开发前端显示 码上登录 码上登录是一个小程序&#xff0c;对个体开发者提供了免费的微信扫一扫登录入口&#xff0c;因为微信开发者需要企业认证&#xff0c;没办法在个人网站上做测试。码上登录相当于一个桥接…

微信扫码登录的一种开发思路

微信扫码授权登录流程&#xff1a; 用户在显示二维码的页面用手机扫码授权页面跳转到指定地址&#xff0c;URL上带有参数code前端通过code向服务端请求用于权限认证的token前端后续请求在请求头带上token作为身份标识 需要解决的问题 按照上述的流程&#xff0c;前端最简单的…

java集成微信扫码登录

具体流程可以看微信官网的扫码登录文档 地址&#xff1a;https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1419316505&token&langzh_CN 一、 前期准备 1、注册 微信开放平台&#xff1a;https://open…

企业微信扫码登录

企业微信扫码登录步骤&#xff1a; 1.首先在要放置二维码的页面提供一个盒子用于防止生成的二维码 2.在当前页面将企业微信提供的js进行引入 3.调用提供的方法实例&#xff0c; 4.要获得扫码成功之后的code和state值&#xff0c;调用服务&#xff0c;就能查到当前用户的token&…

扫描微信二维码实现快速登录

一、什么是二维码 二维码又称二维条码&#xff0c;常见的二维码为QR Code&#xff0c;QR全称Quick Response&#xff0c;是一个近几年来移动设备上超流行的一种编码方式&#xff0c;它比传统的Bar Code条形码能存更多的信息&#xff0c;也能表示更多的数据类型。二维条码/二维码…

个人网站如何使用微信扫一扫登录---SpringBoot项目

文章目录 前言一、码上登录是什么&#xff1f;二、使用步骤1.登录前准备&#xff0c;获取SecretKey2.前端发起登录请求3.后端调用“码上登录”服务器3.1. 配置文件3.2. 发起请求3.3.返回的参数 4.前端显示二维码5、扫一扫登录6 、登录成功后接收用户信息7、通知前端登录成功并返…