目录
前言
设计思路
一、课题背景与意义
二、算法理论原理
2.1 加入全局注意力模块
2.2 引入解耦头
三、检测的实现
3.1 数据集
3.2 实验环境搭建
3.3 实验及结果分析
实现效果图样例
最后
大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
基于深度学习的指针式仪表自动读数算法系统
选择YOLOv5s网络进行改进。对于骨干网络,在最后一个C3模块后面加上全局注意力模块(global attention mechanism, GAM),以强化网络提取能力;在颈部区域,新增尺寸为输入图像1/4的特征图,从而提升网络针对较小目标的特征挖掘能力;最后,引入Decoupled-head解耦头,以改进网络模型检测模块的分类和定位效果。
在YOLOv5原始网络中,对每一层特征进行提取时给予同等的关注度,这种方法忽略了不同特征通道具有不同的重要度,将导致部分目标提取困难。针对此网络特征差异性敏感度较弱问题,在骨干网络中加入GAM模块,利用该模块对特征利用能力强的优点,减少信息损失并且提高全局特征交互。
引入解耦头替换原有耦合头部,解耦头经1×1卷积后,将通道维数减小至统一通道数,再接入2个平行的3×3卷积层,分别用于分类任务和定位、置信度任务,对于用于定位和置信度任务的分支再使用2个平行的1×1卷积进行解耦,最终能使分类、定位和置信度检测分别采用不同的检测层。
相关代码:
classification_output = self.classification_conv(x)
localization_output = self.localization_conv(x)
confidence_output = self.confidence_conv(x)
return classification_output, localization_output, confidence_output
# 输入特征的通道数
in_channels = 256
# 输出特征的通道数(减小至统一通道数)
out_channels = 128
# 分类任务的类别数
num_classes = 10
# 定位任务的类别数
num_loc_classes = 4
# 置信度任务的类别数
num_conf_classes = 2
# 创建解耦头经模型
decoupled_head = DecoupledHead(in_channels, out_channels)
# 输入示例特征
features = torch.randn(1, in_channels, 64, 64)
# 前向传播
classification_output, localization_output, confidence_output = decoupled_head(features)
采集实验测试场地的2400张仪表图像,包含一种不同类型的仪表,按照8∶1∶1的比例随机划分成训练集、验证集与测试集。训练时网络输入图片大小为640 pixel×640 pixel,采用SGD优化器,初始学习率为0.01,动量系数大小为0.937,Batch设为32,迭代次数400次。用平均准确度均值(mean average precision, mAP)评价目标检测效果。
仪表读数系统以Python为开发语言,在Ubuntu系统上进行仿真实验。实验的硬件配置为Intel(R) Core i7-9700K CPU,NVIDIA Geforce RTX2080 Ti显卡,软件环境为CUDA10.0,Cudnn7.5.0。
在得到倾斜校正好的仪表表盘图像后,采用极坐标变换对不同种类仪表表盘进行展开。将展开后的仪表数据集用原始YOLOv5网络进行训练,同样以mAP评价目标检测效果,在测试集上得到mAP为99.5%,证明YOLOv5对指针的目标检测在精度上有较好效果。
对于不同影响、不同种类的仪表都能进行较准确的读数,具有一定泛化性和鲁棒性,在所有测试样本上进行实验后,验证方法对于指针式仪表读数的最大相对误差小于2.5%,能在实际场合中应用。
相关代码如下:
def forward(self, x):
# Backbone
x = self.backbone.conv1(x)
x = self.backbone.bn1(x)
x = self.backbone.relu(x)
x = self.backbone.maxpool(x)
x = self.backbone.layer1(x)
x = self.backbone.layer2(x)
x = self.backbone.layer3(x)
x = self.backbone.layer4(x)
x = self.backbone.avgpool(x)
x = torch.flatten(x, 1)
# TODO: Implement pointer detection and reading
# Head
out = self.head(x)
return out
# 创建指针式仪表自动读数模型
model = PointerReadingModel(num_classes=10)
# 加载预训练权重
pretrained_weights = 'path/to/your/pretrained_weights.pth'
model.load_state_dict(torch.load(pretrained_weights))
# 将模型移至GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!