SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy

论文链接:SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy (thecvf.com)

非官方实现:

cheng-haha/ScConv: SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy (github.com)

概述

这篇文章中稿cvpr2023,提出了一个可以即插即用的能够同时减少参数提升性能的模块。文章的核心思想是希望能够实现减少特征冗余从而提高算法的效率。一般压缩模型的方法分为三种,分别是network pruning, weight quantization, low-rank factorization以及knowledge distillation,虽然这些方法能够达到减少参数的效果,但是往往都会导致模型性能的衰减。另一种方法就是在构建模型时利用特殊的模块或操作减少模型参数,获得轻量级的网络模型,这种方法能够在保证性能的同时达到参数减少的效果。

模型结构

作者提出的SCConv包含两部分,分别是Spatial Reconstruction Unit (SRU)和Channel Reconstruction Unit (CRU),下面是SSConv的总体结构。

 我们可以看到SCConv的模块设计,对于输入的特征图先利用1x1的卷积改变为适合的通道数,之后便分别是SRU和CRU两个模块对于特征图进行处理,最后在通过1x1的卷积将特征通道数恢复并进行残差操作。

Spatial Reconstruction Unit (SRU)

 简单来说,在空间重建单元中通过中间GN层的可训练参数γ衡量特征图中空间信息的不同,空间信息越是丰富,γ越大,后面的w反映着不同特征图的重要性。通过Separate操作就能够获得信息量大和信息量较少的两个特征图(这里的蓝色作者的意思应该就是信息的多少),然后再通过后的交叉相乘与cat,获得最终的输出特征(作者这里说的是通过这样计算能够更加有效地将两个特征联合并且加强特征之间的交互)。

Channel Reconstruction Unit (CRU)

 通道重建单元就比较容易理解了,以去除冗余特征为目的,同时减少参数量。Split里a是一个超参数,实验里设置的为0.5,用于分割特征。Fuse里基于简化的SKNet再通道维度上进行特征融合。

主要的方法就是这样,其实从两个模块里都能看到注意力机制的影子,但是与之前实现的注意力机制相比,它的效果不仅减少了参数,而且提升了性能。

消融实验结果

 

 其他实验

 

 

 

### YOLOv8中的SSConv实现细节及其在目标检测中的应用 #### SSConv概述 SSConv(Shifted Spatial Convolution)是一种旨在提高卷积操作效率并增强模型性能的技术。通过引入位移机制,该方法能够在不显著增加计算成本的情况下扩大感受野,从而更好地捕捉空间信息[^3]。 #### 实现细节 为了理解SSConv如何融入YOLOv8架构中,可以考虑以下几个方面: - **分组卷积与通道混洗** 在传统卷积基础上加入分组策略,并配合使用通道混洗技术来打破不同组之间的信息隔离状态。这有助于保持较高的计算速度的同时促进跨通道的信息交流[^2]。 - **位置偏移** 对于标准的空间卷积核而言,在每次滑动窗口移动过程中都会覆盖相同的相对坐标区域;而在SSConv设计里,则允许这些滤波器按照预定义模式发生一定范围内的随机或规律性的平移变化。这种做法不仅增加了多样性还间接实现了更大尺度的感受域扩展效果[^1]。 - **多尺度特征提取** 利用上述特性构建一个多分支结构,其中每个支路负责处理特定分辨率下的图像特征图谱。最终再将它们汇总起来作为整体表示形式供后续任务模块调用。此过程有效提升了对于复杂场景下物体识别的能力。 ```python import torch.nn as nn class SSConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, groups=1, shift_pixel=1): super(SSConv, self).__init__() self.shift_conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=(kernel_size - shift_pixel * 2), stride=stride, padding=padding-shift_pixel, groups=groups) self.regular_conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups) def forward(self, x): shifted_x = x[:, :, :-shift_pixel*2, :-shift_pixel*2].contiguous() regular_out = self.regular_conv(x) shifted_out = self.shift_conv(shifted_x) output = (regular_out + shifted_out) / 2. return output ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬晚归客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值