Redian新闻
>
CVPR 2023 | SCConv: 即插即用的空间和通道重建卷积

CVPR 2023 | SCConv: 即插即用的空间和通道重建卷积

公众号新闻

©作者 | 玉米爆米花




介绍


本文作者提出了一种名为 SCConv(Spatial and Channel reconstruction Convolution,空间和通道重建卷积)的卷积模块,目的是减少卷积神经网络中特征之间的空间和通道冗余,从而压缩 CNN 模型并提高其性能。


论文地址:

https://openaccess.thecvf.com/content/CVPR2023/papers/Li_SCConv_Spatial_and_Channel_Reconstruction_Convolution_for_Feature

复现代码:

https://github.com/cheng-haha/ScConv

文章发布:

https://linkyou.top/archives/123


作者设计的 SCConv 模块,包含两个单元。一个名为 SRU(Spatial Reconstruction Unit,空间重构单元),一个名为 CRU(Channel Reconstruction Unit,通道重构单元)。其中 SRU 通过 分离-重构方法 来减少空间冗余,CRU 则使用分割-转换-融合方法来减少通道冗余。这两个单元协同工作,以减少 CNN 中特征的冗余信息。


作者指出,SCConv 是一种可以直接替代标准卷积操作的插件式卷积模块 ,可以应用于各种卷积神经网络中,从而降低冗余特征并减少计算复杂性。


在后续的实验中,文章作者认为相对于其他流行的 SOTA 方法,他们提出的 SCConv 可以以更低的计算成本获得更高的准确率。下图是 ResNet50 在 ImageNet 上的 Top1 准确性测试结果。



模块设计


2.1 SCConv


如下图,SCConv 由两个单元组成,即空间重构单元(SRU)和信道重构单元(CRU),两个单元按顺序排列。输入的特征 先经过空间重构单元,得到空间细化的特征 。再经过通道重构单元,得到通道提炼的特征 Y 作为输出。

SCConv 模块利用了特征之间的空间冗余和信道冗余,模块可以无缝集成到任何 CNN 框架中,减少特征之间的冗余,提高 CNN 特征的代表性。

作者对 SRUCRU 进行不同的组合,包括:

  1. 不使用 SRU 和 CRU

  2. 单独使用 SRU

  3. 单独使用 CRU

  4. 并行使用 SRU 和 CRU

  5. 先使用 CRU 再使用 SRU

  6. 先使用 SRU 在使用 CRU


最终发现先使用 SRU 再使用 CRU 的效果最好。
下面详细介绍 SRU 和 CRU 这两个单元。



SRU 空间重建单元

在作者的设计中,该单元采用分离-重构的方法。

分离操作的目的是将信息量大的特征图从信息量小的特征图中分离出来,与空间内容相对应。作者使用组归一化(Group Normalization)里的缩放因子来评估不同特征图中的信息含量。

其中, 是均值和标准差, 是可训练的变量, 是用于保证稳定性的极小常数。更大的 代表像素之间更大的变化,也就是更丰富的空间信息。

重构操作是将信息量较多的特征和信息量较少的特征相加,生成信息量更多的特征并节省空间。具体的操作是交叉重建,将加权后的两个不同信息特征合并,得到 ,连接起来后得到空间细化特征图

其中 是元素乘法, 是元素加法, 是求并集。

经过 SRU 处理后,信息量大的特征从信息量小的特征中分离出来,减少了空间维度上的冗余特征。



CRU 通道重建单元

在作者的设计中,该单元采用分割-转换-融合的方法。


分割操作将输入的空间细化特征 分割为两部分:一部分的通道数是 ,另一部分的通道数是 ,其中 是超参数且 。随后对两组特征的通道数使用 卷积核进行压缩,分别得到



转换操作将输入的 作为“富特征提取”的输入,分别进行 GWC 和 PWC,然后相加得到输出 。将输入 作为“富特征提取”的补充,进行 PWC,得到的结果和原来的输入取并集得到

融合操作使用简化的 SKNet 方法来自适应的合并 。具体来说,首先使用全局平均池化技术,将全局空间信息和通道统计信息结合起来,得到经过池化的 。然后对 做 Softmax 得到特征权重向量 。最后使用特征权重向量得到输出 ,Y 即为通道提炼的特征。



实验


5.1 消融实验


下图的消融实验确定了 SRU 和 CRU 的排列方式
下图的消融实验确定了 CRU 中的拆分系数  

5.2 图片分类实验


下图是与其他 SOTA 方法的比较,作者认为在所有的情况下,SCConv-embedded 模型的准确性都优于先前所有的网络。在某些模型中,对比同类模型在减少参数和 FLOPs 的同时还实现了更高的准确率



论文笔记

分组卷积 GWC、逐点卷积 PWC。

