【大作业-02】水果蔬菜识别系统-基于tensorflow2.3开发

简介: 2021年6月18日,TensorFlow 2.3物体分类代码已修复并更新。本项目支持自定义数据集训练,包括基于CNN和Mobilenet的模型,后者准确率高达97%。提供了详细的CSDN教程、B站教学视频及数据集下载链接,帮助用户快速上手。项目还包括PyQt5构建的图形界面,方便用户上传图片进行果蔬识别。更多详情与代码可在Gitee获取。

------------------------------------------------2021年6月18日重大更新--------------------------------------------------------------

目前已经退出bug修复之后的tensorflow2.3物体分类代码,大家可以训练自己的数据集,快来试试吧

csdn教程链接:手把手教你用tensorflow2.3训练自己的分类数据集_CSDN博客

b站视频链接:手把手教你用tensorflow2训练自己的数据集

数据集链接:计算机视觉数据集清单-附赠tensorflow模型训练和使用教程_CSDN博客

代码链接:vegetables_tf2.3: 基于tensorflow2.3开发的水果蔬菜识别系统 (gitee.com)

------------------------------------------------------------------dejahu---------------------------------------------------------------------

tensorflow是由google出品的深度学习框架,2.x版本的tensorflow对代码进行了重构,使用起来更加简洁方便。本系统使用tensorflow训练了一个两层卷积两层池化的卷积神经网络和一个基于迁移学习的mobilnet网络,其中mobilenet网络模型准确率高达97%,可识别['土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜']12种水果蔬菜,并借助pyqt5构建了图形化界面,用户可选择图片上传进行果蔬的识别。

配套视频

配套视频在这里:手把手教你用tensorflow2构建果蔬识别系统

环境配置请看:Python学习中Anaconda和Pycharm的正确打开方式_哔哩哔哩_bilibili

效果展示

首先来看看效果展示

启动系统,首先来到的是关于界面,作者的信息可以在window.py的84行进行修改。

image-20210524104017908

主页部分,一共是两个按钮,点击上传图片的按钮可从本地选择图片进行上传

image-20210524104702278

点击开始识别的按钮可以调用训练好的模型进行图片的识别,识别结果会显示在右侧

image-20210524104625086

模型训练

模型的训练包含两部分代码,train_mobilnet.py用来训练mobilnet模型,train_cnn.py用于训练cnn模型,模型训练分为3个步骤:数据加载 - 模型加载 - 模型训练和保存。

数据加载

首先来看一下我们的数据,我们分为训练集和测试集。

image-20210524141444140

打开之后按照目录存放相应的图片,比如大白菜目录下存放的全是白菜的图片。

image-20210524141522571

这里我们使用tf.keras.preprocessing.image_dataset_from_directory直接从指定的目录中加载数据集并统一处理为指定的大小,代码如下:

# 数据集加载函数,指明数据集的位置并统一处理为imgheight*imgwidth的大小,同时设置batch
def data_load(data_dir, test_data_dir, img_height, img_width, batch_size):
    # 加载训练集
    train_ds = tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        label_mode='categorical',
        seed=123,
        image_size=(img_height, img_width),
        batch_size=batch_size)
    # 加载测试集
    val_ds = tf.keras.preprocessing.image_dataset_from_directory(
        test_data_dir,
        label_mode='categorical',
        seed=123,
        image_size=(img_height, img_width),
        batch_size=batch_size)
    class_names = train_ds.class_names
    # 返回处理之后的训练集、验证集和类名
    return train_ds, val_ds, class_names

模型构建

模型的构建方面我们借助keras来完成,只需要讲需要的层叠加到一起,并指明我们所需的优化器和损失函数即可

