【YOLOv8改进】MSFN(Multi-Scale Feed-Forward Network):多尺度前馈网络

摘要

摘要——高光谱图像(HSI)去噪对于高光谱数据的有效分析和解释至关重要。然而,同时建模全局和局部特征以增强HSI去噪的研究却很少。在本文中,我们提出了一种混合卷积和注意力网络(HCANet),该网络结合了卷积神经网络(CNN)和Transformers的优势。为了增强全局和局部特征的建模,我们设计了一个卷积和注意力融合模块,旨在捕捉长距离依赖关系和邻域光谱相关性。此外,为了改进多尺度信息聚合,我们设计了一个多尺度前馈网络,通过在不同尺度上提取特征来增强去噪性能。在主流HSI数据集上的实验结果表明,所提出的HCANet具有合理性和有效性。所提出的模型在去除各种复杂噪声方面表现出色。我们的代码可在https://github.com/summitgao/HCANet获得。

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

这篇文章介绍了一种名为Hybrid Convolutional and Attention Network (HCANet)的模型,用于高光谱图像去噪。该模型结合了卷积神经网络和Transformer的优势,以有效地去除高光谱图像中的噪声。文章提出了注意力机制,用于捕获远程依赖性和邻域光谱相关性,以增强全局和局部特征建模。通过设计卷积和注意力融合模块以及多尺度前馈网络,该模型能够在不同尺度提取特征,从而提高去噪性能。

  1. 结构概述:HCANet采用了U型网络结构,其中包含多个Convolution Attention Mixing(CAMixing)块。每个CAMixing块由两部分组成:卷积和注意力融合模块(CAFM)以及多尺度前馈网络(MSFN)。

  2. CAFM模块:在CAFM模块中,局部分支利用卷积和通道重排来提取局部特征,全局分支则利用注意力机制来捕获长距离依赖关系。这种结合了卷积和注意力的设计使得模型能够综合建模全局和局部特征,从而提高去噪性能。

  3. MSFN模块:MSFN模块用于多尺度信息聚合,通过三个并行的具有不同步长的扩张卷积来实现。这有助于在不同尺度提取特征,有效地抑制多尺度的噪声。

  4. 训练过程:HCANet首先使用3x3x3卷积提取低级特征,然后通过U型网络结构和跳跃连接来生成噪声残差图。最终,通过重建损失和全局梯度正则化器来训练模型,以实现高光谱图像的去噪。

通过结合CAFM模块和MSFN模块,HCANet能够有效地利用卷积和注意力机制,同时在不同尺度提取特征,从而提高高光谱图像去噪的性能和效果。

MSFN

多尺度前馈网络(MSFN)是HCANet模型中的一个关键组成部分,用于在不同尺度上提取特征并增强非线性信息转换。

  1. 结构概述:MSFN旨在通过在不同尺度上提取特征来增强信息聚合。在每个CAMixing块之后,CAFM的输出被送入MSFN,以聚合多尺度特征并增强非线性信息转换。

  2. 特征扩展:MSFN首先使用两个1x1卷积来扩展特征通道,通常使用扩展比率γ=2。这有助于增加特征的维度,以便更好地捕获多尺度信息。

  3. 多尺度特征提取:MSFN通过两个并行路径处理输入特征,并引入门控机制来通过两个路径的特征元素相乘来增强非线性转换。在较低路径中,使用深度卷积进行特征提取;在较高路径中,使用多尺度扩张卷积进行多尺度特征提取。

  4. 特征聚合:MSFN通过多尺度卷积来聚合不同尺度的特征表示,从而提高模型对多尺度信息的利用能力。这有助于模型更好地理解高光谱图像的复杂结构和特征。

yolov8 代码引入

## 多尺度前馈网络 (MSFN)
class FeedForward(nn.Module):
    def __init__(self, dim, ffn_expansion_factor, bias):
        super(FeedForward, self).__init__()

        hidden_features = int(dim * ffn_expansion_factor)

        self.project_in = nn.Conv3d(dim, hidden_features * 3, kernel_size=(1, 1, 1), bias=bias)

        self.dwconv1 = nn.Conv3d(hidden_features, hidden_features, kernel_size=(3, 3, 3), stride=1, dilation=1, padding=1, groups=hidden_features, bias=bias)
        self.dwconv2 = nn.Conv2d(hidden_features, hidden_features, kernel_size=(3, 3), stride=1, dilation=2, padding=2, groups=hidden_features, bias=bias)
        self.dwconv3 = nn.Conv2d(hidden_features, hidden_features, kernel_size=(3, 3), stride=1, dilation=3, padding=3, groups=hidden_features, bias=bias)

        self.project_out = nn.Conv3d(hidden_features, dim, kernel_size=(1, 1, 1), bias=bias)

    def forward(self, x):
        x = x.unsqueeze(2)
        x = self.project_in(x)
        x1, x2, x3 = x.chunk(3, dim=1)
        x1 = self.dwconv1(x1).squeeze(2)
        x2 = self.dwconv2(x2.squeeze(2))
        x3 = self.dwconv3(x3.squeeze(2))
        x = F.gelu(x1) * x2 * x3
        x = x.unsqueeze(2)
        x = self.project_out(x)
        x = x.squeeze(2)
        return x

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139212227

posted @ 2024-06-22 09:18  YOLOv8大师  阅读(31)  评论(0编辑  收藏  举报