首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Block总结】Inv-FR,串行自适应卷积核操作,优化空间特征表示|即插即用

【Block总结】Inv-FR,串行自适应卷积核操作,优化空间特征表示|即插即用

作者头像
AI浩
发布2025-06-15 11:24:12
发布2025-06-15 11:24:12
13600
代码可运行
举报
文章被收录于专栏:AI智韵AI智韵
运行总次数:0
代码可运行

论文信息

  • 标题:Flora-NET: Integrating dual coordinate attention with adaptive kernel based convolution network for medicinal flower identification
  • 中文标题:Flora-NET:集成双坐标注意力机制与自适应内核的药用花卉识别卷积网络
  • 链接:ScienceDirect
  • 代码链接:https://github.com/ersachingupta11/Flora-NET
  • 单位:印度马拉维亚国立理工学院计算机科学与工程系

创新点

  1. 双模块协同架构
    • DCAFE模块:并行双坐标注意力机制(平均池化+最大池化),增强长程依赖与抗噪性,保留更多上下文信息。
    • Inv-FR模块:串行自适应卷积核操作,优化空间特征表示。
  2. 领域专用设计:针对药用花卉的类内差异大、类间差异小、环境干扰(遮挡/光照/背景复杂)等难点优化。
  3. 轻量化改进:双坐标注意力机制避免显著增加计算成本。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

方法

  1. 整体流程
    • 输入:224×224 RGB图像(经尺寸调整+数据增强)。
    • 特征提取:CBS模块(卷积-批量归一化-SiLU)为基础,嵌入DCAFE与Inv-FR模块。
    • 分类:全连接层输出类别概率。
  2. 核心模块
    • 自适应卷积核动态调整空间特征,提升对形变/遮挡的适应性。
    • 并行分支:平均池化坐标注意力(fca) + 最大池化坐标注意力(fcm)。
    • 输出:连接两分支结果,兼顾全局上下文与细节鲁棒性。
    • DCAFE
    • Inv-FR

效果

  1. 定量性能 数据集准确率超越SOTAUrban Street (17类)91.12%+6.94%Medicinal Blossom (12类)91.18%+5.71%
  2. 消融实验验证
    • 移除DCAFE+Inv-FR:准确率降至82.57%(Urban)和84.39%(Blossom)。
    • 证明双模块对性能提升的关键作用。
  3. 可视化证据
    • CAM图(图4):DCAFE与Inv-FR模块聚焦花瓣纹理等判别区域。
    • t-SNE(图6):处理后特征聚类分离度显著提升。
    • 混淆矩阵(图8):各类别错误率均衡,无显著偏差。

总结

  1. 贡献
    • 提出首个结合双坐标注意力与自适应卷积核的药用花卉分类模型,显著解决类内差异大、环境干扰强的问题。
    • 在公开数据集上达到**>91%准确率**,大幅领先现有方法。
  2. 应用价值
    • 医药制造:精准识别药用植物成分,保障药物生产质量。
    • 生物多样性保护:自动化监测濒危花卉物种。
  3. 局限与未来
    • 局限:对严重遮挡图像敏感,类别不平衡场景待优化。
    • 方向:融合GANs生成合成数据,探索多模态(如纹理+光谱)信息。

代码

代码语言:javascript
代码运行次数:0
运行
复制
import torch
import torch.nn as nn
import torch.nn.functional as F


class InvolutionLayer(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=, padding=, stride=):
        """
        实现Involution层

        参数:
            in_channels: 输入通道数
            out_channels: 输出通道数
            kernel_size: 卷积核大小 (默认3)
            padding: 填充大小 (默认1)
            stride: 步长 (默认1)
        """
        super(InvolutionLayer, self).__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.kernel_size = kernel_size
        self.padding = padding
        self.stride = stride

        # 核生成器 - 动态生成卷积核
        self.kernel_generator = nn.Sequential(
            nn.Conv2d(in_channels, in_channels, , groups=in_channels, bias=False),
            nn.BatchNorm2d(in_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels, kernel_size * kernel_size * out_channels, , bias=False)
        )

        # 用于特征变换的1x1卷积
        self.feature_transform = nn.Conv2d(in_channels, out_channels, , bias=False)

    def forward(self, x):
        """
        前向传播

        参数:
            x: 输入张量 [B, C, H, W]

        返回:
            输出张量 [B, out_channels, H, W]
        """
        batch_size, _, height, width = x.size()

        # 1. 生成动态卷积核 [B, K*K*out_channels, H, W]
        kernel = self.kernel_generator(x)

        # 2. 重塑核 [B, out_channels, K*K, H, W]
        kernel = kernel.view(batch_size, self.out_channels,
                             self.kernel_size * self.kernel_size,
                             height, width)

        # 3. 特征变换 [B, out_channels, H, W]
        features = self.feature_transform(x)

        # 4. 使用unfold提取局部特征块 [B, out_channels * K*K, H*W]
        unfolded = F.unfold(features,
                            kernel_size=self.kernel_size,
                            padding=self.padding,
                            stride=self.stride)

        # 5. 重塑特征块 [B, out_channels, K*K, H, W]
        unfolded = unfolded.view(batch_size, self.out_channels,
                                 self.kernel_size * self.kernel_size,
                                 height, width)

        # 6. 应用动态核 - 逐元素相乘后求和 [B, out_channels, H, W]
        output = (unfolded * kernel).sum(dim=)

        return output


