花卉识别(tensorflow)

article/2025/9/12 23:52:06

参考教材:人工智能导论(第4版) 王万良 高等教育出版社
实验环境:Python3.6 + Tensor flow 1.12

人工智能导论实验导航

实验一:斑马问题 https://blog.csdn.net/weixin_46291251/article/details/122246347

实验二:图像恢复 https://blog.csdn.net/weixin_46291251/article/details/122561220

实验三:花卉识别 https://blog.csdn.net/weixin_46291251/article/details/122561505

实验四:手写体生成 https://blog.csdn.net/weixin_46291251/article/details/122576478

实验源码: xxx

3.1实验介绍

3.1.1实验背景

深度学习为人工智能核心技术,本章主要围绕深度学习涉及的全连接神经网络、卷积神经网络和对抗神经网络而开设的实验。
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification)

3.1.2实验目的

本章实验的主要目的是掌握深度学习相关基础知识点,了解深度学习相关基础知识,经典全连接神经网络、卷积神经网络和对抗神经网络。掌握不同神经网络架构的设计原理,熟悉使用Tensorflow 2.1深度学习框架实现深度学习实验的一般流程。

3.1.3实验简介

随着电子技术的迅速发展,人们使用便携数码设备(如手机、相机等)获取花卉图像越来越方便,如何自动识别花卉种类受到了广泛的关注。由于花卉所处背景的复杂性,以及花卉自身的类间相似性和类内多样性,利用传统的手工提取特征进行图像分类的方法,并不能很好地解决花卉图像分类这一问题。在这里插入图片描述

本实验基于卷积神经网络实现的花卉识别实验与传统图像分类方法不同,卷积神经网络无需人工提取特征,可以根据输入图像,自动学习包含丰富语义信息的特征,得到更为全面的花卉图像特征描述,可以很好地表达图像不同类别的信息。

3.2概要设计

本实验将用户在客户端选取的花卉图像作为输入,运行花卉识别模型,实时返回识别结果作为输出结果并显示给用户。

3.2.1功能结构

花卉识别实验总体设计如下图所示,该实验可以划分为数据处理、模型构建、图像识别三个主要的子实验。
其中数据处理子实验包括数据集划分、图像预处理两个部分;
模型构建子实验主要包括模型定义、模型训练以及模型部署三个部分;
图像识别子实验内容主要包括读取花卉图像、运行推断模型进行图像特征提取,输出模型识别结果三个部分。在这里插入图片描述

3.2.2体系结构

按照体系结构划分,整个实验的体系结构可以划分为三部分,分别为模型训练、模型保存和模型推理,如图5-3所示。各层侧重点各不相同。
训练层运行在安装有tensorflow框架的服务器,最好配置计算加速卡。
推断层运行于开发环境,能够支持卷积神经网络的加速。
展示层运行于客户端应用程序,能够完成图像选择并实时显示推断层的计算结果。
各层之间存在单向依赖关系。推断层需要的网络模型由训练层提供,并根据需要进行必要的格式转换或加速重构。相应的,展示层要显示的元数据需要由推断层计算得到。
在这里插入图片描述

3.3详细设计

3.3.1导入实验环境

步骤 1导入相应的模块

skimage包主要用于图像数据的处理,在该实验当中, io模块主要用于图像数据的读取(imread)和输出(imshow)操作,transform模块主要用于改变图像的大小(resize函数);
glob包主要用于查找符合特定规则的文件路径名,跟使用windows下的文件搜索相似;
os模块主要用于处理文件和目录,比如:获取当前目录下文件,删除制定文件,改变目录,查看文件大小等;
tensorflow是目前业界最流行的深度学习框架之一,在图像,语音,文本,目标检测等领域都有深入的应用,也是该实验的核心,主要用于定义占位符,定义变量,创建卷积神经网络模型;numpy是一个基于python的科学计算包,在该实验中主要用来处理数值运算;
time模块主要用于处理时间系列的数据,在该实验主要用于返回当前时间戳,计算脚本每个epoch运行所需要的时间。

# 导入模块
# -*- coding:uft-8
#from  skimage  
import glob
import os
import cv2
import  tensorflow as tf
from tensorflow.keras import layers, optimizers, datasets, Sequential
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

步骤 2设置初始化环境

# 数据集的地址,改为自己的图片文件地址
path = './flower_photos/'
# 缩放图片大小为100*100,C为通道,彩色图片数值为3
w = 100
h = 100
c = 3types = 0  # 所有花的种类数,也是标签的个数
flower = {0: 'bee', 1: 'blackberry', 2: 'blanket', 3: 'bougainvillea', 4: 'bromelia', 5: 'foxglove'}

3.3.2数据准备