相关代码中文注释:


import torch  # 导入 PyTorch 库
import torch.nn.functional as F  # 导入 PyTorch 的函数库
import torch.nn as nn  # 导入 PyTorch 的神经网络模块

# 自定义 GroupBatchnorm2d 类,实现分组批量归一化
class GroupBatchnorm2d(nn.Module):
    def __init__(self, c_num:int, group_num:int = 16, eps:float = 1e-10):
        super(GroupBatchnorm2d,self).__init__()  # 调用父类构造函数
        assert c_num >= group_num  # 断言 c_num 大于等于 group_num
        self.group_num  = group_num  # 设置分组数量
        self.gamma      = nn.Parameter(torch.randn(c_num, 11))  # 创建可训练参数 gamma
        self.beta       = nn.Parameter(torch.zeros(c_num, 11))  # 创建可训练参数 beta
        self.eps        = eps  # 设置小的常数 eps 用于稳定计算

    def forward(self, x):
        N, C, H, W  = x.size()  # 获取输入张量的尺寸
        x           = x.view(N, self.group_num, -1)  # 将输入张量重新排列为指定的形状
        mean        = x.mean(dim=2, keepdim=True)  # 计算每个组的均值
        std         = x.std(dim=2, keepdim=True)  # 计算每个组的标准差
        x           = (x - mean) / (std + self.eps)  # 应用批量归一化
        x           = x.view(N, C, H, W)  # 恢复原始形状
        return x * self.gamma + self.beta  # 返回归一化后的张量

# 自定义 SRU(Spatial and Reconstruct Unit)类
class SRU(nn.Module):
    def __init__(self,
                 oup_channels:int,  # 输出通道数
                 group_num:int = 16,  # 分组数,默认为16
                 gate_treshold:float = 0.5,  # 门控阈值,默认为0.5
                 torch_gn:bool = False  # 是否使用PyTorch内置的GroupNorm,默认为False
                 )
