目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
设计思路
一、课题背景与意义
正确佩戴口罩是阻止病毒传播的有效方法,因此在机场、火车站等重要公共场所安装了许多口罩识别系统,以检测人们是否佩戴口罩。然而,当人们用围巾、衣领、手等遮住口鼻以通过检测设备时,往往可以骗过机器,从而造成重大的安全隐患和疫情传播的风险。
二、算法理论原理
2.1 YOLOv5 网络算法
YOLOv5是一种单阶段目标检测算法,它在YOLOv4的基础上增加了focus结构,构建了两个CSP结构。YOLOv5网络包含四个通用模块,以及六个基本组件。

2.2 损失函数
原始YOLOv5模型中使用了GIoU损失函数。GIoU的提出是为了缓解IoU损失函数不与检测框重叠时的梯度问题,惩罚项被加入到原始IoU中。由于DIoU_loss可以直接最小化两个目标框A,B之间的距离,所以收敛速度更快。此外,DIoU还可以代替常见的IoU评价策略,应用于NMS,使NMS得到的结果更加合理和高效。

相关代码示例:
# 在验证和测试数据上应用相同的预处理,但不进行数据增强
val_test_transform = transforms.Compose([
transforms.Resize(size=(224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 在训练过程中应用数据增强
for images, labels in train_loader:
augmented_images = []
for image in images:
augmented_images.append(train_transform(image))
augmented_images = torch.stack(augmented_images)
# 在这里进行模型训练
三、检测的实现
3.1 数据集
数据集的制作主要包括三个步骤:数据收集与整理、数据预处理、数据集标注。根据YOLO算法的要求,本实验使用的数据按照数据集的标准格式进行处理,并用Labelimg标注软件进行手工标注,生成XML文件用于训练。

从整合后的20000张图片中,选出3120张符合要求的图片进行标注,用Labelimg工具进行标注,并将其分为六类。划定的训练集为2082张图像,测试集为1038张图像。

在初步整理好实验所需数据集后,数据集中存在低分辨率与高分辨率的图像。基于这些存在差异的图像产生的锚框的大小与被检测物体的大小尺度不同,会导致目标检测不准确,出现错检与漏检的情况。

3.2 实验环境搭建

在模型训练前,基本参数设置如下:动量设置为0.937,权重衰减系数设置为0.0005,初始学习率为0.001。

3.3 实验及结果分析
实验基本流程框架为:输入数据集图片。使用YOLOv5改进算法。通过对各类标签的训练得到检测模型。对测试集进行测试。输出结果完成目标检测。

改进后的YOLOv5网络训练过程中整体损失函数的各收敛情况曲线如下所示当迭代次数达到100次时,损失值稳定在0.03左右,而mAP精度稳定在0.72左右。该网络在训练阶段效果良好。

改进后的YOLOv5网络训练过程中整体损失函数的精度曲线如下所示。整体定位准确,识别效果理想。经过训练和测试,得出每个类别的平均检测精度,改进后的模型提高了大部分类别图像的平均识别率,可以有效提高检测性能。这为提升现有口罩识别系统的性能提供了一定的技术支持。

相关代码示例:
# 加载类别标签
labels = ['background', 'face', 'mask']
# 读取图像
image = Image.open('path/to/your/image.jpg')
# 图像预处理
image_tensor = F.to_tensor(image)
image_tensor = image_tensor.unsqueeze(0)
# 目标检测
with torch.no_grad():
predictions = model(image_tensor)
# 解析预测结果
boxes = predictions[0]['boxes']
scores = predictions[0]['scores']
labels = predictions[0]['labels']
# 打印检测结果
for box, score, label in zip(boxes, scores, labels):
if score > 0.5: # 设置阈值进行筛选
print('Label: {}, Score: {:.2f}'.format(labels[label], score))
print('Bounding Box:', box)
# 可视化检测结果
image_draw = Image.fromarray(image)
draw = ImageDraw.Draw(image_draw)
for box, label in zip(boxes, labels):
if score > 0.5: # 设置阈值进行筛选
draw.rectangle(box.tolist(), outline='red')
draw.text((box[0], box[1]), labels[label], fill='red')
image_draw.show()
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
4001



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



