目录
🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀
可变形大核注意力(D-LKA Net)
deformable_LKA引入到yolov8
核心代码
yaml文件
DeformableConv2d
⭐欢迎大家订阅我的专栏一起学习⭐
🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀
http://t.csdnimg.cn/sVHxv
💡魔改网络、复现论文、优化创新💡
本文独家改进:可变形大核注意力(D-LKA Attention),采用大卷积核来充分理解体积上下文的简化注意力机制,来灵活地扭曲采样网格,使模型能够适当地适应不同的数据模式
D-LKA Attention | 亲测在多个数据集能够实现大幅涨点
可变形大核注意力(D-LKA Net)
图像分割通过 Transformer 模型得到了显着改进,该模型在掌握深远的上下文和全局上下文信息方面表现出色。 然而,这些模型不断增长的计算需求(与平方令牌数量成正比)限制了它们的深度和分辨率能力。 目前的大多数方法都是逐片处理 D 体图像数据(称为伪 3D),缺少关键的片间信息,从而降低了模型的整体性能。 为了应对这些挑战,引入了可变形大核注意力(D-LKA Attention)的概念,这是一种采用大卷积核来充分理解体积上下文的简化注意力机制。 这种机制在类似于自注意力的感受野中运行,同时避免了计算开销。 此外,我们提出的注意力机制受益于可变形卷积来灵活地扭曲采样网格,使模型能够适当地适应不同的数据模式。还设计了 D-LKA 注意力的 2D 和 3D 适应,后者在跨深度方面表现出色 数据理解。 这些组件共同塑造了我们新颖的分层 Vision Transformer 架构,即 D-LKA Net。
为了解决这些挑战,我们引入了Deformable Large Kernel Attention (D-LKA Attention)}的概念,这是一种采用大卷积核来充分理解体积上下文的简化注意力机制。
deformable_LKA引入到yolov8
核心代码
class deformable_LKA(nn.Module):def __init__(self, dim):super().__init__()self.conv0 = DeformConv(dim, kernel_size=(5,5), padding=2, groups=dim)self.conv_spatial = DeformConv(dim, kernel_size=(7,7), stride=1, padding=9, groups=dim, dilation=3)self.conv1 = nn.Conv2d(dim, dim, 1)def forward(self, x):u = x.clone() attn = self.conv0(x)attn = self.conv_spatial(attn)attn = self.conv1(attn)return u * attn
以上代码添加在 ultralytics\nn\modules\block.py文件中,还需要在task.py中进行注册
yaml文件
# Ultralytics YOLO , GPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f_deformable_LKA, [512]] # 12- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f_deformable_LKA, [256]] # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f_deformable_LKA, [512]] # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f_deformable_LKA, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
DeformableConv2d
import torch
import torchvision.ops
from torch import nnclass DeformableConv2d(nn.Module):def __init__(self,in_channels,out_channels,kernel_size=3,stride=1,padding=1,bias=False):super(DeformableConv2d, self).__init__()assert type(kernel_size) == tuple or type(kernel_size) == intkernel_size = kernel_size if type(kernel_size) == tuple else (kernel_size, kernel_size)self.stride = stride if type(stride) == tuple else (stride, stride)self.padding = paddingself.offset_conv = nn.Conv2d(in_channels, 2 * kernel_size[0] * kernel_size[1],kernel_size=kernel_size, stride=stride,padding=self.padding, bias=True)nn.init.constant_(self.offset_conv.weight, 0.)nn.init.constant_(self.offset_conv.bias, 0.)self.modulator_conv = nn.Conv2d(in_channels, 1 * kernel_size[0] * kernel_size[1],kernel_size=kernel_size, stride=stride,padding=self.padding, bias=True)nn.init.constant_(self.modulator_conv.weight, 0.)nn.init.constant_(self.modulator_conv.bias, 0.)self.regular_conv = nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=kernel_size,stride=stride,padding=self.padding,bias=bias)def forward(self, x):#h, w = x.shape[2:]#max_offset = max(h, w)/4.offset = self.offset_conv(x)#.clamp(-max_offset, max_offset)modulator = 2. * torch.sigmoid(self.modulator_conv(x))x = torchvision.ops.deform_conv2d(input=x, offset=offset, weight=self.regular_conv.weight, bias=self.regular_conv.bias, padding=self.padding,mask=modulator,stride=self.stride,)return x
可变形卷积可以通过整数偏移调整采样网格以实现自由变形。附加的卷积层从特征图中学习变形,从而创建偏移场。根据特征本身学习变形会产生自适应卷积核。这种灵活的内核形状可以改善病变或器官变形的表示,从而增强对象边界的清晰度。负责计算偏移量的卷积层遵循其相应卷积层的内核大小和膨胀。双线性插值用于计算图像网格上未找到的偏移的像素值。
Deformable Large Kernel Attention (D-LKA Net) 是使用的新型分层混合视觉 Transformer 和 CNN 架构。这种注意力机制使网络能够学习变形网格,以访问比传统注意力策略更相关的信息。此外,大核注意力机制可以聚合类似于自注意力的全局信息,以克服CNN机制的局部限制。此外,还设计了所提出的网络的 3D 版本,其中包括跨切片特征提取,以实现更强的表示能力。