花卉识别(tensorflow)

这篇具有很好参考价值的文章主要介绍了花卉识别(tensorflow)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考教材:人工智能导论(第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实验简介

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

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

3.2概要设计

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

3.2.1功能结构

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

3.2.2体系结构

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

types = 0  # 所有花的种类数,也是标签的个数
flower = {0: 'bee', 1: 'blackberry', 2: 'blanket', 3: 'bougainvillea', 4: 'bromelia', 5: 'foxglove'}

3.3.2数据准备

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

# 读取图片
def read_img(path):
    global types
    global flower
    imgs = []
    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):  # 只读文件夹
            continue

        types += 1  # 数据集数目加1

        for im in os.listdir(s):
            im = s + im
            print('\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()

        # training
        train_loss, train_acc, n_batch = 0, 0, 0
        for 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 += err
            train_acc += ac
            n_batch += 1
        print("--第"+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="")

        # validation
        val_loss, val_acc, n_batch = 0, 0, 0
        for 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 += err
            val_acc += ac
            n_batch += 1
        print(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 + im
        print('\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_SIMPLEX
            img = 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运行测试

首先读取数据集,由下图可见,程序依次读取了六个文件夹,并从每个文件夹中读取了多张图片。花卉识别(tensorflow)

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

以上说明网络正在学习,状态良好。
花卉识别(tensorflow)

花卉识别(tensorflow)

然后输出识别出的花卉对应的标签以及名称:
第1朵花预测: Label: 0 bee
第2朵花预测: Label: 1 bLackberry
第3朵花预测: Label: 2 bLanket
第4朵花预测: Label: 3 bougainvillea
第5朵花预测: Label: 4 bromelia
第6朵花预测: Label: 5 foxgLove
花卉识别(tensorflow)

然后将图片和名称显示在一张图片内方便观察。
花卉识别(tensorflow)文章来源地址https://www.toymoban.com/news/detail-496683.html

到了这里,关于花卉识别(tensorflow)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于tensorflow CNN的花卉识别系统

    本项目是一个基于深度学习技术的花卉识别系统。用户可以上传一张花卉图片,系统通过使用卷积神经网络(CNN)模型,自动识别出该花卉的品种。系统采用 Python 编程语言和 TensorFlow 框架进行开发,前端界面使用 React 和 Ant Design 实现,后端使用 Flask 框架搭建 Web 服务。通过

    2024年02月02日
    浏览(40)
  • 3、TensorFlow教程--- 理解人工智能

    人工智能包括通过机器和特殊计算机系统模拟人类智能的过程。人工智能的示例包括学习、推理和自我校正。人工智能的应用包括语音识别、专家系统、图像识别和机器视觉。 机器学习是人工智能的一个分支,它处理可以学习任何新数据和数据模式的系统和算法。 让我们关

    2024年02月08日
    浏览(58)
  • TensorFlow人工智能开源深度学习框架简单认识

    TensorFlow是一个使用数据流图进行数值计算的开源深度学习框架。它由Google Brain团队开发,并于2015年开源发布。TensorFlow的核心概念是使用图表示计算任务,其中节点表示操作,边表示数据流动。 TensorFlow被广泛用于机器学习和深度学习任务。它的特点包括: 强大的计算能力:

    2024年01月21日
    浏览(54)
  • 人工智能之Tensorflow技术特点及组件结构

    前言 Tensorflow的前身时谷歌的神经网络算法库DistBelief,被广泛应用于各类机器学习、深度学习算法的编程实现。Tensorflow具有实现代码简洁、编程范式灵活、分布式深度学习算法执行效率高、多语言API支持、CPU/GPU部署方便、良好的可扩展性、可移植性及在学术研究和产品研发

    2024年02月21日
    浏览(56)
  • 【Python/人工智能】TensorFlow 框架原理及使用教程

    TensorFlow 是一款由 Google 开源的人工智能框架,是目前应用最广泛的深度学习框架之一。它可以在各种硬件平台上运行,包括单个 CPU、CPU 集群、GPU,甚至是分布式环境下的 CPU 和 GPU 组合。 除了深度学习领域,TensorFlow 还支持其他机器学习算法和模型,如 决策树 、 SVM 、 k-m

    2024年04月28日
    浏览(48)
  • 人工智能:Pytorch,TensorFlow,MXNET,PaddlePaddle 啥区别?

    学习人工智能的时候碰到各种深度神经网络框架:pytorch,TensorFlow,MXNET,PaddlePaddle,他们有什么区别? PyTorch、TensorFlow、MXNet和PaddlePaddle都是深度学习领域的开源框架,它们各自具有不同的特点和优势。以下是它们之间的主要区别: PyTorch是一个开源的Python机器学习库,它基

    2024年04月16日
    浏览(69)
  • 人工智能TensorFlow PyTorch物体分类和目标检测合集【持续更新】

    1. 基于TensorFlow2.3.0的花卉识别 基于TensorFlow2.3.0的花卉识别Android APP设计_基于安卓的花卉识别_lilihewo的博客-CSDN博客 2. 基于TensorFlow2.3.0的垃圾分类 基于TensorFlow2.3.0的垃圾分类Android APP设计_def model_load(img_shape=(224, 224, 3)_lilihewo的博客-CSDN博客   3. 基于TensorFlow2.3.0的果蔬识别系统的

    2024年02月09日
    浏览(62)
  • 基于Solr的智能化人工智能与智能图像识别

    作者:禅与计算机程序设计艺术 引言 1.1. 背景介绍 随着人工智能技术的快速发展,人工智能与图像识别应用越来越广泛。在实际应用中,基于Solr的智能化人工智能与智能图像识别技术具有很高的实用价值和可行性。 1.2. 文章目的 本文旨在讲解如何基于Solr实现智能化人工智

    2024年02月07日
    浏览(68)
  • 【人工智能】Transformers 快速上手: 为 Jax、PyTorch 和 TensorFlow 打造的先进的自然语言处理

    为 Jax、PyTorch 和 TensorFlow 打造的先进的自然语言处理 🤗 Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让最先进的 NLP 技术人人易用。 🤗 Transformers 提供了便于快速下载和使用的API,让你可以把

    2024年02月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包