# 构建CNN模型
def model_load(IMG_SHAPE=(224, 224, 3), class_num=6):
    # 搭建模型
    model = tf.keras.models.Sequential([
        # 对模型做归一化的处理,将0-255之间的数字统一处理到0到1之间
        tf.keras.layers.experimental.preprocessing.Rescaling(1. / 255, input_shape=IMG_SHAPE),
        # 卷积层,该卷积层的输出为32个通道,卷积核的大小是3*3,激活函数为relu
        tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
        # 添加池化层,池化的kernel大小是2*2
        tf.keras.layers.MaxPooling2D(2, 2),
        # Add another convolution
        # 卷积层,输出为64个通道,卷积核大小为3*3,激活函数为relu
        tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
        # 池化层,最大池化,对2*2的区域进行池化操作
        tf.keras.layers.MaxPooling2D(2, 2),
        # 将二维的输出转化为一维
        tf.keras.layers.Flatten(),
        # The same 128 dense layers, and 10 output layers as in the pre-convolution example:
        tf.keras.layers.Dense(128, activation='relu'),
        # 通过softmax函数将模型输出为类名长度的神经元上,激活函数采用softmax对应概率值
        tf.keras.layers.Dense(class_num, activation='softmax')
    ])
    # 输出模型信息
    model.summary()
    # 指明模型的训练参数,优化器为sgd优化器,损失函数为交叉熵损失函数
    model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
    # 返回模型
    return model

训练开始

训练的主流程中,先加载数据,再加载模型,最后将数据送入模型中进行训练,使用的是model.fit函数,可以自由指定训练的轮数,最终模型会保存在models目录下,训练过程中的可视化结果会保存在reuslts目录下

def train(epochs):
    # 开始训练,记录开始时间
    begin_time = time()
    # 加载数据集
    train_ds, val_ds, class_names = data_load("../data/vegetable_fruit/image_data",
                                              "../data/vegetable_fruit/test_image_data", 224, 224, 16)
    print(class_names)
    # 加载模型
    model = model_load(class_num=len(class_names))
    # 指明训练的轮数epoch,开始训练
    history = model.fit(train_ds, validation_data=val_ds, epochs=epochs)
    # 保存模型
    model.save("models/cnn_fv.h5")
    # 记录结束时间
    end_time = time()
    run_time = end_time - begin_time
    print('该循环程序运行时间:', run_time, "s")  # 该循环程序运行时间: 1.4201874732
    # 绘制模型训练过程图
    show_loss_acc(history)

image-20210524142945905

模型测试

模型测试和模型训练基本一致,只是在模型加载的部分,直接调用保存好的模型即可,不在进行模型参数的调整,以cnn模型的测试为例,首先加载数据,然后加载模型,最后使用model.evaluate方法对模型进行测试。

def test_cnn():
    # 加载数据集
    train_ds, val_ds, class_names = data_load("../data/vegetable_fruit/image_data",
                                              "../data/vegetable_fruit/test_image_data", 224, 224, 16)
    # 加载模型
    model = tf.keras.models.load_model("models/cnn_fv.h5")
    # model.summary()
    # 测试
    loss, accuracy = model.evaluate(val_ds)
    # 输出结果
    print('CNN test accuracy :', accuracy)

测试结果如下,其中mobilenet可达到97%的准确率:

image-20210524143235563

代码获取

代码请在码云中下载

vegetables_tf2.3: 基于tensorflow2.3开发的水果蔬菜识别系统 (gitee.com)

数据集请在csdn下载

果蔬识别数据集.zip-专业指导文档类资源-CSDN下载

下载之后按照下面的目录放置数据集和代码
image-20210605170205728

data目录下是

image-20210605170318893

fv_tf2.3_cpu目录下是

image-20210605170337870

参考资料

李老师讲解卷积神经网络: https://www.bilibili.com/video/BV1Lb411b7BS?from=search&seid=14069382285256773171
如何理解卷积神经网络(CNN)中的卷积和池化:https://www.zhihu.com/question/49376084/answer/712089980
轻量级CNN网络之MobileNetv2:https://zhuanlan.zhihu.com/p/52426865
vgg网络解析:https://zhuanlan.zhihu.com/p/41423739
resnet网络解析:https://zhuanlan.zhihu.com/p/67860570

环境配置

环境的配置分为三步: 配置虚拟环境和安装程序所需要的包以及在pycharm中打开项目

配置虚拟环境

配置虚拟环境需要通过anaconda来完成,anaconda的下载地址为:https://docs.conda.io/en/latest/miniconda.html

windows用户下载python3.8的miniconda即可

image-20210524105054366

下载完毕之后双击安装即可,注意一点这些一定要选中