class Involution(nn.Module):
    def __init__(self, in_channels, out_channels, mid_channels):
        """
        双Involution层模块

        参数:
            in_channels: 输入通道数
            out_channels: 输出通道数
            mid_channels: 中间层通道数
        """
        super(Involution, self).__init__()
        # 第一层Involution: 输入->中间特征
        self.involution1 = InvolutionLayer(in_channels, mid_channels, kernel_size=, padding=)

        # 第二层Involution: 中间特征->输出
        self.involution2 = InvolutionLayer(mid_channels, out_channels, kernel_size=, padding=)

        # 激活函数
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        # 第一层Involution
        x = self.involution1(x)
        x = self.relu(x)

        # 第二层Involution
        x = self.involution2(x)

        return x


if __name__ == "__main__":
    # 定义输入张量大小(Batch、Channel、Height、Wight)
    B, C, H, W = , , , 
    input_tensor = torch.randn(B, C, H, W)  # 随机生成输入张量
    dim = C
    # 创建 ARConv 实例
    block = Involution(in_channels=, out_channels=, mid_channels=)
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    sablock = block.to(device)
    print(sablock)
    input_tensor = input_tensor.to(device)
    # 执行前向传播
    output = sablock(input_tensor)
    # 打印输入和输出的形状
    print(f"Input: {input_tensor.shape}")
    print(f"Output: {output.shape}")

运行结果:

以下是对Involution 代码的详细解析,包括其核心思想、结构设计和实现细节:

1. Involution 核心思想

Involution 是一种动态生成卷积核的机制,与传统卷积的区别在于:

  • 传统卷积:使用固定的学习权重
  • Involution:根据输入特征动态生成空间特定的卷积核
  • 优势:更大的灵活性,能自适应不同位置的视觉模式

2. InvolutionLayer 详解

关键组件:

代码语言:javascript
代码运行次数:0
运行
复制
# 核生成器(核心创新点)
self.kernel_generator = nn.Sequential(
    nn.Conv2d(in_channels, in_channels, , groups=in_channels, bias=False),  # 深度可分离卷积
    nn.BatchNorm2d(in_channels),
    nn.ReLU(inplace=True),
    nn.Conv2d(in_channels, kernel_size * kernel_size * out_channels, , bias=False)
)

# 特征变换器
self.feature_transform = nn.Conv2d(in_channels, out_channels, , bias=False)

前向传播流程:

  1. 动态核生成kernel = self.kernel_generator(x)  # [B, K*K*C_out, H, W] kernel = kernel.view(batch_size, self.out_channels,                       self.kernel_size * self.kernel_size,                      height, width)  # [B, C_out, K*K, H, W]
    • 每个空间位置生成独特的卷积核
    • 参数量仅 O(C_in × K² × C_out),远小于传统卷积的 O(C_in × C_out × K²)
  2. 特征变换features = self.feature_transform(x)  # [B, C_out, H, W]
  3. 特征展开unfolded = F.unfold(features, kernel_size, padding, stride)  # [B, C_out*K*K, L] unfolded = unfolded.view(batch_size, self.out_channels,                          self.kernel_size * self.kernel_size,                          height, width)  # [B, C_out, K*K, H, W]
  4. 核应用output = (unfolded * kernel).sum(dim=)  # [B, C_out, H, W]
    • 逐位置进行加权求和操作
    • 计算复杂度 O(B × H × W × C_out × K²)

3. Involution 模块设计

代码语言:javascript
代码运行次数:0
运行
复制
class Involution(nn.Module):
    def __init__(self, in_channels, out_channels, mid_channels):
        self.involution1 = InvolutionLayer(in_channels, mid_channels, kernel_size=)
        self.involution2 = InvolutionLayer(mid_channels, out_channels, kernel_size=)
        self.relu = nn.ReLU(inplace=True)
  • 双级结构:通道扩展 → 非线性激活 → 通道压缩
  • 设计特点
    • 使用 1×1 卷积核:专注于通道交互而非空间交互
    • mid_channels > in_channels:形成瓶颈结构(示例中 64→128→64
    • 无残差连接:纯Involution操作序列

4. 与传统卷积的对比

特性

传统卷积

Involution

核生成方式

静态学习

动态生成

参数量

²

²

计算模式

空间不变

空间自适应

通道处理

跨通道混合

可分离通道处理

5. 潜在改进方向

  1. 空间信息利用# 当前使用kernel_size=1(无空间聚合) # 可修改为: self.involution1 = InvolutionLayer(..., kernel_size=, padding=)
  2. 残差连接def forward(self, x):     residual = x     x = self.involution1(x)     x = self.relu(x)     x = self.involution2(x) return x + residual  # 添加残差连接
  3. 通道注意力增强# 在核生成器中加入SE模块 self.se = nn.Sequential(     nn.AdaptiveAvgPool2d(),     nn.Conv2d(in_channels, in_channels//, ),     nn.ReLU(),     nn.Conv2d(in_channels//, in_channels, ),     nn.Sigmoid() )

6. 执行流程示例

代码语言:javascript
代码运行次数:0
运行
复制
Input: [, , , ]
│
├─ InvolutionLayer1 (→)
│  ├─ 生成个x1核 [, , , ]
│  └─ 输出 [, , , ]
│
├─ ReLU激活
│
└─ InvolutionLayer2 (→)
   ├─ 生成个x1核 [, , , ]
   └─ 输出 [, , , ]

总结

该实现的核心价值在于:

  1. 动态核生成:使模型能自适应不同图像区域的特征
  2. 通道优化设计:通过双级结构实现通道信息的提炼
  3. 高效实现:利用unfold操作避免显式滑动窗口
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI智韵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 论文信息
  • 创新点
  • 方法
  • 效果
  • 总结
  • 代码
    • 1. Involution 核心思想
    • 2. InvolutionLayer 详解
      • 关键组件:
      • 前向传播流程:
    • 3. Involution 模块设计
    • 4. 与传统卷积的对比
    • 5. 潜在改进方向
    • 6. 执行流程示例
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档