基于深度学习CNN算法的蔬菜识别系统01--带数据集-pyqt5UI界面-全套源码

各位同学大家好,本次给大家分享的项目为:

基于深度学习CNN算法的蔬菜识别系统01–带数据集-pyqt5UI界面-全套源码

项目文件获取地址:

百度网盘链接: https://pan.baidu.com/s/12paOMPj8mTq9-XGs7pUCJw?pwd=pfwv 
提取码:  pfwv 

一、项目摘要

随着人工智能技术的快速发展,深度学习在图像识别领域取得了显著的进步。本文设计并实现了一种基于MobileNet深度学习网络的蔬菜识别系统。该系统通过从网络上采集的15类蔬菜图像数据集(共计21000张)进行训练和验证,利用MobileNet模型在资源受限的环境中实现高效、准确的图像分类。数据集按照8:2的比例划分为训练集和验证集,并通过随机裁剪、水平翻转等数据增强技术提高模型的泛化能力。经过30个训练周期,系统在验证集上的准确率达到了99%,并通过混淆矩阵显示出在各类蔬菜分类任务中的优异表现。最终,利用PyQt5库设计了用户交互界面,实现了蔬菜图片上传与分类结果展示的功能。该系统表现出高效的分类性能,为农业自动化领域的蔬菜识别任务提供了一种可行的解决方案。

二、项目运行效果

运行效果视频:
https://www.bilibili.com/video/BV1WrCRY1Erq

运行效果截图:
在这里插入图片描述

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

三、项目文件介绍

在这里插入图片描述

在这里插入图片描述

四、项目环境配置

1、项目环境库

python=3.8 pytorch pyqt5 opencv matplotlib 等

2、环境配置视频教程

1)anaconda下载安装教程
2)pycharm下载安装教程
3)项目环境库安装步骤教程

五、项目系统架构

蔬菜识别系统分为两大模块:后端深度学习模型和前端用户界面。

后端模块:MobileNet模型是系统的核心,负责处理用户上传的蔬菜图片,并对其进行分类。模型通过PyTorch加载,并利用训练好的参数进行推理。在用户上传图片后,系统将调用该模型对图片进行处理,并输出预测的蔬菜种类。

前端模块:前端界面是基于PyQt5库开发的。用户可以通过界面上传蔬菜图像,点击“识别”按钮后,系统会自动调用后端的深度学习模型对图像进行分类,最终结果会在界面

系统的整体工作流程如下:首先,用户通过用户界面选择要识别的蔬菜图片,随后系统对蔬菜进行预处理,接着将处理后的图像输入到深度学习模型中进行分类,最后在用户界面上显示识别结果及蔬菜相关的简介。

六、项目构建流程

1、数据集

数据集文件夹:all_data

在这里插入图片描述

概述:

本文使用的数据集由15类不同蔬菜的图像组成,总计21000张

在这里插入图片描述

数据集格式及命令统一代码:to_rgb.py
(对数据集中的图像统一成rgb格式并进行统一规范命名)

在这里插入图片描述

2、算法网络Mobilenet

概述:
Mobilenet是专为移动设备和嵌入式系统设计的轻量化卷积神经网络。其主要特点在于采用了深度可分离卷积(Depthwise Separable Convolution)来减少计算量和参数数量,从而在资源受限的环境下实现高效的图像分类和识别。
在这里插入图片描述

算法代码为:models文件夹下的mobilenet.py

在这里插入图片描述

"""mobilenet in pytorch

[1] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
    https://arxiv.org/abs/1704.04861
"""

import torch
import torch.nn as nn


class DepthSeperabelConv2d(nn.Module):

    def __init__(self, input_channels, output_channels, kernel_size, **kwargs):
        super().__init__()
        self.depthwise = nn.Sequential(
            nn.Conv2d(
                input_channels,
                input_channels,
                kernel_size,
                groups=input_channels,
                **kwargs),
            nn.BatchNorm2d(input_channels),
            nn.ReLU(inplace=True)
        )

        self.pointwise = nn.Sequential(
            nn.Conv2d(input_channels, output_channels, 1),
            nn.BatchNorm2d(output_channels),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)

        return x


class BasicConv2d(nn.Module):

    def __init__(self, input_channels, output_channels, kernel_size, **kwargs):

        super().__init__()
        self.conv = nn.Conv2d(
            input_channels, output_channels, kernel_size, **kwargs)
        self.bn = nn.BatchNorm2d(output_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)

        return x


class MobileNet(nn.Module):

    """
    Args:
        width multipler: The role of the width multiplier α is to thin
                         a network uniformly at each layer. For a given
                         layer and width multiplier α, the number of
                         input channels M becomes αM and the number of
                         output channels N becomes αN.
    """

    def __init__(self, width_multiplier=1, class_num=100):
       super().__init__()

       alpha = width_multiplier
       self.stem = nn.Sequential(
           BasicConv2d(3, int(32 * alpha), 3, padding=1, bias=False),
           DepthSeperabelConv2d(
               int(32 * alpha),
               int(64 * alpha),
               3,
               padding=1,
               bias=False
           )
       )

       #downsample
       self.conv1 = nn.Sequential(
           DepthSeperabelConv2d(
               int(64 * alpha),
               int(128 * alpha),
               3,
               stride=2,
               padding=1,
               bias=False
           ),
           DepthSeperabelConv2d(
               int(128 * alpha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值