目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于机器学习的农作物叶绿素缺乏状态检测
课题背景和意义
小麦作为全球主要的粮食作物,其生长状态与产量直接影响农业生产和粮食安全。叶绿素是植物进行光合作用的重要成分,他的含量直接反映植物的营养状态和生长健康。叶绿素缺乏通常是由土壤缺肥引起的,导致小麦生长缓慢、抗逆性差,最终影响产量。因此,及时、准确地检测小麦叶绿素的含量以及相关缺肥状况,对于指导施肥决策和提高小麦产量具有重要意义。通过引入计算机视觉和深度学习技术,能够实现对小麦叶片的实时监测与分析,为农业管理提供科学依据,推动智能农业的发展。
实现技术思路
一、算法理论基础
1.1 神经网络
卷积神经网络是一种层数较深的神经网络,神经元通过局部连接的方式进行连接,且在同一层中的部分神经元权值是共享的。这一机制使得网络规模不会过大,同时保持良好的信息提取性能,提高网络的泛化能力。卷积神经网络结构包含输入层、卷积层、池化层、全连接层和输出层。
卷积层是卷积神经网络的核心,位于输入层之后,主要通过卷积操作学习输入图像的特征表示。卷积层的核心是卷积核,负责学习输入图像的特征信息,每个卷积层一般由多个卷积核组成。卷积核能够感知的范围称为感受野。经过卷积运算后,生成的结果称为特征图,多个特征图共同组成卷积运算后的图像特征,表示图像更丰富的特征。在图像识别领域,通常使用二维卷积。卷积神经网络通常包含多个卷积层,前面的卷积层主要提取低层次特征,如颜色、边缘和形状,后面的卷积层则提取更抽象的高层次特征。
池化层又称下采样层,是卷积神经网络中的常用层,主要用于压缩图像数据,减少计算量,提高网络效率,并有助于减少过拟合现象。池化操作的思想是将输入特征图分割为若干个固定大小的池化窗口,并对每个窗口中的元素进行特定规则的池化计算,生成新的特征图作为输出。常用的池化方式包括最大池化和平均池化。最大池化取每个池化窗口中的最高值作为输出,能够保留图像中最显著的特征,而平均池化则取窗口中所有元素的平均数作为替代值,反映图像的全局信息。尽管池化操作可以降低数据维度,减少计算量,但也会在降维过程中丢失部分细节特征信息,可能导致网络精度下降。此外,池化层的不同参数设置对网络性能也会产生影响。
全连接层位于卷积层和池化层之后,位于网络的尾部。该结构将卷积学习到的特征空间映射到样本标记空间,实现分类作用。输入的图像数据经过卷积网络层后生成一组特征向量,这个向量经过全连接层后会实现权重累加运算,将之前学习到的局部信息聚集起来,最终输出到分类器实现分类。全连接层与卷积层和池化层不同,每个神经元与上一层的所有神经元相连,因此在该层中的参数量是卷积神经网络中最大的。
卷积操作实际上是线性运算,增加更多卷积层也只会得到线性映射,而实际数据通常是复杂的非线性分布。激活函数的引入为线性网络加入非线性表达,强化卷积神经网络的非线性表征性能,实现非线性特征的提取和学习。激活函数是神经网络的关键构成元素,通常具有非线性、可微性和单调性等特点。常用的激活函数有 Sigmoid、Tanh 和 ReLU。
损失函数用于描述网络的预测值与真实值之间的距离,评价二者的偏离程度,是优化卷积神经网络参数的重要指标。损失值越大,模型准确率越差,反之亦然。在训练过程中,损失函数通过网络输出与实际值的偏差计算损失值,并通过梯度下降算法调整网络参数,降低损失值,提升网络准确率。优化器自动更新网络权重和偏置,使损失函数趋于最小化,提升网络精度。常用的优化器算法有梯度下降法、动量优化法和自适应学习率等。
1.2 MobileNet V3
在轻量级卷积网络 MobileNet V1 和 MobileNet V2 的基础上提出的新版本,结合了前两者的优点并进行了创新。MobileNet V3 采用 V1 中的深度可分离卷积,用以减少网络参数并提高训练速度,同时引入 V2 提出的具有线性瓶颈的逆残差结构,显著提高了内存效率。在瓶颈结构中引入压缩激励模块,用于动态调整通道间的权重,选择性地放大重要通道的权重,从而提升模型的特征提取能力。此外,V3 使用了一种新的激活函数 h-swish 替代 swish 函数,显著降低了网络的计算量。V3 与前两个版本最大的不同在于其网络结构是通过互补搜索技术组合学习而来,由资源受限的神经架构搜索技术执行模块级搜索,搜索全局网络结构,而 NetAdapt 执行局部搜索,搜索每层的滤波器数量。
感受野是卷积操作中的重要概念,指卷积神经网络中每个输出特征图的每个像素点对应输入特征图的区域大小,感受野的大小决定了网络对输入特征的学习程度。传统卷积神经网络通常采用下采样池化操作来增大感受野,但频繁的卷积和池化操作会导致输入特征图丢失许多细节信息,难以满足细粒度分类图像任务的需求。空洞卷积不仅可以增加输出特征图中每个像素点的感受野,提升网络的特征提取能力,还不会损失特征信息,因此在图像分类任务中引入空洞卷积可以提升网络的识别性能。空洞卷积又称扩张卷积,通过使卷积核的感受野各像素位置之间存在空洞,使得小尺寸卷积核经过卷积计算后获得与大尺寸卷积核相同的感受野,同时保持原计算量不变,从而学习到更丰富的特征信息。
1.3 注意力机制
CBAM 注意力模块能使网络更关注对小麦叶绿素缺乏状态识别起关键作用的特征,从而提高模型的特征提取能力。与 SE 模块仅关注通道信息不同,CBAM 注意力机制由通道注意力模块和空间注意力模块组成。通道注意力模块对输入特征图进行平均池化和最大池化,经过多层感知机得到通道的注意力权重,随后通过 sigmoid 函数获得归一化的通道注意力权重,并通过乘法逐通道加权到原始特征图上,实现对原始通道权重的重新标定。
空间注意力模块对通道注意力模块输出的特征图进行最大池化和平均池化操作,将得到的两个特征图在通道上拼接,再经过卷积生成一个通道,经过 sigmoid 函数得到空间注意力权重系数,与输入特征图相乘,提取病斑位置信息,获得空间维度的注意力特征,使得模型更具鲁棒性。
CBAM 模块先通过 CAM 获得的全局信息调整特征图,再通过 SAM 获得的局部信息进一步调整特征图,二者为串行操作,后者的处理结果依赖前者,可能影响对特征图空间信息的处理。将串行结构改为并行结构,使 CAM 和 SAM 分别直接对原特征图进行处理,得到的通道权值和空间权值与原特征图拼接,形成处理后的特征图。设计的并行结构避免了因前后顺序不同导致的信息干扰问题,从而提升了网络对病斑特征的提取性能。
二、 数据集
2.1 数据集
小麦数据集的制作过程首先包括图像采集,主要采用自主拍摄和互联网采集两种方式。自主拍摄在小麦生长季节进行,通过高分辨率相机拍摄不同生长阶段的小麦叶片,确保涵盖各种生长环境和状态。互联网采集则通过访问相关数据库和公开数据集,获取已有的小麦叶片图像,以补充数据集的多样性和丰富性。数据标注使用 Labeling 工具进行,标注过程中对每张图像中的小麦叶片状态进行分类,主要包括正常状态和缺乏状态。标注人员需要仔细检查每个标记,确保准确性。生成的标注文件包含图像路径、目标位置及类别信息,形成标准化的数据标注格式,便于后续模型训练和评估。
2.2 数据扩充
为避免过拟合现象,采用数据增强方法扩充数据集。常见的数据增强方法包括几何变换和颜色增强。几何变换方法如旋转、平移和缩放,可增加样本的多样性;颜色增强方法如亮度调整、对比度变化等,可以模拟不同的光照条件。这些数据增强技术有效提高了模型的泛化能力,并增强了对小麦叶绿素缺乏状态的识别能力。
三、实验及结果分析
3.1 实验环境搭建
深度学习框架为构建、训练、优化和推理深度神经网络提供了必要的基础工具,使开发者能够更高效地进行相关工作。这些框架不仅简化了复杂的计算过程,还提供了丰富的功能和灵活的接口,帮助开发者快速实现各种深度学习算法。在众多深度学习框架中,PyTorch因其高度的扩展性和可移植性而受到广泛欢迎,尤其在学术研究和工业应用中表现出色。它的动态计算图特性使得模型的调试和修改变得更加直观和方便,同时,PyTorch拥有一个活跃的开发者社区,提供了大量的资源和支持,极大地推动了深度学习的研究和应用。
3.2 模型训练
对准备好的数据集进行加载和预处理。数据集应包含标注好的图像数据,标注内容包括正常状态和缺乏状态的样本。使用 PyTorch 的 DataLoader
加载数据,并进行必要的预处理,如图像缩放、归一化等,以确保输入数据符合模型要求。
from torchvision import transforms
from torch.utils.data import DataLoader
from custom_dataset import CustomDataset # 自定义数据集类
# 数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)), # 调整图像大小
transforms.ToTensor(), # 转换为张量
])
# 加载数据集
train_dataset = CustomDataset('path/to/train', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
选择轻量级卷积神经网络 MobileNet V3 作为基础网络,并在其最后两个 bottleneck 模块中引入空洞卷积操作,以增加感受野,提取更多的特征信息。为了解决“网格效应”导致的信息丢失问题,采用锯齿空洞卷积。此外,将原有的 SE 模块替换为改进的 P_CBAM 模块,使得模型在关注通道信息提取的同时,也能关注空间信息的重要性。为了解决数据不平衡问题并防止过拟合,提出结合标签平滑交叉熵损失函数和中心损失函数的 LS_CC 损失函数。通过这样的损失函数,网络能够适应细粒度分类特征的类内紧凑和类间分散的特点,更好地区分学习到的深度特征。同时,使用 Adam 优化器进行参数更新。
import torch.optim as optim
# 定义损失函数和优化器
criterion = LSCrossEntropyLoss() # 自定义的 LS_CC 损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练循环
for epoch in range(num_epochs):
model.train()
for images, targets in train_loader:
optimizer.zero_grad()
outputs = model(images.to(device))
loss = criterion(outputs, targets.to(device))
loss.backward()
optimizer.step()
在训练完成后,使用验证集对模型进行评估。评估过程中可以计算准确率、召回率和 F1 分数等指标,以全面评估模型在小麦叶绿素缺乏状态检测任务中的表现。根据评估结果,调整模型参数和结构,以进一步优化性能。
from metrics import calculate_metrics # 自定义评估指标计算函数
model.eval()
with torch.no_grad():
for images, targets in val_loader:
outputs = model(images.to(device))
metrics = calculate_metrics(outputs, targets.to(device))
print(f"Accuracy: {metrics['accuracy']}, F1: {metrics['F1']}")
海浪学长项目示例:
最后
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!