基于TensorFlow的花卉识别

概要设计

数据分析

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

数据集内容举例:
在这里插入图片描述
数据集tgz文件解压后,内部划分为5个相对应的文件夹,文件夹内为相对应图片:
在这里插入图片描述
在这里插入图片描述
对应样本数(对数据集进行分类,90%训练集,10%验证集):
在这里插入图片描述

设计任务

本次设计的任务是通过所提供的数据集数据(具有对应花卉分类),使用神经网络模型方法进行训练,使用该模型对其它同类花卉进行类型识别,需要借助TensorFlow环境下的神经网络模型进行处理训练。
本次设计任务我将使用TensorFlow环境下的卷积神经网络CNN技术,通过CNN对数据集进行对应的训练,建立相关模型,再使用模型对相对应花卉进行识别。其中神经网络的建立使用TensorFlow 2.x的Keras的Api进行搭建,绘制损失函数和准确率曲线对模型训练效果进行评价,训练完成保存为mode.h5文件储存,在预测数据时读取model文件加载model,再使用model进行预测数据,并使用Pyqt5工具设计一个简洁的GUI界面进行人机交互,能够自定义预测数据集图片。

本次设计使用TensorFlow 2.3,Python 3.8 环境,IDE使用PyCharm,进行神经网络的搭建和训练。

详细设计

数据加载和预处理

1、设置图片尺寸为180*180,分批大小32
在这里插入图片描述

2、从flower_photos文件夹中加载数据:
(train_ds为训练集,val_ds为验证集)
使用tf.keras.preprocessing.image_dataset_from_directory方法,其中参数:
Directory:数据集储存文件夹路径
Validate_split:划分训练集和验证集比例,输入0.1为验证集占10%
Subset:training为训练集,validation为验证集
Seed:用于shuffle和转换的可选随机种子,选择123
Image_size:图片大小,为上一点所预设180*180
Batch_size:数据批次的大小,为预设的32
在这里插入图片描述
3、获取分类名:
在这里插入图片描述
结果:
在这里插入图片描述

4、数据可视化演示:
在这里插入图片描述
5、配置数据集:
• 使用shuffle()函数打乱数据,使用cache()函数将数据集缓存到内存当中,
再使用prefetch()函数预取数据,加速运行
在这里插入图片描述

神经网络构建

第1层:输入层:将数据归一化,并设置input_shape输入
在这里插入图片描述
第2层:卷积层1:卷积核数目为16,卷积核为3*3,激活函数为relu,并设置input_shape为(180,180,3),使用卷积的目的是从输入图片中提取特征
在这里插入图片描述

第3层:池化层1:采用最大池化操作,使用2*2采样,池化层的目的是降低了每个特征映射的维度,但是保留最重要的信息
在这里插入图片描述

第4层:卷积层2:卷积核数目为32,卷积核为3*3,激活函数为relu
在这里插入图片描述

第5层:池化层2:采用最大池化操作,使用2*2采样
在这里插入图片描述

第6层:卷积层3:卷积核数目为64,卷积核为3*3,激活函数为relu
在这里插入图片描述

第7-10层:两个卷积层和池化层
在这里插入图片描述

第11层:Flatten层:连接卷积层与全连接层,把多维的输入一维化
在这里插入图片描述

第12层:全连接层:units设置为128,即输出维度为128,,激活函数为relu,全连接层对上一层的神经元进行全部连接,实现特征的非线性组合,进行特征进一步提取
在这里插入图片描述

第13层:输出层:输出预期结果
在这里插入图片描述
在这里插入图片描述

使用Sequential逐层描述每层网络, 搭建神经网络结构:
在这里插入图片描述
打印网络结构:
在这里插入图片描述

模型训练

1、模型编译:
优化器optimizer选adam,损失函数loss选SparseCategoricalCrossentropy,指标metrics选择准确率accuracy
在这里插入图片描述
2、训练模型
指定训练集train_ds,验证集validation_data为val_ds,迭代10次
在这里插入图片描述
3、训练结束,保存model为model.h5
在这里插入图片描述
4、使用evaluate评价模型,并打印准确率
在这里插入图片描述
5、获取准确率和损失值并绘制函数
在这里插入图片描述
6、绘制混淆矩阵:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模型预测

1、定义常量:
在这里插入图片描述
Flower_dict为花卉种类序列,以及图片宽高

2、加载模型
在这里插入图片描述
3、根据方法参数path加载图片数据转为array类型,由于维度问题需要扩展1维,使用numpy的expand_dims方法将数据由3维扩展为4维,然后使用model.predict方法将图片数据作为参数调用,返回result结果(index)对应flower_dict相对应index,返回对应index的种类名作为结果
在这里插入图片描述

GUI界面

1、使用Pyqt5工具设计GUI界面:
在这里插入图片描述
2、使用Pyqt5生成ui代码:
部分:
在这里插入图片描述

3、编写主函数Main.py
①import 组件
在这里插入图片描述

②打开GUI界面,初始化
在这里插入图片描述
在这里插入图片描述

③定义训练和预测函数:
在这里插入图片描述

注意事项

单独选择图片进行预测时,由于图片数据维度问题需要扩展1维,使用numpy的expand_dims方法将数据由3维扩展为4维,然后使用model.predict方法将图片数据作为参数调用

优化策略

优化CNN网络处理,防止过拟合,提高模型的泛化能力

运行结果

初始页面选训练:
在这里插入图片描述
1、网络结构
在这里插入图片描述
在这里插入图片描述

2、迭代过程
在这里插入图片描述

3、数据可视化
在这里插入图片描述

4、准确率
在这里插入图片描述

5、损失函数
在这里插入图片描述

6、混淆矩阵:
在这里插入图片描述

7、GUI演示
点击识别
在这里插入图片描述

选择图片
在这里插入图片描述
识别成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Gitee源码: https://gitee.com/steven_L1047/tensor-flow.git.

  • 35
    点赞
  • 349
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
以下是使用 TensorFlow 实现花卉识别的代码示例: ```python import tensorflow as tf import numpy as np import os # 定义花卉分类标签 flower_labels = ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips'] num_classes = len(flower_labels) # 定义模型超参数 learning_rate = 0.001 batch_size = 64 num_epochs = 50 # 加载花卉数据集 train_data_dir = '/path/to/training/dataset' test_data_dir = '/path/to/test/dataset' train_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(224, 224), batch_size=batch_size, class_mode='categorical') test_generator = test_datagen.flow_from_directory( test_data_dir, target_size=(224, 224), batch_size=batch_size, class_mode='categorical') # 定义模型结构 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(128, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(128, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(num_classes, activation='softmax') ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate), loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_generator, epochs=num_epochs, validation_data=test_generator) # 评估模型 test_loss, test_acc = model.evaluate(test_generator) print('Test accuracy:', test_acc) # 保存模型 model.save('flower_classification_model.h5') ``` 在上述代码中,我们首先定义了花卉分类标签和模型超参数。然后,使用 TensorFlow 内置的 `ImageDataGenerator` 类加载花卉数据集,并将其分为训练集和测试集。接着,我们定义了卷积神经网络模型的结构,并使用 `compile()` 方法编译模型。最后,使用 `fit()` 方法训练模型,并评估模型的性能。最后,我们将训练好的模型保存到磁盘上。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值