前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的苹果树页面病虫害识别算法系统
设计思路
一、课题背景与意义
传统的病虫害识别方法通常需要依赖专业知识和人工观察,这限制了识别的准确性和效率。因此,开发一种基于深度学习的苹果树叶面病虫害识别算法系统具有重要意义。
二、算法理论原理
2.1 卷积神经网络
CNN作为一种包含了卷积滤波操作和池化处理的多层有深度的神经网络,主要工作分为两部分,先对其进行特征提取再分类。该网络利用卷积层和池化层来实现图像数据的特征提取,从而得到图像的特征图,卷积层利用不同尺寸大小的卷积核得到不同抽象程度的特征图,通过改变卷积核的个数,得到更多通道的特征图,池化层一般跟在卷积层之后,对卷积操作之后得到的特征图的参数进行缩减。在早期,通常使用几层全连接神经网络将提取的特征进行分类
卷积层主要是通过卷积核也叫过滤器来提取图片中的有用特征。过滤器是一个大小为3x3的二维矩阵,也可以是其他形式的矩阵,如2x2或5x5。随着卷积层的不断深入,它所提取到的特征就越高级和抽象。卷积更有助于发现特定的局部图像特征,从而输入到后面的网络中。在提取特征时,可以设置卷积的移动步长,让滤波器在神经网络对应图像上移动,从左上角遍历到右下角。
对图像进行池化操作一般在卷积操作之后,池化的实质是利用图像的局部特征相关性对特征图进行局部特征缩减。池化的方式有两种,一种是最大池化(max pooling),另一种是平均池化(mean pooling)。池化后输出的特征图按照一定规律保留特征,既降低计算量,又避免过拟合现象。最大池化是保留局部最大特征值,平均池化是保留局部特征值的平均值。
在CNN中,卷积层一般与激活层连接起来对图像进行处理。激活层将网络中所有的输入信号进行函数变换。除了激活层外,在神经网络的各层都是线性运算,没有非线性运算。池化层不与激活函数连用。
2.2 改进的YOLOv5算法
引入SENet(Squeeze-and-Excitation Networks)模块。SE模块主要由Squeeze和Excitation两部分组成。给定输入x,其特征通道为c1,经过一系列的卷积变换后得到特征通道数为c2的特征。然后通过三个操作对前面得到的特征进行重标定。首先是通过squeeze操作,在空间上映射特征信息,生成一个通道的描述向量。这个描述向量的作用是在通道层次上生成一个嵌入全局分布的特征,使得网络的所有层都能使用来自全局感受野的信息。接下来是excitation操作,采用简单的门控机制,将描述向量作为输入,并生成每个通道对应的权重集合。这些权重被应用于特征U,生成SE模块的输出,然后传递给后续的网络。
YOLOv5根据不同的网络深度和宽度分为YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x四个模型。在最轻量的YOLOv5s模型的基础上进行改进,并与原始网络进行对比。在YOLOv5s中引入SENet注意力机制,将该注意力机制嵌入到Backbone中的CBL模块和Bottleneck CSP中的残差块,以帮助模型更好地提取感兴趣目标的特征,特别关注苹果叶面病害目标。这一改进大大增强了模型训练的效率。
相关代码示例:
class BottleneckCSP(nn.Module):
def __init__(self, in_channels, out_channels, hidden_channels=None):
super(BottleneckCSP, self).__init__()
hidden_channels = out_channels // 2 if hidden_channels is None else hidden_channels
self.conv1 = nn.Conv2d(in_channels, hidden_channels, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(hidden_channels)
self.relu = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(in_channels, hidden_channels, kernel_size=1, stride=1, padding=0)
self.bn2 = nn.BatchNorm2d(hidden_channels)
self.relu = nn.ReLU(inplace=True)
self.attention = SelfAttention(hidden_channels)
self.conv3 = nn.Conv2d(hidden_channels, out_channels, kernel_size=1, stride=1, padding=0)
self.bn3 = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
out1 = self.conv1(x)
out1 = self.bn1(out1)
out1 = self.relu(out1)
out2 = self.conv2(x)
out2 = self.bn2(out2)
out2 = self.relu(out2)
out2 = self.attention(out2)
out = torch.cat([out1, out2], dim=1)
out = self.conv3(out)
out = self.bn3(out)
out = self.relu(out)
return out
三、果树叶面病虫害检测的实现
3.1 数据集
本文实验研究所用数据集来自与互联网。
实验抽取原数据中的3个数据集,分别是:苹果锈病、苹果白粉病、苹果灰斑病。本文实验使用Python安装Labelme工具箱给苹果病害病斑信息进行人工标注。首先将要标注的数据集准备好,再启动Labelme,选择需要标注的数据集保存在本地路径。
使用Labelme软件标记苹果树叶患锈病的样例图。在下图中,label list表示标签列表。由于标记的是锈病,所以标签显示为"rust"。
使用Labelme标注图像后生成JSON文件,下图展示了一个患灰斑病的标注文件的具体信息。
3.2 实验环境搭建
本实验使用PyTorch构建网络模型,并在Windows 10操作系统下,使用Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz和NVIDIA GeForce RTX 2080Ti GPU平台进行实验。下表展示了实验所使用的显卡参数、内存、处理器参数和开发环境等具体信息。
3.3 实验及结果分析
经过训练,loss值逐渐下降,定位损失、目标置信度损失和类别损失分别趋于0.021、0.013和0.00015以下,同时mAP、准确率和召回率趋于稳定。
改进后的算法模型表现最好,各项性能指标均优于YOLOv5s原始模型。其准确率为80.45%,召回率约为99.65%,当交并比为0.5时,mAP达到99.45,在0.5到0.95的交并比范围内,平均mAP为74.96。尽管在检测速度方面略低于YOLOv5s,但其他性能指标均有所提升。
由于苹果叶面病害分类的数据量较少,使用卷积神经网络进行分类容易出现过拟合的情况。因此,采用迁移学习的方式,利用ResNet网络完成苹果叶面病害的分类任务。使用深度学习平台PyTorch实现了ResNet50网络。针对分类任务,通过随机梯度下降(SGD)反向传播进行网络模型微调。训练过程中采用SGD优化算法进行梯度更新,损失函数采用多分类交叉熵损失函数,批次大小设置为16。
为了完成训练,首先将在ImageNet数据集上训练得到的权重转移到ResNet50网络中,然后分别进行训练,并设置训练周期EPOCHS的值为5、10和20。观察损失值变化曲线可见,随着训练周期EPOCHS的增加,训练和测试损失值逐渐减小,没有出现过拟合现象。
部分代码如下:
preprocess = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 加载并预处理图像
def load_image(image_path):
image = Image.open(image_path)
image = preprocess(image).unsqueeze(0)
return image
# 进行病虫害识别
def predict_disease(image_path):
image = load_image(image_path)
# 使用预训练模型进行预测
with torch.no_grad():
outputs = model(image)
_, predicted = torch.max(outputs, 1)
# 获取识别结果
predicted_label = labels[predicted.item()]
return predicted_label
# 指定输入图像路径进行病虫害识别
image_path = 'apple_image.jpg'
predicted_label = predict_disease(image_path)
# 输出识别结果
print("预测结果:", predicted_label)
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
最后
本文转载自: https://blog.csdn.net/qq_37340229/article/details/134839553
版权归原作者 HaiLang_IT 所有, 如有侵权,请联系我们删除。
版权归原作者 HaiLang_IT 所有, 如有侵权,请联系我们删除。