1. 空间重构单元（SRU）

2. 通道重构单元（CRU）

# 新建ultralytics/nn/modules/conv/ScConv.py

import torch
import torch.nn.functional as F
import torch.nn as nn

def autopad(k, p=None, d=1):  # kernel, padding, dilation
# Pad to 'same' shape outputs
if d > 1:
k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-size
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad
return p

class Conv(nn.Module):
# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
default_act = nn.SiLU()  # default activation

def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()

def forward(self, x):
return self.act(self.bn(self.conv(x)))

def forward_fuse(self, x):
return self.act(self.conv(x))

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
self.group_num  = group_num
self.gamma      = nn.Parameter( torch.randn(c_num, 1, 1)    )
self.beta       = nn.Parameter( torch.zeros(c_num, 1, 1)    )
self.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

class SRU(nn.Module):
def __init__(self,
oup_channels:int,
group_num:int = 16,
gate_treshold:float = 0.5
):
super().__init__()

self.gn             = GroupBatchnorm2d( oup_channels, group_num = group_num )
self.gate_treshold  = gate_treshold
self.sigomid        = nn.Sigmoid()

def forward(self,x):
gn_x        = self.gn(x)
w_gamma     = F.softmax(self.gn.gamma,dim=0)
reweigts    = self.sigomid( gn_x * w_gamma )
# Gate
info_mask   = w_gamma>self.gate_treshold
noninfo_mask= w_gamma<=self.gate_treshold
x_1         = info_mask*reweigts * x
x_2         = noninfo_mask*reweigts * 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)


# task.py 注册scconv

|
1月前
|

YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型（提高FPS+检测效率）
YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型（提高FPS+检测效率）
232 0
|
1月前
|

YOLOv5改进 | 2023注意力篇 | MLCA混合局部通道注意力（轻量化注意力机制）
YOLOv5改进 | 2023注意力篇 | MLCA混合局部通道注意力（轻量化注意力机制）
237 0
|
1月前
|

YOLOv8改进 | 2023注意力篇 | MLCA混合局部通道注意力（轻量化注意力机制）
YOLOv8改进 | 2023注意力篇 | MLCA混合局部通道注意力（轻量化注意力机制）
215 1
|
7天前
|

【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
24 2
|
5天前
|

YOLOv8改进 | 注意力机制 | 添加混合局部通道注意力——MLCA【原理讲解】
YOLOv8专栏介绍了混合局部通道注意力（MLCA）模块，它结合通道、空间和局部信息，提升目标检测性能，同时保持低复杂度。文章提供MLCA原理、代码实现及如何将其集成到YOLOv8中，助力读者实战深度学习目标检测。[YOLOv8改进——更新各种有效涨点方法](https://blog.csdn.net/m0_67647321/category_12548649.html)
21 4
|
7天前
|

【从零开始学习深度学习】21. 卷积神经网络（CNN）之二维卷积层原理介绍、如何用卷积层检测物体边缘
【从零开始学习深度学习】21. 卷积神经网络（CNN）之二维卷积层原理介绍、如何用卷积层检测物体边缘
18 3
|
20天前
|

【YOLOv8改进】 SPD-Conv空间深度转换卷积，处理低分辨率图像和小对象问题 (论文笔记+引入代码)
YOLO目标检测专栏探讨了CNN在低分辨率和小目标检测中的局限性，提出SPD-Conv新架构，替代步长卷积和池化层，通过空间到深度层和非步长卷积保持细粒度信息。创新点包括消除信息损失、通用设计和性能提升。YOLOv5和ResNet应用SPD-Conv后，在困难任务上表现优越。详情见YOLO有效改进系列及项目实战目录。
26 0
|
20天前
|

【YOLOv8改进】BiFPN：加权双向特征金字塔网络 (论文笔记+引入代码)

23 0
|
1月前
|

84 0
|
1月前
|

YOLOv5改进 | 注意力篇 | ACmix自注意力与卷积混合模型（提高FPS+检测效率）
YOLOv5改进 | 注意力篇 | ACmix自注意力与卷积混合模型（提高FPS+检测效率）
95 0