目录
前言
设计思路
一、课题背景与意义
二、算法理论原理
2.1 卷积神经网络
2.2 特征提取网络结构
三、检测的实现
3.1 数据集
3.2 实验环境搭建
3.3 实验及结果分析
实现效果图样例
最后
大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
基于深度学习的唐卡元素自动识别检测系统
鉴于藏传佛教的神秘性以及唐卡艺术品风格华丽,内容丰富,结构复杂,具有的极高艺术价值,普通人又因语言、习俗、地域等限制因素很难机会接触和了解这些艺术品,很难理解唐卡中各种元素内容所代表的具体含义,所以利用图像目标检测技术可以更好的帮助人们去接触和了解唐卡艺术,对于热贡唐卡艺术的学习、普及传承和发扬具有重大意义。
卷积神经网络(Convolution Neural Networks,CNN)最大的特点就是卷积操作运算,CNN在很多与图像相关的任务上都表现得特别出色,如图像分类、语义分割等。前馈、反馈运算是CNN中两个重要的过程。前馈运算主要是推理和预测,反馈运算主要是反向传播误差同时伴随参数的更新,这两种过程在模型中反复更迭进行训练。
GhostNet是一种轻量级卷积神经网络,设计思想非常的精巧。它将传统的卷积操作分成两步进行,第一步先使用较少的计算量用传统卷积生成通道较少的特征图;第二步,在生成的特征图的基础上使用深度卷积进一步使用少量计算生成更多新特征图;最后就是将两次的特征图拼接到一块,得到最终的输出,整个过程减少了计算量。
针对唐卡元素自动检测任务设计出更加轻量、准确的网络模型。主要改进有第一是采用GhostNet中的GhostBottleneck模块去替换原始YOLOv5主干特征提取网络中的Bottleneck模块,结合原始模型里的C3模块形成新的GhostBottleneck-csp模块。第二是将模型里的普通卷积方式代替为Ghost卷积,从而达到优化网络的参数量和计算规模的效果,增强特征提取能力的同时并且真正实现模型的轻量化。
标注唐卡元素特征时,打破了普通水平检测框的限制,针对不同的唐卡对象的目标倾斜程度,对水平检测框进行角度旋转,以最小包围盒的状态对目标特征进行精准标注。因为标注的方式较之前变得更加精确了,所以进行网络模型训练时,提供的不必要的冗余信息也更少了,先验更加充分,能起到更好约束网络模型训练方向以及减少网络模型收敛时间的效果。
相关代码:
class FusionModule(nn.Module):
def __init__(self, in_channels, out_channels):
super(FusionModule, self).__init__()
# 上采样(反卷积)层
self.upsample = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
# 卷积层
self.conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)
def forward(self, high_level_features, low_level_features):
# 上采样(反卷积)操作
upsampled_features = self.upsample(high_level_features)
# 融合操作
fused_features = upsampled_features + low_level_features
# 卷积操作
output = self.conv(fused_features)
return output
# 创建上采样与卷积融合模块
fusion_module = FusionModule(in_channels=256, out_channels=128)
唐卡图像本来就作为稀缺资源,公开且权威的唐卡图像数据集更是少之又少,更没有用于唐卡图像目标检测的唐卡标签数据集,热贡艺术类唐卡图像至今还未有相关研究。所以学长自己创建了唐卡图像和标签数据集。
唐卡图像标注工具选择MakeSense入手难度较小,它功能强大,操作者初用便能在几分钟内迅速进入工作状态。
硬件环境配置:GPU为NVIDIA GeForceRTX 2060,CPU为Intel CORE i7-10750,CUDA 10.2.132,显存为6G,内存16G。系统环境为Windows 10,开发所使用的编程语言为Python 3.7,PyTorch版本为1.8.2+cu102。
唐卡图像中各个类别的AP值即图右上方的各类别数值。当设置IOU值为0.5时计算每一类标签的所有图片的AP值,然后所有标签类别取平均值即图中所示为[email protected]=0.842。
随着模型训练的轮数不断增加,训练集的边界框损失和标签分类损失呈不断下降的趋势。验证集的边界框损失大约在100个epochs后趋于平稳,最终趋于0.04,分类损失大约在80个epochs后趋于平稳,最终稳定在0.004左右,置信度损失最后趋于稳定值约0.06左右。实验模型的召回率和精确度稳定在0.89左右。
模型训练采用的是唐卡旋转目标数据集,所以实验结果中的检测框是带有角度的旋转矩形框,它以最小包围框的形式完美地框选了唐卡图像中待检测的元素特征。这种方式避免了训练过程中输入大量的冗余特征,为更好地提升检测精度做好了充足准备。
相关代码如下:
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.models import resnet
# 定义唐卡元素识别检测模型
class TangkaDetectionModel(nn.Module):
def __init__(self, num_classes):
super(TangkaDetectionModel, self).__init__()
# Backbone
self.backbone = resnet.resnet18(pretrained=True)
# TODO: Add additional layers/modules for object detection
# Head
self.head = nn.Linear(512, num_classes)
def forward(self, x):
# Preprocessing
x = self.preprocess(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 object detection
# Head
out = self.head(x)
return out
def preprocess(self, x):
# Preprocess the input image
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
x = transform(x)
x = x.unsqueeze(0) # Add batch dimension
return x
# 创建唐卡元素识别检测模型
model = TangkaDetectionModel(num_classes=10) # 假设有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)
# 输入示例图像
image = torch.randn(3, 256, 256).to(device)
# 前向传播
output = model(image)
# 在输出中选择检测结果
prediction = torch.argmax(output)
# 打印预测结果
class_names = ['element1', 'element2', 'element3', ...] # 根据实际类别进行命名
predicted_class = class_names[prediction]
print("Detected Element: ", predicted_class)
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!