YOLO目标检测创新改进与实战案例专栏
专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLO基础解析+创新改进+实战案例
介绍
摘要
摘要——滑坡是一种广泛且具有毁灭性的自然灾害,对人类生命、安全和自然资产构成严重威胁。研究利用遥感影像进行滑坡精准检测的高效方法具有重要的学术和实际意义。本文提出了一种新颖且有效的滑坡检测模型LS-YOLO,利用遥感影像进行滑坡检测。我们首先构建了一个多尺度滑坡数据集(MSLD),并在数据增强中引入随机种子以增加数据的鲁棒性。考虑到遥感影像中滑坡的多尺度特性,设计了基于高效通道注意力、平均池化和空间可分离卷积的多尺度特征提取模块。为了增加模型的感受野,在解耦头中采用了膨胀卷积。具体而言,将由膨胀卷积组成的上下文增强模块添加到解耦头回归任务分支中,然后用改进的解耦头替换YOLOv5s中的耦合头。大量实验表明,我们提出的模型在多尺度滑坡检测方面具有高性能,优于其他目标检测模型(faster RCNN、SSD、EfficientDet-D0、YOLOv5s、YOLOv7和YOLOX)。与基准模型YOLOv5s相比,LS-YOLO在滑坡检测中的AP提升了2.18%,达到了97.06%。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
LS-YOLO
多尺度滑坡数据集(MSLD):
- 构建了一个包含大量滑坡样本的MSLD,具有高度的类内变化、广泛的滑坡尺寸范围和复杂的背景,为模型训练提供了丰富的数据资源。
多尺度特征提取(MSFE)模块:
- MSFE模块包括Efficient Channel Attention(ECA)、平均池化和空间可分离卷积,用于充分提取滑坡特征信息。
- ECA部分引入了注意力机制,通过全局平均池化聚合特征并自适应地确定核大小,以增强模型对重要特征的关注。
改进的解耦头:
- LS-YOLO通过引入扩张卷积来改进解耦头,增加模型的感受野,提高滑坡定位的准确性。
- 扩张卷积有助于捕获多尺度上下文信息,提升模型在滑坡位置定位方面的精度。
整体框架:
- LS-YOLO的整体框架结合了YOLOv5s的通用目标检测能力,并针对滑坡检测任务进行了优化和改进。
- 模型在滑坡检测中利用MSFE模块提取多尺度特征,同时通过改进的解耦头提高了滑坡位置的准确性。
MSFE
MSFE(Multiscale Feature Extraction)模块是论文中提出的一个关键技术,通过五个并行分支从多个感受野充分提取滑坡特征。
- 模块结构:
- MSFE模块包含两个分支:
- 第一个分支是残差连接,有助于减轻梯度消失并加快模型训练速度。
- 第二个分支包括Efficient Channel Attention(ECA)、平均池化和空间可分离卷积,用于充分提取滑坡特征信息。
- MSFE模块包含两个分支:
- Efficient Channel Attention(ECA):
- ECA是一种通用的插入式块,用于增强CNN的性能。
- ECA包含一个挤压模块,用于压缩全局空间信息,以及一个激励模块,用于实现通道间的交互。
- ECA通过全局平均池化聚合特征,自适应确定核大小k。
核心代码
import torch
import torch.nn as nn
# MSFE模块定义
class MSFE(nn.Module):
def __init__(self, c_in, c_out):
super(MSFE, self).__init__()
c_ = int(c_in // 4) # 计算每个分支的输出通道数
self.ECA = ECA(c_in, k_size=5) # ECA模块
self.branch1 = Conv(c_in, c_, 1, 1) # 分支1,1x1卷积
# 分支2,3x3平均池化
self.branch2 = nn.AvgPool2d(kernel_size=3, stride=1, padding=1)
# 分支3,串联两个卷积层
self.branch3 = nn.Sequential(
Conv(c_in, c_, (3, 1), s=1, p=(1, 0)), # 3x1卷积
Conv(c_, c_, (1, 3), s=1, p=(0, 1)) # 1x3卷积
)
# 分支4,串联四个卷积层
self.branch4 = nn.Sequential(
Conv(c_in, c_, (3, 1), s=1, p=(1, 0)), # 3x1卷积
Conv(c_, c_, (1, 3), s=1, p=(0, 1)), # 1x3卷积
Conv(c_, c_, (3, 1), s=1, p=(1, 0)), # 3x1卷积
Conv(c_, c_, (1, 3), s=1, p=(0, 1)) # 1x3卷积
)
# 分支5,串联四个卷积层
self.branch5 = nn.Sequential(
Conv(c_in, c_, (5, 1), s=1, p=(2, 0)), # 5x1卷积
Conv(c_, c_, (1, 5), s=1, p=(0, 2)), # 1x5卷积
Conv(c_, c_, (5, 1), s=1, p=(2, 0)), # 5x1卷积
Conv(c_, c_, (1, 5), s=1, p=(0, 2)) # 1x5卷积
)
self.conv = Conv(c_in * 2, c_out, k=1) # 1x1卷积,用于整合所有分支的输出
def forward(self, x):
x1 = self.ECA(x) # 通过ECA模块
y1 = self.branch1(x1) # 分支1的输出
y2 = self.branch2(x1) # 分支2的输出
y3 = self.branch3(x1) # 分支3的输出
y4 = self.branch4(x1) # 分支4的输出
y5 = self.branch5(x1) # 分支5的输出
# 将所有分支的输出在通道维度上拼接,并通过1x1卷积层,然后与输入x相加
out = x + self.conv(torch.cat([y1, y2, y3, y4, y5], 1))
return out
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/140092794