重磅干货,第一时间送达
一、论文信息
二、论文概要
Highlight
1. 研究背景:
研究问题:如何更高效地利用卷积操作来编码空间特征,以提升视觉识别模型的性能。 研究难点:在设计视觉识别模型时,如何平衡模型的性能与计算成本,尤其是在处理高分辨率图像时,自注意力机制的计算成本较高。 文献综述:文章回顾了从早期的卷积神经网络(如AlexNet、VGGNet、GoogLeNet)到现代的视觉Transformer(如ViT、DeiT)的发展历程。特别提到了一些工作通过引入大卷积核、高阶空间交互或稀疏卷积核等方法来改进ConvNets的设计。此外,还提到了Vision Transformer在视觉识别任务中的成功应用,以及一些研究通过引入局部依赖性或探索Transformer的扩展能力来提升模型性能。
提出Conv2Former网络架构:Conv2Former是一种新的卷积网络架构,用于视觉识别任务。该网络的核心是卷积调制操作,它通过仅使用卷积和Hadamard乘积来简化自注意力机制。通过比较卷积神经网络(ConvNets)和视觉变换器(Vision Transformers)的设计原则,提出利用卷积调制操作来简化自注意力。 卷积调制操作:与自注意力通过矩阵乘法生成注意力矩阵不同,卷积调制操作直接使用k×k深度可分离卷积来产生权重,并通过Hadamard乘积重新加权值表示。这种操作允许每个空间位置与中心点周围k×k区域内的所有像素相关联。 网络设计与调整:Conv2Former采用金字塔结构,包含四个阶段,每个阶段具有不同的特征图分辨率。在连续阶段之间使用补丁嵌入块来降低分辨率。研究者们构建了五个Conv2Former变体,分别命名为Conv2Former-N、Conv2Former-T、Conv2Former-S、Conv2Former-B和Conv2Former-L,并提供了它们的简要配置。 实验结果:CAS-ViT模型在多个视觉任务上取得了优异的性能,包括图像分类、对象检测、实例分割和语义分割。在ImageNet-1K数据集上,CAS-ViT模型的M和T模型分别以12M和21M参数取得了83.0%/84.1%的top-1准确率。
三、方法
图1. 自注意力机制与提出的卷积调制操作的比较。不是通过查询和键之间的矩阵乘法生成注意力矩阵,而是直接使用k × k深度可分离卷积来产生权重,通过Hadamard乘积(⊙:Hadamard乘积;⊗:矩阵乘法)重新加权值。
图3. 自注意力和典型卷积块的空间编码过程比较。我们的方法使用深度卷积的卷积特征作为权重来调节值表示,如(d)中右侧线性层所示。
正如论文题目写的那样,卷积调制空间自注意力的实现原理非常简洁,它不是通过Q和K之间的矩阵乘法生成注意力矩阵,而是直接使用k × k深度可分离卷积来产生权重,通过Hadamard乘积(哈达玛积,也叫基本积,即:两个矩阵同阶,对应元素相乘的结果矩阵)生成特征优化结果。网络定义如下面代码所示:
四、实验分析
五、代码
import torch
import torch.nn as nn
# 论文题目:Conv2Former: A Simple Transformer-Style ConvNet for Visual Recognition
# 中文题目:Conv2Former: 一种简单的视觉识别用的Transformer风格卷积网络
# 论文链接:https://arxiv.org/pdf/2211.11943
# 官方github:https://github.com/HVision-NKU/Conv2Former
# 所属机构:天津南开大学计算机科学学院,字节跳动(新加坡)
# 代码整理:微信公众号《AI缝合术》
# 全部即插即用模块代码:https://github.com/AIFengheshu/Plug-play-modules
class LayerNorm(nn.Module):
r""" LayerNorm that supports two data formats: channels_last (default) or channels_first.
The ordering of the dimensions in the inputs. channels_last corresponds to inputs with
shape (batch_size, height, width, channels) while channels_first corresponds to inputs
with shape (batch_size, channels, height, width).
"""
def __init__(self, normalized_shape, eps=1e-6, data_format="channels_last"):
super().__init__()
self.weight = nn.Parameter(torch.ones(normalized_shape))
self.bias = nn.Parameter(torch.zeros(normalized_shape))
self.eps = eps
self.data_format = data_format
if self.data_format not in ["channels_last", "channels_first"]:
raise NotImplementedError
self.normalized_shape = (normalized_shape, )
def forward(self, x):
if self.data_format == "channels_last":
return F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps)
elif self.data_format == "channels_first":
u = x.mean(1, keepdim=True)
s = (x - u).pow(2).mean(1, keepdim=True)
x = (x - u) / torch.sqrt(s + self.eps)
x = self.weight[:, None, None] * x + self.bias[:, None, None]
return x
class ConvModulOperationSpatialAttention(nn.Module):
def __init__(self, dim, kernel_size, expand_ratio=2):
super().__init__()
self.norm = LayerNorm(dim, eps=1e-6, data_format="channels_first")
self.att = nn.Sequential(
nn.Conv2d(dim, dim, 1),
nn.GELU(),
nn.Conv2d(dim, dim, kernel_size=kernel_size, padding=kernel_size//2, groups=dim)
)
self.v = nn.Conv2d(dim, dim, 1)
self.proj = nn.Conv2d(dim, dim, 1)
def forward(self, x):
B, C, H, W = x.shape
x = self.norm(x)
x = self.att(x) * self.v(x)
x = self.proj(x)
return x
if __name__ == "__main__":
# 将模块移动到 GPU(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 创建测试输入张量 (batch_size, channels, height, width)
x = torch.randn(1, 32, 256, 256).to(device)
# 初始化 ConvSAtt 模块
ConvSAtt = ConvModulOperationSpatialAttention(dim=32, kernel_size=3)
print(ConvSAtt)
print("微信公众号:AI缝合术")
ConvSAtt = ConvSAtt.to(device)
# 前向传播
output = ConvSAtt(x)
# 打印输入和输出张量的形状
print("输入张量形状:", x.shape)
print("输出张量形状:", output.shape)
运行结果
便捷下载
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~