目录
需要全套改进代码请私信留言。
🍋🍋1.即插即用的 PConv风车状卷积
🍇1.1风车状卷积结构
风车状PConv卷积模块的网络结构示意图如下:
与标准卷积不同,它使用非对称填充为图像的不同区域创建水平和垂直卷积核,卷积核向外扩散。设输入张量X(h1,w1,c1),其中h1、w1、c1分别表示其高度、宽度和通道大小。为增强训练稳定性和速度,在每次卷积后应用批归一化(BN)和sigmoid线性单元(SiLU)。
PConv的第一层进行并行卷积,计算公式如下:
其中,⊗是卷积运算符,W1(1,3,c′)是一个1×3的卷积核,输出通道为c′。填充参数P(1,0,0,3)分别表示在左、右、上、下方向的填充像素数。
第一层交错卷积后输出特征图的高度(h′)、宽度(w′)和通道数(c′)与输入特征图的关系为:
其中c2是PConv模块最终输出特征图的通道数,s是卷积步长。
第一层交错卷积的结果进行拼接(Cat(.,.)),输出计算为:
最后,拼接后的张量通过卷积核W(2,2,c2)进行归一化,不进行填充。输出特征图的高度和宽度调整为预设值h2和w2,使PConv可与Conv层互换,并作为一种通道注意力机制分析不同卷积方向的贡献。最终输出Y(h2,w2,c2)计算如下:
PConv的感受野的有效性向外逐渐减弱,类似于高斯分布,且目标越小,其特征越集中,突出了中心特征的重要性。
🍇1.2PConv的参数量
PConv(k=3)的感受野为25,卷积次数从中心向外减少,类似高斯分布。PConv利用分组卷积,在显著增加感受野的同时最小化参数数量。标准卷积(Conv)的参数数量计算公式为:
若输出通道数(c2)等于输入通道数(c1),3×3的Conv参数为9c12。PConv的参数计算如下:
与的3×3 Conv相比,PConv参数减少了22.2%,感受野增加了177%。在用于提取IRST底层特征时,PConv替换YOLO系列等网络的前两个Conv层,此时c2=4c1,Conv需要
参数,而PConv需要
。因此,PConv(k=3)相比3×3 Conv,感受野增加了178%,参数仅增加111%。类似地,PConv(k=4)感受野增加444%,参数仅增加122%,表明PConv能以最小的参数增加实现高效的感受野扩展。
🍭🍭2.PConv适用场景
考虑到PConv卷积的特性:越靠近感受野中心点,权重越高,重要性越强,越原理感受野中心点,权重越小,重要性越弱,这就突出了中心特征的重要性。
因此,这种类似于高斯分布的感受野特点非常有利于面积较小的目标,这类目表通常表现为中心点深,周边浅的特性。
🍉🍉3.风车状卷积PConv的优点
PinwheelConv(PConv)风车状卷积是一种针对小目标检测的新型卷积模块,具有以下优点:
🏆3.1. 高效的感受野扩展
-
PConv通过独特的风车状结构,能够在不显著增加参数量的情况下,实现更大的感受野。
-
这种设计利用了小目标的高斯分布特征,使得卷积核能够更有效地捕捉目标的上下文信息。
🏆3.2. 即插即用的模块化设计
-
PConv被设计为一种即插即用的模块,可以轻松集成到现有的深度学习模型中,例如 YOLOv11、YOLOv8、YOLOv10、YOLOv7、YOLOv5 等。
-
这种模块化设计使得它可以在不同的模型架构中快速验证其有效性,而无需对模型进行大规模的修改。
🏆3.3. 卓越的准确性和鲁棒性
-
通过与现有卷积模块的广泛比较,PConv在多个数据集上展示了卓越的检测准确性和鲁棒性。
-
它能够有效处理图像中的小目标检测问题,尤其是在目标尺寸较小、背景复杂的情况下。
🏆3.4. 强大的泛化能力
-
PConv在多个模型和数据集上验证了其有效性,展示了强大的泛化能力。
-
这表明它不仅适用于特定的模型或数据集,还可以在不同的任务和场景中发挥作用。
🏆3.5. 参数效率高
-
PConv的设计注重参数效率,通过最小的参数增加实现了显著的性能提升。
-
这使得它在实际应用中更加高效,尤其是在资源受限的环境中(如嵌入式设备)。
PinwheelConv(PConv)风车状卷积通过其独特的设计,在小目标检测任务中表现出色。它不仅能够高效扩展感受野,还具有即插即用的灵活性、卓越的准确性和鲁棒性,以及强大的泛化能力。这些优点使得PConv在小目标检测领域具有广泛的应用前景。
🔔🔔4.如何将PConv引入YOLO11
🌷4.1直接替换普通卷积模块
在YOLO11的backbone阶段,可将骨干网络中的前两层卷积模块直接替换成PConv卷积模块,实现PConv模块大感受野,大中心点权重的功能,提升小目标的特征提取能力。
🌷4.2作为C3K2模块的优化模块
C3K2模块的结构集成了C2f和C3模块的组合,外层由C2f结构主导,内层是一个C3的结构。C3K2结构中以C2f结构为基础,将其中的特征提取层由BottleNeck层替换为C3k层,C3k层与C3结构一致,不同之处在于将BottleNeck的卷积核大小进行了调整,转变为两个核大小为3的卷积层。具体的模型结构如下图所示,代码实现附后。
可以将C3K模块中的前2 个卷积模块替换成PConv卷积。也可以将C3K模块的3个卷积全部替换成PConv卷积。
🍌🍌5.创新点Python代码
PConv类代码定义:
class PConv(nn.Module):
''' Pinwheel-shaped Convolution using the Asymmetric Padding method. '''
def __init__(self, c1, c2, k, s):
super().__init__()
# self.k = k
p = [(k, 0, 1, 0), (0, k, 0, 1), (0, 1, k, 0), (1, 0, 0, k)]
self.pad = [nn.ZeroPad2d(padding=(p[g])) for g in range(4)]
self.cw = Conv(c1, c2 // 4, (1, k), s=s, p=0)
self.ch = Conv(c1, c2 // 4, (k, 1), s=s, p=0)
self.cat = Conv(c2, c2, 2, s=1, p=0)
def forward(self, x):
yw0 = self.cw(self.pad[0](x))
yw1 = self.cw(self.pad[1](x))
yh0 = self.ch(self.pad[2](x))
yh1 = self.ch(self.pad[3](x))
return self.cat(torch.cat([yw0, yw1, yh0, yh1], dim=1))
💖💖6.YOLO11工程代码修改处
- 在/ultralytics/nn/modules/conv.py中新增PConv类,记得在__all__中添加PConv类
- 在/ultralytics/nn/modules/_init_.py中66行新增PConv的导入信息,在94行的_all__中添加PConv类
- 在/ultralytics/nn/tasks.py中45行新增PConv类的导入,在957行的base_modules中新增PConv的导入
若要调用PConv代码可在model.yaml中进行定义,如:
# Parameters
nc: 2 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
# YOLO11n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, PConv, [64, 3, 2]] # 0-P1/2
- [-1, 1, PConv, [128, 3, 2]] # 1-P2/4
- [-1, 2, C3k2, [256, False, 0.25]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 2, C3k2, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 2, C3k2, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 2, C2PSA, [1024]] # 10
# YOLO11n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)
- [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)
整理不易,欢迎一键三连!!!
送你们一条美丽的--分割线--
🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