这里通过os.listdir判断给定目录下的是文件还是文件夹,如果是文件夹,那么就进入读取其中的所有文件,这些图像对应的标签就是他们所属的文件夹的编号,遍历完所有子文件夹(这里不限制文件夹数目,可以动态的识别出文件夹)之后便完成了数据集的读取,函数返回读取到的所有图片和图片对应的标签。

# 读取图片
def read_img(path):global typesglobal flowerimgs = []labels = []if not os.path.isdir(path):print("路径不正确")exit(0)for s in os.listdir(path):print("\nfolder  ", s)f_label = s.split("_")[-1]flower[types] = s.split("_")[0]# flower[f_label]=s.split("_")[0]s = path + s + "/"if not os.path.isdir(s):  # 只读文件夹continuetypes += 1  # 数据集数目加1for im in os.listdir(s):im = s + imprint('\r\tloading :%s' % (im), end="")img = io.imread(im)img = transform.resize(img, (w, h))imgs.append(img)# labels.append(f_label)labels.append(types - 1)return np.asarray(imgs, np.float32), np.asarray(labels, np.int32)

3.3.3构建花卉识别模型

CNN训练模型
模型尺寸分析:卷积层全都采用了补0,所以经过卷积层长和宽不变,只有深度加深。池化层全都没有补0,所以经过池化层长和宽均减小,深度不变。
模型尺寸变化:100×100×3->100×100×32->50×50×32->50×50×64->25×25×64->25×25×128->12×12×128->12×12×128->6×6×128
本文的CNN模型比较简单,后续完全可以通过增大模型复杂度或者改参数调试以及对图像进行预处理来提高准确率。

下面列出网络模型的部分:
这里首先用tf.getvariable创建新的tensorflow变量并用tf.tf.constant_initializer
和tf.constant_initializer初始化为(stddev=0.1)和(0.0)
然后用 tf.nn.conv2d创建2维卷积层步长参数为[1,1,1,1],卷积方式为’SAME’
然后用线性整流函数relu进行处理

   with tf.variable_scope('layer1-conv1'):conv1_weights = 			tf.get_variable("weight",[5,5,3,32],initializer=tf.truncated_normal_initializer(stddev=0.1))conv1_biases = tf.get_variable("bias", [32], initializer=tf.constant_initializer(0.0))conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))

下面类似:

with tf.variable_scope('layer11-fc3'):fc3_weights = tf.get_variable("weight", [512, 5],initializer=tf.truncated_normal_initializer(stddev=0.1))if regularizer != None: tf.add_to_collection('losses', regularizer(fc3_weights))fc3_biases = tf.get_variable("bias", [5], initializer=tf.constant_initializer(0.1))logit = tf.matmul(fc2, fc3_weights) + fc3_biases

下面是池化操作:利用tf.nn.max_pool完成,池化窗口大小为[1,2,2,1],填充方式为VALID表示不填充,窗口在每一个维度上滑动的步长为[1,2,2,1]

with tf.name_scope("layer4-pool2"):pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')

3.3.4训练并保存模型

下面给出部分训练模型的代码:

训练过程中输出每一次训练的train loss 、train acc、val loss、val acc用于分析训练的效果。

def train():
......for epoch in range(n_epoch):start_time = time.time()# trainingtrain_loss, train_acc, n_batch = 0, 0, 0for x_train_a, y_train_a in minibatches(x_train, y_train, batch_size, shuffle=True):_, err, ac = sess.run([train_op, loss, acc], feed_dict={x: x_train_a, y_: y_train_a})train_loss += errtrain_acc += acn_batch += 1print("--第"+str(epoch + 1)+"次训练:".ljust(10, " "), end="")print(str((np.sum(train_loss)) / n_batch).ljust(20, " "), (str(np.sum(train_acc) / n_batch)).ljust(20, " "), end="")# validationval_loss, val_acc, n_batch = 0, 0, 0for x_val_a, y_val_a in minibatches(x_val, y_val, batch_size, shuffle=False):err, ac = sess.run([loss, acc], feed_dict={x: x_val_a, y_: y_val_a})val_loss += errval_acc += acn_batch += 1print(str((np.sum(val_loss) / n_batch)).ljust(20, " "), str((np.sum(val_acc) / n_batch)).ljust(20, " "))

3.3.5识别花卉

首先创建用于读取测试的花卉图片的函数,该函数读取测试文件夹中的所有图片并以np.array的形式返回。

def get_test_img(path):imgs = []cv_data = []for im in os.listdir(path):im = path + imprint('\rrecognizing :%s' % (im), end="")img = io.imread(im)img = transform.resize(img, (w, h))imgs.append(img)cv_data.append(cv2.imread(im))return np.asarray(imgs), cv_data

