目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的大米质量识别检测算法
设计思路
一、课题背景与意义
大米在加工和储存过程中也容易出现破损和发霉的情况,而外观缺陷是评估种子质量的重要指标。在大米的交易和流通中,外观品质是影响大米价格的重要因素之一,因此提高大米的分选质量具有重要的意义。随着深度学习在目标检测领域的不断发展,将卷积神经网络应用于农产品检测中,为大米品质检测提供了有价值的参考。
二、算法理论原理
2.1 卷积神经网络
YOLOv5s原始模型只有三个检测层,其中80x80特征图负责检测小目标。然而,该层特征图包含的语义信息相对较小,容易导致小目标漏检。为了提高对小目标的识别率和准确率,本文增加了一个小目标检测层,即160x160的特征图。同时,采用多尺度特征图相融合的方式,将浅层特征图与深层特征图融合,以保留更多小目标的语义信息。
使用Ghost模块替换YOLOv5s骨干网络中的CSP1_模块。第一个普通卷积用于降低通道数量,减少网络参数量;第二个卷积采用深度可分离卷积中的深度卷积,并将两个卷积进行拼接操作。当输入向量为H(行数)×W(列数)×N(通道数)时,输出向量为H×W×M(M为偶数)时,输入向量经过M/2个1×1×N的卷积核将其压缩为H×W×M/2的向量。然后经过深度卷积,深度卷积对输入向量的每一个通道进行一个不同的k×k×1的卷积运算,经过M/2个深度卷积得到M/2个H×W的向量。
CBAM是一种结合空间和通道的注意力机制的模块,包含通道注意力机制和空间注意力机制。CBAM注意力机制的结构如图3所示,特征图先经过通道注意力机制模块,然后传入空间注意力机制模块,完成特征的提取。
三、大米质量识别检测的实现
3.1 数据集
为了识别大米,需要采集相关图像来建立图像数据集。以金龙鱼大米为研究对象,图像采集装置为高清相机,采集图片的格式为JPG。数据集共包含2000张图片。通过增加数据集的数量,可以有效解决因数据集不足导致网络拟合较差的问题,从而提高网络的泛化能力。数据集的训练和验证、测试集比例为8:1:1。经统计,训练集中正常米有10702粒,垩白米有9312粒,碎米有7283粒。测试集中正常米有447粒,垩白米有663粒,碎米有334粒,这些数据用于评估模型的性能。
3.2 实验环境
计算机配置了一块 GeForce GTX 1650 Ti 显卡和 16GB 运行内存,操作系统为 64 位 Windows 10。深度学习框架使用的是 PyTorch 1.10.1 和 Torchvision 0.11.2,编程语言为 Python 3.8。
在训练过程中,批量尺寸设置为 8,图片输入尺寸为 640x640。总训练轮数设置为 200,多线程设置为 3。学习速率值为 0.001,动量参数值为 0.9,权重衰减系数值为 0.0005,置信度阈值为 0.6。
3.2 评价指标
对于大米分类识别检测任务,常用的评价指标包括准确率(Precision)、召回率(Recall)、F1值(F1 score)、平均精度(Average Precision)和平均精度均值(Mean Average Precision)。使用IOU阈值为0.5时的AP和mAP来评估模型的好坏。检测时间以网络检测单张图片所消耗的平均时间为标准。
部分代码如下:
self.conv1 = Conv(in_channels, out_channels, kernel_size=3, stride=2, padding=1)
self.conv2 = Conv(out_channels, out_channels, kernel_size=3, stride=1, padding=1)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
return x
class CBAMC3(nn.Module):
def __init__(self, in_channels, out_channels):
super(CBAMC3, self).__init__()
self.csp = BottleneckCSP(in_channels, out_channels, n=1, shortcut=False)
self.cbam = CBAMModule(out_channels)
def forward(self, x):
x = self.csp(x)
x = self.cbam(x)
return x
class YOLOv5WithSmallObjectDetection(nn.Module):
def __init__(self, num_classes):
super(YOLOv5WithSmallObjectDetection, self).__init__()
self.backbone = nn.Sequential(
Conv(3, 32, kernel_size=3, stride=1),
Conv(32, 64, kernel_size=3, stride=2),
CBAMC3(64, 128),
CBAMC3(128, 256),
CBAMC3(256, 512),
CBAMC3(512, 1024),
)
self.small_object_detection = SmallObjectDetectionLayer(1024, 256)
self.conv = Conv(1024, 256, kernel_size=1)
self.fc = nn.Linear(256 * 7 * 7, num_classes)
def forward(self, x):
x = self.backbone(x)
small_object_features = self.small_object_detection(x)
x = self.conv(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!