目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
设计思路
一、课题背景与意义
近年来,由于过度开垦,草原植被生长周期变长,植被矮小,覆盖率低,为鼠类生存提供了合适的生存环境,导致鼠类猖獗。严重威胁了草原生态环境和生物多样性,也制约着畜牧业的经济发展。因此,动态的观察鼠类变化,加强鼠害监测,有利于及时开展防治,对生态改善和畜牧业发展具有重大意义。为了解决鼠洞检测背景复杂,容易漏检、误检的情况,在图像检测任务中融合注意力机制,更好的关注鼠洞特征,抑制背景信息干扰。
二、算法理论原理
2.1 ECA 注意力机制
为了解决鼠洞检测背景复杂、容易漏检和误检的问题,在图像检测任务中融合注意力机制,能够更好地关注鼠洞特征并抑制背景信息干扰。ECANet是在分析 SENet 跨通道交互过程中存在模型降维,会对预测产生负面影响的基础上提出。去除了 SENet 中的 FC(全连接层)层,将全连接改为一维卷积的形式。由于是一种非全连接,因此每次卷积只对部分通道起作用,实现了跨通道交互。
将ECA 注意力机制模块加在 Backbone 主干网络 C3 层的平均检测精度更高,在C3 模块中加入 ECA 注意力机制,结合为 C3ECA 模块。在主干网络下采样的第 2 层开始进行特征增强,来获得更多细节信息,更加准确的检测小鼠洞。且对于小鼠洞来说,预测框和真实框之间的中心点距离作用更明显,长宽比并不占优势。
2.2 SIoU Loss
SIoU从回归向量之间的方向和夹角出发,引入真实框和预测框之间的向量角度,对预测框进行 x轴或y轴某一方向的约束,来提高收敛速度。SIoU由角度成本 Angle cost,距离成本 Distance cost,形状成本 Shape cost 和 IoU cost 四个成本函数组成。对于鼠洞这类目标的检测,YOLOv5s经过多次下采样会丢失鼠洞浅层信息,存在容易漏检的情况,对于距离较近的鼠洞会出现冗余框。因此,对YOLOv5s网络进行改进。在主干网络加入注意力机制来更好的进行特征提取,实现鼠洞的精准定位和识别;采用转置卷积来学习最优的上采样方法,恢复缺失的鼠洞信息,使模型获取更多的特征。
相关代码:
# 加载预训练的模型
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()
# 图像预处理
transform = transforms.Compose([
transforms.ToTensor(),
])
# 加载图像
image_path = 'path_to_image.jpg'
image = Image.open(image_path)
image_tensor = transform(image)
# 将图像转移到GPU(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
image_tensor = image_tensor.to(device)
# 运行图像通过模型
outputs = model([image_tensor])
# 解析输出
boxes = outputs[0]['boxes']
scores = outputs[0]['scores']
labels = outputs[0]['labels']
# 打印检测结果
for box, score, label in zip(boxes, scores, labels):
print('Class:', label.item())
print('Confidence:', score.item())
print('Box coordinates:', box.tolist())
三、检测的实现
3.1 数据集
数据采集平台为大疆无人机拍摄,为丰富数据集特征,对夏季7月和冬季12月的草地鼠洞进行拍摄。对于鼠洞这类目标的检测,YOLOv5s经过多次下采样会丢失鼠洞浅层信息,存在容易漏检的情况,对于距离较近的鼠洞会出现冗余框。因此,对YOLOv5s网络进行改进。在主干网络加入注意力机制来更好的进行特征提取,实现鼠洞的精准定位和识别;采用转置卷积来学习最优的上采样方法,恢复缺失的鼠洞信息,使模型获取更多的特征。
使用伽马变换修正和增强对比度灰度过高或者过低的图片;对图像进行模糊处理来增强检测干扰,提升训练鲁棒性;通过抠图的方式裁剪目标样本,采用贴图的方法随机粘贴到数据集并进行平滑处理,最后筛选出合格的数据集进行训练。。用LabelImg标注工具对鼠洞(mousehole)目标进行标注,并转换成YOLO框架的TXT类型标签文件。
3.2 实验环境搭建
试验所用的计算机硬件环境为12th Gen Intel(R)Core(TM)i5-12600KF 3.70 GHz 16.0 GB,NVIDIA GeForce RTX 3080 GPU,软件环境为Windows 10操作系统,深度学习框架为Pytorch,所用语言为Python。输入图像为640×640,训练时batch size为8,初始化学习率为0.01,优化器为Adam,可自动调整学习率,学习率动量为0.9,权重衰减为0.0005。
3.3 实验及结果分析
训练中设置相同的数据集和参数,根据训练生成的数据绘制目标训练损失函数曲线。可以看出前50个epoch快速拟合,在200个epoch左右,loss值逐渐平缓收敛。因此,训练的epoch设为200。
改进前后 mAP 对比图:
改进后的模型在鼠洞被遮挡的情况下也能完全识别出鼠洞;在有阴影的情况下,也能避免阴影,只识别鼠洞;在图像模糊的情况下也能准确识别鼠洞特征;在光线较暗的情况下,对间隔距离较近的鼠洞也能分别正确框出鼠洞位置,不会出现多框的情况。
相关代码如下:
# 定义转置卷积模型
class UpsampleModel(nn.Module):
def __init__(self):
super(UpsampleModel, self).__init__()
self.upsample = nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding)
def forward(self, x):
x = self.upsample(x)
return x
# 加载原始图像和缺失的鼠洞信息
original_image = torch.randn(batch_size, channels, height, width)
missing_hole = torch.randn(batch_size, channels, hole_height, hole_width)
# 创建模型实例
model = UpsampleModel()
# 转置卷积输入
upsampled_hole = model(missing_hole)
# 将上采样的鼠洞信息与原始图像进行融合
reconstructed_image = original_image.clone()
reconstructed_image[:, :, hole_start_y:hole_start_y+hole_height, hole_start_x:hole_start_x+hole_width] = upsampled_hole
# 训练模型并优化
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
for epoch in range(num_epochs):
optimizer.zero_grad()
# 前向传播
output = model(missing_hole)
# 计算损失
loss = loss_function(output, original_image)
# 反向传播和优化
loss.backward()
optimizer.step()
# 打印损失
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!