然后就可以利用上述训练得到的判别器来判断所给的图像的标签。然后就可以根据得到的标签输出花的名字

def recog():path = './data/TestImages/'model_path = "./model/"data, cv_datas = get_test_img(path)with tf.Session() as sess:saver = tf.train.import_meta_graph(model_path + 'model.ckpt.meta')saver.restore(sess, tf.train.latest_checkpoint(model_path))graph = tf.get_default_graph()x = graph.get_tensor_by_name("x:0")feed_dict = {x: data}logits = graph.get_tensor_by_name("logits_eval:0")classification_result = sess.run(logits, feed_dict)# 打印出预测矩阵print(classification_result)# 打印出预测矩阵每一行最大值的索引print(tf.argmax(classification_result, 1).eval())# 根据索引通过字典对应花的分类output = tf.argmax(classification_result, 1).eval()for i in range(len(output)):print("第", i + 1, "朵花预测: label:", output[i], "\t", flower[output[i]])font = cv2.FONT_HERSHEY_SIMPLEXimg = cv_datas[i]cv2.putText(img, flower[output[i]], (20, 20), font, 1, (0, 0, 0), 1)# cv2.imshow(flower[output[i]],img)# cv2.waitKey(0)  # # 使图片停留用于观察,没有这一行代码,图片会在展示瞬间后消失

由于待识别的图片一共有六张,所以将其排列在一个两行三列的图片之中。
使用pyplot的subplot即可实现,遍历所有图片并分别将图片放第i个位置处。

        # 下面改用pyplot绘图以让结果显示在一张图片中pyplot.subplot(2, 3, 1 + i)  # 使用subplot()构建子图,第一个参数5表示每列有5张图,第二个参数表示每行有6张图,1+i表示第(1+i张图)pyplot.axis('off')  # 关闭坐标轴("on"为显示坐标轴)pyplot.title(flower[output[i]])pyplot.imshow(img, cmap='gray_r')  # 使用imshow()函数画出训练集相应图片原始像素数据,参数cmap = gray表示黑底白字图像,这边使用"gray_r"表示白底黑字图
pyplot.savefig('res.png')  # 保存图片
pyplot.show()

3.4运行测试

首先读取数据集,由下图可见,程序依次读取了六个文件夹,并从每个文件夹中读取了多张图片。在这里插入图片描述

然后开始训练,这里输出了:训练集损失值、:训练集准确率、测试集损失值、测试集准确率这几个指标,通过观察数值变化可以发现:
train loss不断减小
Train acc不断增大直至为1并稳定为1
Val loss 大体上不断减小,但后半部分稍有波动
Val acc 大体上不断增大,但后半部分稍有波动

以上说明网络正在学习,状态良好。
在这里插入图片描述

在这里插入图片描述

然后输出识别出的花卉对应的标签以及名称:
第1朵花预测: Label: 0 bee
第2朵花预测: Label: 1 bLackberry
第3朵花预测: Label: 2 bLanket
第4朵花预测: Label: 3 bougainvillea
第5朵花预测: Label: 4 bromelia
第6朵花预测: Label: 5 foxgLove
在这里插入图片描述

然后将图片和名称显示在一张图片内方便观察。
在这里插入图片描述


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

相关文章

常见花卉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、通知前端登录成功并返…

微信扫码登录是如何实现的?

网页版微信刚推出时&#xff0c;无数人被它的登录方式惊艳了一下&#xff0c;不需要输入用户名密码&#xff0c;打开手机微信扫一扫&#xff0c;便自动登录。从原理上讲&#xff0c;二维码只能是一段文本的编码&#xff0c;如何用它实现快捷登录的呢&#xff1f; 打开网页版微…

Python 最强 IDE 详细使用指南!

本文经机器之心&#xff08;微信公众号&#xff1a;almosthuman2014&#xff09;授权转载&#xff0c;禁止二次转载 选自RealPython&#xff0c;作者&#xff1a;Jahongir Rahmonov 机器之心编译&#xff0c;参与&#xff1a;魔王 PyCharm 是一种 Python IDE&#xff0c;可以帮…

用 Python 给全球女神颜值排个序

点击上方“码农突围”&#xff0c;马上关注&#xff0c;每天上午8:50准时推送 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包 真爱&#xff0c;请设置“星标”或点个“在看” 作者 | 数据森麟 来源 | 数据森麟&#xff08;ID: shujusenlin&#…

官宣:Python 3.8正式发布!来看看有哪些新功能

点击上方“码农突围”&#xff0c;马上关注&#xff0c;每天上午8:50准时推送 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包 真爱&#xff0c;请设置“星标”或点个“在看” 来源&#xff1a;.python.org 编辑&#xff1a;肖琴&#xff0c;转自…