文章目录
各位同学大家好,本次给大家分享的项目为:
基于深度学习算法的植物/中草药分类识别系统
项目文件获取地址:
百度网盘链接: https://pan.baidu.com/s/1BQks5xCYySzBqvrXTtOpvw?pwd=4t95 提取码: 4t95
一、项目摘要
本项目设计并实现一个基于深度学习算法的植物识别系统。该系统采用Mobilenet深度学习模型,利用网络采集的一个包含67类植物、共6877张图像的数据集,结合Pytorch框架进行模型训练和优化,通过准确率、损失值和混淆矩阵三种评价指标,验证了该系统的识别性能,并使用pyqt5库设计了图形用户界面(GUI),实现了便捷的植物识别和结果展示功能。
二、项目运行效果
运行效果视频:
https://www.bilibili.com/video/BV1QgtVeDEDq
运行效果截图:
三、项目文件介绍
四、项目环境配置
1、项目环境库
python=3.8 pytorch pyqt5 opencv matplotlib 等
2、环境配置视频教程
1)anaconda下载安装教程
2)pycharm下载安装教程
3)项目环境库安装步骤教程
五、项目系统架构
该系统的主要功能模块如下:
- 图像选择与上传模块: 用户界面的主页提供了一个“选择图像”按钮,用户点击后可以从本地设备选择需要识别的植物图像。系统支持常见的图像格式(如JPEG、PNG等),并将所选图像显示在界面中央,方便用户确认。
- 图像处理与识别模块:当用户上传图像后,点击“开始检测”按钮,系统会调用Mobilenet模型对图像进行处理和识别。系统将在后台运行深度学习推断过程,识别时间较短,通常在几秒内完成。
2.1 图像处理模块:
用户上传图像后,系统会对输入的植物图像进行预处理。具体步骤包括:
1)图像的尺寸调整:将输入图像的尺寸调整为模型所需的大小,即224×224像素。
2)图像标准化:按照ImageNet预训练模型的标准,对图像的像素值进行归一化处理。
2.2 模型预测模块:
经过处理的图像输入到预训练的Mobilenet模型中进行预测。该系统采用了在Pytorch框架上训练的Mobilenet 模型,该模型能够在计算资源有限的环境中实现高效的植物识别。模型加载了之前在训练集上获得的最佳权重文件,并进行推断操作,输出分类结果。 - 识别结果展示模块:识别完成后,系统会在界面的结果区域显示植物的名称、分类置信度以及对应的植物详细信息。
六、项目构建流程
1、数据集
数据集文件夹:all_data
概述:
在本系统中,使用了一个从网络上收集的植物图像数据集,包含67类不同种类的植物,共计6877张图像。
数据集格式及命令统一代码: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):
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
),
DepthSeperabel