目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的户外垃圾自动检测识别系统
设计思路
一、课题背景与意义
随着垃圾污染问题日益严重,人们的生活质量越来越高,生活垃圾产生量也在迅速增加,环境隐患日益突出。利用垃圾检测和分类可以实现资源的循环利用,实现垃圾的无害化和资源化,垃圾自动检测识别具有越来越重要的应用价值。
二、算法理论原理
2.1 热力图
为生成目标物体热力图,先使用标注软件Labelme给训练集图片中的垃圾目标物标注一种新的折线标签,该标签简单地表示了物体的中心结构形态。将图片中的所有简形线映射成相应的连续的点。对每根简形线上的每个点进行高斯模糊,其中,高斯核的宽度与简形线对应目标物体的bounding box短边长度成正比。高斯模糊后,简易的目标热力图便生成了。

2.2 YOLOv5算法
使用YOLOv5s网络中backbone的前几层输出构成一个FPN网络分支。该FPN分支输出一个单通道特征图,即预测热力图,用于预测图片中垃圾目标的空间位置和形状。并将预测热力图作为图片的空间注意力权重送回YOLOv5s的backbone中,用于在网络前向传播过程中提高数据中被认为可能是垃圾目标物所在位置的空间注意力。

设计的FPN分支结构全由CBS和C3模块组成,如此也降低了设计的复杂性。基于YOLOv5s前三层的输出组成的FPN分支大致结构如下所示,其中的k表示模块的卷积核大小,c表示模块的输出通道数,未标识卷积核大小的模块,其卷积核大小均为1×1,并且所有模块的卷积步距均为1。Module1和Module2会设置成CBS和C3模块的不同组合以进行实验对比,进而得出更优的FPN分支结构。该组实验中,预测热力图的返回位置均为P1+P2。

相关代码:
super(YOLOv5sBackbone, self).__init__()
# 定义backbone网络结构
def forward(self, x):
# 前向传播过程
# ...
return x
# 定义FPN分支网络
class FPNBranch(nn.Module):
def __init__(self):
super(FPNBranch, self).__init__()
# 定义FPN分支网络结构
def forward(self, x):
return heatmap
# 定义整体网络结构
class YOLOv5sWithFPN(nn.Module):
def __init__(self):
super(YOLOv5sWithFPN, self).__init__()
self.backbone = YOLOv5sBackbone()
self.fpn_branch = FPNBranch()
def forward(self, x):
# 前向传播过程
features = self.backbone(x)
heatmap = self.fpn_branch(features)
# 将预测热力图作为图片的空间注意力权重送回backbone中
weighted_features = features * heatmap
return output
# 创建模型实例
model = YOLOv5sWithFPN()
input_image = torch.randn(1, 3, 256, 256)
# 前向传播
output = model(input_image)
三、检测的实现
3.1 数据集
数据集选取户外日常出现的6个类别的垃圾,分别是塑料瓶、金属罐、小纸盒、口罩、塑料包装袋以及纸类。目前,已有的关于垃圾的公开数据集相对较少,并且其中的拍摄于自然非平整地面的背景较复杂的垃圾图片也非常少。最终只在开源的数据集中找到了200张符合要求的图片。因此,数据集中的绝大多数图片都是通过手机相机从户外实拍采集得到的,并且所有图片都拍摄于草地、树丛、沟槽等地方,图片的背景信息都比较复杂。

最终,数据集中的图片总数为9870张,目标总数为10188个,其中塑料瓶1851个、金属罐1754个、小纸盒1680个、口罩1510个、塑料包装袋1793个、纸类1600个。数据集中的8220张图片作为训练集,1650张图片作为验证集,即训练集与验证集的图片数量比例约为5:1,各类别图片按此比例随机分配。

3.2 实验及结果分析
以FPN_b1作为网络分支,P1+P2为预测热力图返回位置,改进后的YOLOv5s网络相比于原YOLOv5s,每个垃圾类别的召回率均有所提升。经过预测热力图增加了特征层中被认为可能是垃圾目标物的空间位置和形状的权重,垃圾目标物能够被更加准确地识别出来。同时,垃圾检测的mAP也得到了提升。

垃圾检测的mAP@0.5提升了0.6%,mAP@0.5:0.95提升了1.3%,并且检测速率并未发生明显变化。虽然真值目标热力图形状简单,但是这种高效的生成真值热力图的方法节省了大量的人力和时间成本,并且网络分支据此得出的预测热力图效果良好。
训练过程中热力图的损失:

经过训练后FPN_b1生成的预测热力图:

相关代码如下:
# 定义垃圾检测模型
class GarbageDetectionModel(nn.Module):
def __init__(self):
super(GarbageDetectionModel, self).__init__()
# 定义模型结构
# ...
def forward(self, x):
# 前向传播过程
# ...
return output
# 创建模型实例
model = GarbageDetectionModel()
# 加载训练好的模型参数
model.load_state_dict(torch.load('garbage_detection_model.pth'))
model.eval()
# 定义图像预处理函数
def preprocess_image(image_path):
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
image = Image.open(image_path).convert('RGB')
image = transform(image)
image = torch.unsqueeze(image, 0)
return image
# 图像路径
image_path = 'test_image.jpg'
# 预处理图像
image = preprocess_image(image_path)
# 使用模型进行预测
with torch.no_grad():
output = model(image)
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
662



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



