目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的输液瓶目标检测系统

设计思路
一、课题背景与意义
针对医疗环境趋于复杂,为提高输液瓶目标检测的精度,本文利用视频和图像素材,提出一种改进的YOLOv5s方法检测输液瓶目标。在复杂多变的医疗环境中检测输液瓶目标,可以提高医疗工作效率。
二、算法理论原理
YOLO的核心思想是将整张图作为输入,直接在输出层回归目标位置和类别,具有较强的泛化能力。在一个卷积神经网络中进行特征提取、分类和回归,不再生成候选区域,充分考虑图片所包含背景信息。YOLOv5按网络深度大小分为YOLOv5s、YOLOv5m、YOLO5l、YOLOv5x,其中YOLOv5s深度最小,模型大小仅有27M。采用YOLOv5s作为试验模型,分为Input,Backbone,Neck,Prediction四个部分。

损失函数对于检测效果有着直接影响,因此需要不断调整网络参数,将损失函数的值降到最低。好的回归损失函数会考虑覆盖面积、中心点距离和长宽比这三个方面。而DIoU只考虑到覆盖面积和中心点距离,所以基于DIoU引入入长宽比,提出CIoU Loss。选择CIoU Loss,将覆盖面积、中心点距离和长宽比这三个方面都考虑在内。

相关代码:
class SPP(nn.Module):
def __init__(self, in_channels, out_channels):
super(SPP, self).__init__()
self.pool1 = nn.MaxPool2d(kernel_size=5, stride=1, padding=2)
self.pool2 = nn.MaxPool2d(kernel_size=9, stride=1, padding=4)
self.pool3 = nn.MaxPool2d(kernel_size=13, stride=1, padding=6)
self.conv = nn.Conv2d(in_channels * 4, out_channels, kernel_size=1)
def forward(self, x):
pool1 = self.pool1(x)
pool2 = self.pool2(x)
pool3 = self.pool3(x)
out = torch.cat([x, pool1, pool2, pool3], dim=1)
out = self.conv(out)
return out
class FPNPAN(nn.Module):
def __init__(self, in_channels, out_channels):
super(FPNPAN, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=1)
self.conv2 = nn.Conv2d(in_channels, out_channels, kernel_size=1)
def forward(self, x1, x2):
x1 = self.conv1(x1)
x2 = self.conv2(x2)
out = x1 + x2
return out
class YOLOv5(nn.Module):
def __init__(self, num_classes):
super(YOLOv5, self).__init__()
# Backbone
self.backbone = resnet.resnet50(pretrained=True)
# Neck
self.neck1 = SPP(512, 256)
self.neck2 = FPNPAN(256, 256)
self.neck3 = FPNPAN(256, 256)
# Head
self.head = nn.Conv2d(256, num_classes, kernel_size=1)
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)
x1 = self.backbone.layer1(x)
x2 = self.backbone.layer2(x1)
x3 = self.backbone.layer3(x2)
# Neck
x3 = self.neck1(x3)
x2 = self.neck2(x2, x3)
x1 = self.neck3(x1, x2)
# Head
out = self.head(x1)
return out
# 创建YOLOv5模型
model = YOLOv5(num_classes=80)
# 加载预训练权重
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(1, 3, 416, 416).to(device)
# 前向传播
output = model(image)
# 打印输出的特征图形状
print(output.shape)
三、检测的实现
3.1 数据集
由于没有公开数据集,自建输液瓶目标检测数据,采用YOLO数据集格式,通过预处理和筛选后选取10000张不同分辨率和大小的图片充分训练。

3.2 实验环境搭建
使用PC进行试验,基于Windows10。硬件配置为Intel-Core i5-8300H CPU,GTX-Gforce 1060(6G),使用PyTorch深度学习框架。试验选取SSD、YOLOv5s以及优化后YOLOv5s进行性能对比,验证优化效果。超参数设置:最大训练轮数为100,初始学习率为0.01,权值衰减为0.0005,动量和批量大小分别为0.937和2.0。
3.3 实验及结果分析
算法的mAP变化曲线:

YOLOv5s_CIoU(虚线)和YOLOv5s(实线)的损值曲线:

经过训练以后,YOLOv5s_CIoU的mAP超过YOLOv5s,训练完成后,mAP提高5.47%,速度上有所下降,但也超过30FPS,在实时性和精度上可以满足输液场景的要求。YOLOv5s_CIoU的各类损失可以更快的收敛,mAP也得到提高。
相关代码如下:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
# 加载输液瓶图像
image_path = 'path/to/your/image.jpg'
image = Image.open(image_path)
# 图像预处理
image_tensor = model.preprocess(image)
image_tensor = image_tensor.unsqueeze(0).to(device)
# 进行目标检测
results = model(image_tensor)
# 解析检测结果
predictions = results.pandas().xyxy[0]
for _, prediction in predictions.iterrows():
class_label = prediction['name']
confidence = prediction['confidence']
bbox = prediction[['xmin', 'ymin', 'xmax', 'ymax']].values
# 在图像上绘制边界框和类别标签
image_draw = ImageDraw.Draw(image)
image_draw.rectangle(bbox, outline='red')
image_draw.text((bbox[0], bbox[1]), f'{class_label}: {confidence}', fill='red')
# 保存结果图像
output_image_path = 'path/to/your/output_image.jpg'
image.save(output_image_path)
实现效果图样例

创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
326



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



