目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长计算机毕设专题,本次分享的课题是
🎯基于卷积神经网络的指针读数识别方法
项目背景
指针式仪表广泛应用于各种设备和仪器中,如电压表、压力表、温度计等,能够直观显示重要的测量数据。然而,传统的指针读数提取方法往往依赖人工读取,易出现人为错误,且在特定环境下(如光线不足或仪表显示模糊)难以实现准确读取。因此,开发一种高效的指针读数识别系统,能够利用深度学习和图像处理技术,自动识别指针位置并提取读数,将大大提高数据记录的精确性和效率。
数据集
图像采集选择了自主拍摄与互联网采集相结合的方式来构建数据集。一部分图像来源于真实的工业场景,另一部分则是在本课题组实验室拍摄获得。这些图像涵盖了多种类型的指针式仪表,所处的环境背景各异,光照条件也不尽相同。同时,仪表的安装和摆放位置是随机的,这导致部分图像中的仪表表盘出现倾斜或形状畸变为椭圆。这种多样性确保了数据集的全面性,有助于模型在多种条件下的泛化能力。

在数据标注阶段,使用Labelme工具对采集到的图像进行标注。Labelme允许用户利用数量不定、位置任意的坐标点组成一个封闭多边形,从而精确标记图像中的仪表目标。标注完成后,工具会生成相应的JSON文件,其中包含了目标类别和标注区域的坐标信息。数据标注准确性直接影响到后续模型训练的效果,因此要特别重视标注过程中的细节和质量控制,以确保每张图像的标注都能反映出真实情况。

将数据集划分为训练集、验证集和测试集,以便在模型训练和评估中保持高效性。由于Fast SCNN网络需要特定的标签格式,JSON文件并不能直接用于模型训练,因此需要将其转换为仪表表盘的掩码图像。将JSON文件批量转换为掩码图像,所得掩码图像的编号与原图像相同,并将其保存至文件夹中。
设计思路
基于深度学习的语义分割算法已成为一种常用、有效的目标定位手段。语义分割对输入图像的每个像素点进行分类,根据像素点的类别标签进行区域划分,标签相同的像素点构成的区域对应于图像中某一目标所在区域。目前主流的语义分割算法大多基于编解码结构实现,如Deeplab、U-net等。为了提升分割效果,这些算法通常会增加网络深度或引入较为复杂的结构,从而加大了模型的运算量。Fast SCNN轻量级语义分割网络融合了传统编解码结构和高效的two-branch结构,能够实现实时的语义分割。
为进一步增强模型对全局语境信息的理解能力,Fast SCNN借鉴PSPNet、Deeplab,引入金字塔池化模块,对不同感受野下的子区域信息进行聚合,提高了目标区域像素的分类准确率,进而改善网络分割精度。金字塔池化模块的主要处理步骤是利用不同大小的池化核进行池化操作,再将池化特征上采样至同一尺度进行融合,从而提升网络对语义信息和细节信息的学习能力。

全局特征提取模块获得的高层全局特征包含仪表目标的位置信息。为提高网络对仪表区域特征的关注度,可在本模块中添加注意力机制。注意力机制通过对关键特征赋予更大权重,使网络能够充分学习这些关键特征,权重值在训练过程中以参数的形式调整。全局特征提取模块中的核心部件为Bottleneck模块,引入轻量级的ECA注意力机制对Bottleneck模块进行改进,在只增加少量参数的情况下有效改善分割效果和准确度。ECA注意力机制生成输入特征每个通道的权重系数,使得特征乘以对应权重,得到具有ECA注意力的输出特征。ECA注意力机制在进行GPA全局平均池化后,引入一维卷积对特征进行处理,避免通道降维引发的注意力机制性能下降,同时减少额外引入的参数。

在金字塔池化操作后,原网络直接对特征图进行4倍的上采样,这与下采样过程中逐级2倍下采样的方式有所不同,导致跳过了一级2倍上采样。因此,在插值过程中,由于填充的元素过多,会引入较大的误差,这降低了图像细节信息的还原精度,从而影响最终的分割效果。
为提高上采样过程中的图像还原准确度,对原网络的特征融合模块进行了两方面的改进。首先,在原来的4倍上采样结构之前,增加了一级2倍的上采样,旨在避免上采样过程中出现跳级现象,并减少图像扩张运算时引入的插值误差。其次,借鉴U-net网络的思想,从对称的下采样结构中,将特征图跳跃连接到新增上采样结构的输出位置,对两个特征图进行逐元素相加的特征融合。这种方法增强了网络对图像细节信息的还原能力,使得最终的分割效果更加精确。

通过采集包含指针仪表的图像,构建数据集。在这一步骤中,需确保数据集的多样性,包括不同类型的仪表、环境背景和光照条件。数据标注是关键,使用标注工具(如Labelme)对图像中的仪表进行标注,生成相应的标签文件。数据预处理包括调整图像尺寸、归一化和数据增强,确保数据适合于网络训练。
import cv2
import os
from torchvision import transforms
# 数据预处理与增强
transform = transforms.Compose([
transforms.Resize((416, 416)), # 调整图像大小
transforms.RandomHorizontalFlip(), # 随机水平翻转
transforms.ToTensor(), # 转换为张量
])
# 加载和处理图像
def load_and_preprocess_image(image_path):
image = cv2.imread(image_path)
image = transform(image) # 应用预处理
return image
选用Fast SCNN作为基础模型,结合金字塔池化模块以增强网络的特征提取能力。金字塔池化模块通过不同大小的池化核对特征图进行处理,聚合不同感受野下的子区域信息,提升目标区域像素的分类准确率。训练过程中,使用损失函数和优化器来调整模型参数,不断优化网络性能。
import torch
import torch.nn as nn
import torch.optim as optim
# 定义Fast SCNN模型(简化示例)
class FastSCNN(nn.Module):
def __init__(self):
super(FastSCNN, self).__init__()
# 添加卷积层、池化层和金字塔池化模块
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
# 其他层和模块...
def forward(self, x):
x = nn.ReLU()(self.conv1(x))
# 其他层和金字塔池化模块的前向传播...
return x
# 训练模型
def train_model(model, train_loader, criterion, optimizer, num_epochs):
for epoch in range(num_epochs):
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
model = FastSCNN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
train_model(model, train_loader, criterion, optimizer, num_epochs=30)
为了提升模型对全局特征的理解能力,可以在全局特征提取模块中引入注意力机制(如ECA注意力机制)。该机制通过为输入特征的每个通道生成权重系数,增强网络对关键特征的关注。此外,在特征融合模块中,针对上采样过程进行了改进,增加了2倍上采样,避免了跳级现象,并借鉴U-net的思想进行特征图的逐元素相加,从而提升图像细节的还原能力。
class ECAAttention(nn.Module):
def __init__(self, channels):
super(ECAAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.conv = nn.Conv1d(1, 1, kernel_size=3, padding=1, bias=False)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.conv(y.unsqueeze(1)).squeeze(1)
scale = torch.sigmoid(y).view(b, c, 1, 1)
return x * scale.expand_as(x)
# 在特征融合模块中应用ECA注意力
def feature_fusion_with_attention(x1, x2):
attention = ECAAttention(x1.size(1))
x1_attention = attention(x1)
return x1_attention + x2 # 逐元素相加
海浪学长项目示例:






245



被折叠的 条评论
为什么被折叠?