image-20210524105240779

image-20210524105344251

程序安装完毕之后打开windows的命令行(cmd),输入conda env list,出现下列信息则表示conda已完成安装

image-20210524105549465

在命令行中输入下列指令创建虚拟环境

conda create -n tf2.3 python==3.7.3

这条指令的含义是创建python版本为3.7.3,名称为tf2.3的虚拟环境

image-20210524105851905

安装结束之后输入下列指令激活虚拟环境,出现下图所示的小括号表示环境激活成功

conda activate tf2.3

image-20210524110020460

安装程序所需要的包

接着在命令行中依次执行下列命令安装程序所需的包(请根据你的程序自由选择要安装的包)

pip install tensorflow-cpu==2.3.0 -i https://mirror.baidu.com/pypi/simple
pip install pyqt5 -i https://mirror.baidu.com/pypi/simple
pip install pillow -i https://mirror.baidu.com/pypi/simple 
pip install opencv-python -i https://mirror.baidu.com/pypi/simple 
pip install matplotlib -i https://mirror.baidu.com/pypi/simple

image-20210524110423033

注:每一行命令都要执行

在pycharm中打开程序

为了方便查看和调试代码,我们这里使用pycharm,pycharm的下载地址为:https://www.jetbrains.com/pycharm/download/#section=windows

image-20210524110552220

这里选择社区版进行下载即可

安装过程中这几个选项请务必选上,以避免后面不必要的麻烦

image-20210524111504457

安装完毕之后找到我们的代码,通过pycharm打开即可

image-20210524111754027

打开之后我们在软件的右下角找到Add interpreter添加刚才建立的虚拟环境

image-20210524111938905

image-20210524112020699

最后右下角显示tf2.3表示我们当前的虚拟环境为tf2.3

image-20210524112057673

之后再安装程序的包的时候,直接在pycharm下方打开terminal,执行pip install xxx 的指令即可,包就会自动安装在当前的虚拟环境中

image-20210524112334043

目录
相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
142 55
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【大作业-04】手把手教你构建垃圾分类系统-基于tensorflow2.3
本文介绍了基于TensorFlow 2.3的垃圾分类系统,通过B站视频和博客详细讲解了系统的构建过程。系统使用了包含8万张图片、245个类别的数据集,训练了LeNet和MobileNet两个卷积神经网络模型,并通过PyQt5构建了图形化界面,用户上传图片后,系统能识别垃圾的具体种类。此外,还提供了模型和数据集的下载链接,方便读者复现实验。垃圾分类对于提高资源利用率、减少环境污染具有重要意义。
96 0
【大作业-04】手把手教你构建垃圾分类系统-基于tensorflow2.3
|
2月前
|
数据采集 TensorFlow 算法框架/工具
【大作业-03】手把手教你用tensorflow2.3训练自己的分类数据集
本教程详细介绍了如何使用TensorFlow 2.3训练自定义图像分类数据集,涵盖数据集收集、整理、划分及模型训练与测试全过程。提供完整代码示例及图形界面应用开发指导,适合初学者快速上手。[教程链接](https://www.bilibili.com/video/BV1rX4y1A7N8/),配套视频更易理解。
62 0
【大作业-03】手把手教你用tensorflow2.3训练自己的分类数据集
|
20天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
110 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
29天前
|
机器学习/深度学习 数据采集 数据可视化
TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤
本文介绍了 TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤,包括数据准备、模型定义、损失函数与优化器选择、模型训练与评估、模型保存与部署,并展示了构建全连接神经网络的具体示例。此外,还探讨了 TensorFlow 的高级特性,如自动微分、模型可视化和分布式训练,以及其在未来的发展前景。
70 5
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
84 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
1月前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
94 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
128 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 测试技术 TensorFlow
【大作业-01】花卉识别-基于tensorflow2.3实现
2021年6月18日更新:提供修复后的TensorFlow 2.3物体分类代码,支持自定义数据集训练。包含CSDN教程、B站视频、数据集及代码下载链接。示例项目为花卉识别,涵盖模型训练、测试、保存和使用,附带图形界面操作指南。
48 0
【大作业-01】花卉识别-基于tensorflow2.3实现
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
92 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型