:

        super().__init__()  # 调用父类构造函数

         # 初始化 GroupNorm 层或自定义 GroupBatchnorm2d 层
        self.gn = nn.GroupNorm(num_channels=oup_channels, num_groups=group_num) if torch_gn else GroupBatchnorm2d(c_num=oup_channels, group_num=group_num)
        self.gate_treshold  = gate_treshold  # 设置门控阈值
        self.sigomid        = nn.Sigmoid()  # 创建 sigmoid 激活函数

    def forward(self, x):
        gn_x        = self.gn(x)  # 应用分组批量归一化
        w_gamma     = self.gn.gamma / sum(self.gn.gamma)  # 计算 gamma 权重
        reweights   = self.sigomid(gn_x * w_gamma)  # 计算重要性权重

        # 门控机制
        info_mask    = reweights >= self.gate_treshold  # 计算信息门控掩码
        noninfo_mask = reweights < self.gate_treshold  # 计算非信息门控掩码
        x_1          = info_mask * x  # 使用信息门控掩码
        x_2          = noninfo_mask * x  # 使用非信息门控掩码
        x            = self.reconstruct(x_1, x_2)  # 重构特征
        return x

    def reconstruct(self, x_1, x_2):
        x_11, x_12 = torch.split(x_1, x_1.size(1) // 2, dim=1)  # 拆分特征为两部分
        x_21, x_22 = torch.split(x_2, x_2.size(1) // 2, dim=1)  # 拆分特征为两部分
        return torch.cat([x_11 + x_22, x_12 + x_21], dim=1)  # 重构特征并连接

# 自定义 CRU(Channel Reduction Unit)类
class CRU(nn.Module):
    def __init__(self, op_channel:int, alpha:float = 1/2, squeeze_radio:int = 2, group_size:int = 2, group_kernel_size:int = 3):
        super().__init__()  # 调用父类构造函数

        self.up_channel     = up_channel = int(alpha * op_channel)  # 计算上层通道数
        self.low_channel    = low_channel = op_channel - up_channel  # 计算下层通道数
        self.squeeze1       = nn.Conv2d(up_channel, up_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层
        self.squeeze2       = nn.Conv2d(low_channel, low_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层

        # 上层特征转换
        self.GWC            = nn.Conv2d(up_channel // squeeze_radio, op_channel, kernel_size=group_kernel_size, stride=1, padding=group_kernel_size // 2, groups=group_size)  # 创建卷积层
        self.PWC1           = nn.Conv2d(up_channel // squeeze_radio, op_channel, kernel_size=1, bias=False)  # 创建卷积层

        # 下层特征转换
        self.PWC2           = nn.Conv2d(low_channel // squeeze_radio, op_channel - low_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层
        self.advavg         = nn.AdaptiveAvgPool2d(1)  # 创建自适应平均池化层

    def forward(self, x):
        # 分割输入特征
        up, low = torch.split(x, [self.up_channel, self.low_channel], dim=1)
        up, low = self.squeeze1(up), self.squeeze2(low)

        # 上层特征转换
        Y1 = self.GWC(up) + self.PWC1(up)

        # 下层特征转换
        Y2 = torch.cat([self.PWC2(low), low], dim=1)

        # 特征融合
        out = torch.cat([Y1, Y2], dim=1)
        out = F.softmax(self.advavg(out), dim=1) * out
        out1, out2 = torch.split(out, out.size(1) // 2, dim=1)
        return out1 + out2

# 自定义 ScConv(Squeeze and Channel Reduction Convolution)模型
class ScConv(nn.Module):
    def __init__(self, op_channel:int, group_num:int = 16, gate_treshold:float = 0.5, alpha:float = 1/2, squeeze_radio:int = 2, group_size:int = 2, group_kernel_size:int = 3):
        super().__init__()  # 调用父类构造函数

        self.SRU = SRU(op_channel, group_num=group_num, gate_treshold=gate_treshold)  # 创建 SRU 层
        self.CRU = CRU(op_channel, alpha=alpha, squeeze_radio=squeeze_radio, group_size=group_size, group_kernel_size=group_kernel_size)  # 创建 CRU 层

    def forward(self, x):
        x = self.SRU(x)  # 应用 SRU 层
        x = self.CRU(x)  # 应用 CRU 层
        return x

if __name__ == '__main__':
    x       = torch.randn(1321616)  # 创建随机输入张量
    model   = ScConv(32)  # 创建 ScConv 模型
    print(model(x).shape)  # 打印模型输出的形状


更多阅读



#投 稿 通 道#

 让你的文字被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。


📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算


📬 投稿通道:

• 投稿邮箱:[email protected] 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿


△长按添加PaperWeekly小编



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧


·
·

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
CVPR上的新顶流:BEV自动驾驶感知新范式ICCV 2023 | 即插即用!上海交大提出AccFlow:跨帧光流估计框架CVPR 2024 延期!屠榜CVPR!Transformer视频教程发布​ICCV 2023 | 华科大提出NVDS:即插即用的视频深度预测框架ICCV 2023 中国遥遥领先!华人拿下最佳论文和最佳学生论文!SAM和ControlNet开启CV新纪元!ICCV 2023 | 混合训练策略突破目标检测大模型上限,创下COCO、LVIS新SOTASAM拿下ICCV 2023最佳论文荣誉提名奖!这些CV论文仍是顶流!ICCV 2023 | 动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割粉色玫瑰,一见倾心CVPR 2023 | 改动一行代码,PyTorch训练三倍提速,这些高级技术是关键卷上天了!如何看待CVPR 2024投稿ID突破18000?ICCV 2023 | HoP:即插即用,重塑3D检测时序利用新范式《川流不息》&《我在想你你在哪》CVPR 2023 大牛演讲:改动一行代码,PyTorch训练三倍提速!这些技术是关键!UTMB 越野高精度低成本游戏3D人脸重建方案,腾讯AI Lab ICCV 2023论文解读ICCV 2023 | 将MAE预训练好的Encoder-Decoder整体迁移到目标检测中ICCV 2023 | PVT++:通用的端对端预测性跟踪框架GPT-4推理更像人了!中国科学院提出「思维传播」,类比思考完胜CoT,即插即用他去见网友,却进了监狱5118 血壮山河之武汉会战 富金山战役 6nǚ hóng?nǚ gōngICCV 2023 | 上交提出CCD:基于自监督字符到字符蒸馏的文本识别一日登三峰 2023.07.29三登雪山 Mt. Shasta 2023.07.08多模态3D理解的新篇章:ULIP (CVPR 2023) 与ULIP-2大隐隐于市!越南一家人在San Jose开的小店全是越南客人——Phở Cường 2Texas Sunshine 2023车联网联盟CCC:CCC数字钥匙进入汽车的未来白皮书ICCV 2023 | 清华&天津大学提出SurroundOcc:自动驾驶的环视三维占据栅格预测我中了CVPR顶会论文以后....学妹中了CVPR顶会以后...ICCV 2023 | 即插即用!百度提出S3IM:用于NeRF提点的Magic LossOCT研究带来固定三联治疗,改善COPD患者小气道重塑|ERS 2023友情转载 | 白岛岩心「心理人成长社区」第三期申请通道重磅开启|全新升级,速来锁定!ICCV 2023 | 通向3D感知大模型的必由之路!UniTR:统一多模态Transformer Encoder!第3年那1年内每100辆车有多少毛病三民主义救中国 (第四章摘要)CVPR 2023 | ​微软亚洲研究院提出TinyMIM,用知识蒸馏改进小型ViT
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。