秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡
专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有50+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转
图像分割在采用transformer模型后取得了重大改进,这些模型擅长捕捉远距离上下文和全局上下文信息。然而,这些模型的计算需求与标记数量的平方成正比,这限制了它们的深度和分辨率能力。当前大多数方法都是逐片处理D维体积图像数据(称为伪3D),忽略了至关重要的跨片信息,从而降低了模型的总体性能。为了解决这些挑战,引入了可变形大核注意力(D-LKA Attention)的概念,这是一种精简的注意力机制,采用大型卷积核以充分理解体积上下文。该机制在类似于自注意力的感受野内操作,同时规避了计算开销。此外,提出的注意力机制还受益于可变形卷积,可以灵活地扭曲采样网格,使模型能够适当地适应多样的数据模式。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
专栏地址:YOLOv8改进——更新各种有效涨点方法——点击即可跳转
目录
1. 原理
2. 将C2f_D-LKA添加到YOLOv8中
2.1 C2f_D-LKA的代码实现
2.2 更改init.py文件
2.3 添加yaml文件
2.4 在task.py中进行注册
2.5 执行程序
3. 完整代码分享
4. GFLOPs
5. 进阶
6. 总结
1. 原理
论文地址:Beyond Self-Attention: Deformable Large Kernel Attention for Medical Image Segmentation——点击即可跳转
官方代码: 官方代码仓库——点击即可跳转
D-LKA Attention(可变形大核注意力)是一种创新机制,旨在通过利用大卷积核和可变形卷积来增强医学图像分割任务的性能。下面详细解释其主要原理:
大核注意力(LKA)
LKA 使用大卷积核来实现与自注意力机制类似的感受野,但参数和计算成本更少。这是通过深度卷积、深度扩张卷积和标准卷积的组合来实现的。通过选择合适的内核大小和扩张率,LKA 可以有效地捕获全局上下文,同时保持计算效率。
可变形大核注意力(D-LKA)
D-LKA 通过结合可变形卷积扩展了 LKA 概念。可变形卷积根据输入特征调整卷积核的形状,使模型能够更好地捕获医学图像中常见的不规则形状和大小,例如病变和器官。这种适应性是通过从特征图中学习偏移场来实现的,该偏移场会调整卷积核的采样网格。这样可以产生一个灵活的内核,可以更准确地描绘对象边界。
网络架构
D-LKA 在 2D 和 3D 网络架构中实现,针对不同类型的医学成像任务量身定制:
1. 2D D-LKA 网络:
-
编码器:使用 MaxViT 块进行高效特征提取,生成分层输出表示。
-
解码器:使用 D-LKA 层进行精细分割,使用补丁扩展层进行分辨率上采样。
-
D-LKA 块:由 LayerNorm、可变形 LKA 和具有残差连接的多层感知器 (MLP) 组成,以确保有效的特征传播。
2. 3D D-LKA 网络:
-
编码器:利用 D-LKA 阶段进行分层特征提取,降低空间分辨率,同时增加通道维度。
-
瓶颈:包含额外的 D-LKA 块以进一步处理特征。
-
解码器:镜像编码器结构,使用转置卷积进行上采样,并使用 D-LKA 块保持长距离依赖性。
-
D-LKA 块:类似于 2D 块,但适用于 3D 数据,结合了层规范化和可变形 LKA,然后是标准卷积层。
计算考虑因素
虽然 2D D-LKA 可以有效捕捉医学图像的空间特征,但由于参数和 FLOP 数量的增加,扩展到 3D 带来了额外的计算挑战。 3D D-LKA 在 LKA 框架内使用单个可变形卷积层来缓解这些问题,平衡了适应性和计算效率的需求。
总之,D-LKA Attention 创新地结合了大核和可变形卷积来增强医学图像分割,提高了对复杂形状的适应性,并在 2D 和 3D 架构中保持了计算效率。
2. 将C2f_D-LKA添加到YOLOv8中
2.1 C2f_D-LKA的代码实现
关键步骤一: 将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“C2f_DLKA”
import torchvision
import torch.nn as nn
import torch
__all__ = ['C2f_DLKA', 'deformable_LKA']
class DeformConv(nn.Module):
def __init__(self, in_channels, groups, kernel_size=(3, 3), padding=1, stride=1, dilation=1, bias=True):
super(DeformConv, self).__init__()
self.offset_net = nn.Conv2d(in_channels=in_channels,
out_channels=2 * kernel_size[0] * kernel_size[1],
kernel_size=kernel_size,
padding=padding,
stride=stride,
dilation=dilation,
bias=True)
self.deform_conv = torchvision.ops.DeformConv2d(in_channels=in_channels,
out_channels=in_channels,
kernel_size=kernel_size,
padding=padding,
groups=groups,
stride=stride,
dilation=dilation,
bias=False)
def forward(self, x):
offsets = self.offset_net(x)
out = self.deform_conv(x, offsets)
return out
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
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):
"""Initialize Conv layer with given arguments including activation."""
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):
"""Apply convolution, batch normalization and activation to input tensor."""
return self.act(self.bn(self.conv(x)))
def forward_fuse(self, x):
"""Perform transposed convolution of 2D data."""
return self.act(self.conv(x))
class Bottleneck_DLKA(nn.Module):
"""Standard bottleneck."""
def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
"""Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and
expansion.
"""
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, k[0], 1)
self.cv2 = deformable_LKA(c_)
self.add = shortcut and c1 == c2
def forward(self, x):
"""'forward()' applies the YOLO FPN to input data."""
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
class C2f_DLKA(nn.Module):
"""Faster Implementation of CSP Bottleneck with 2 convolutions."""
def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
"""Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
expansion.
"""
super().__init__()
self.c = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, 2 * self.c, 1, 1)
self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2)
self.m = nn.ModuleList(
Bottleneck_DLKA(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
def forward(self, x):
"""Forward pass through C2f layer."""
x = self.cv1(x)
x = x.chunk(2, 1)
y = list(x)
# y = list(self.cv1(x).chunk(2, 1))
y.extend(m(y[-1]) for m in self.m)
return self.cv2(torch.cat(y, 1))
def forward_split(self, x):
"""Forward pass using split() instead of chunk()."""
y = list(self.cv1(x).split((self.c, self.c), 1))
y.extend(m(y[-1]) for m in self.m)
return self.cv2(torch.cat(y, 1))
D-LKA(可变形大核注意力)通过一系列精心设计的步骤处理图像,以实现高效准确的分割,尤其是在医学成像中。以下是主要工作流程的概述:
1. 输入和初始处理
-
输入图像:该过程从输入图像开始(根据网络,可以是 2D 或 3D)。
-
补丁嵌入(用于 3D):对于 3D 图像,初始补丁嵌入层会降低输入图像的维数。
2. 编码器阶段
编码器负责从输入图像中提取分层特征。
-
卷积主干:在 2D 模型中,卷积主干会降低输入图像的尺寸。
-
MaxViT 块:用于 2D 模型的编码器,以实现高效的特征提取。
-
D-LKA 阶段(用于 3D):3D 模型使用一系列 D-LKA 阶段,每个阶段都有多个 D-LKA 块。
3. 可变形大核注意力 (D-LKA) 块
每个 D-LKA 块通过以下组件增强特征表示:
-
LayerNorm:规范化输入特征。
-
可变形卷积:应用可变形卷积根据输入特征调整核形状,使模型能够更好地捕获不规则形状。
-
深度卷积:使用标准和扩张深度卷积的组合进一步处理特征。
-
多层感知器 (MLP):包括线性层和激活函数(如 GeLU)以实现非线性。
-
残差连接:通过添加残差连接确保跨层的有效特征传播。
4. 瓶颈阶段(用于 3D)
-
D-LKA 块:附加的 D-LKA 块进一步处理特征以整合信息,然后再将其传递给解码器。
5. 解码器阶段
解码器从分层特征中重建分割输出。
-
块扩展层(用于 2D):在 2D 模型中,这些层对特征图进行上采样并减少通道数。
-
转置卷积(用于 3D):在 3D 模型中,转置卷积用于上采样。
-
D-LKA 块:两种模型均在解码器中使用附加的 D-LKA 块来细化分割。
6. 最终输出
-
卷积层:最终的卷积层生成分割图。
-
跳过连接:使用额外的跳过连接来融合来自不同阶段的特征,从而提高分割精度。
7. 输出分割图
最终输出是分割后的图像,其中每个像素(或 3D 中的体素)被分类为与分割任务相关的不同类别。
关键组件摘要:
-
大内核:提供类似于自注意机制的宽接受场。
-
可变形卷积:调整内核形状以捕获图像中复杂、不规则的结构。
-
残差连接:确保深度网络的稳定性和有效性。
此工作流程使 D-LKA 能够有效处理医学图像分割的复杂性,并通过优化的计算资源提供准确的结果。
2.2 更改init.py文件
关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数
然后在下面的__all__中声明函数
2.3 添加yaml文件
关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_c2f_DLKA.yaml文件,粘贴下面的内容
Seg的yaml文件
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8-seg instance segmentation model. For Usage examples see https://docs.ultralytics.com/tasks/segment
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n-seg.yaml' will call yolov8-seg.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 768]
l: [1.00, 1.00, 512]
x: [1.00, 1.25, 512]
# 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_DLKA, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f_DLKA, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f_DLKA, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f_DLKA, [1024]] # 21 (P5/32-large)
- [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)
OD(object detect)的yaml文件
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # 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 GFLOPs
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs
l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [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_DLKA, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f_DLKA, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f_DLKA, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f_DLKA, [1024]] # 21 (P5/32-large)
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
OBB的yaml文件
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 Oriented Bounding Boxes (OBB) model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # 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 GFLOPs
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs
l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [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_DLKA, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f_DLKA, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f_DLKA, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f_DLKA, [1024]] # 21 (P5/32-large)
- [[15, 18, 21], 1, OBB, [nc, 1]] # OBB(P3, P4, P5)
温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。
# YOLOv8n
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
max_channels: 1024 # max_channels
# YOLOv8s
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
max_channels: 1024 # max_channels
# YOLOv8l
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
max_channels: 512 # max_channels
# YOLOv8m
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
max_channels: 768 # max_channels
# YOLOv8x
depth_multiple: 1.33 # model depth multiple
width_multiple: 1.25 # layer channel multiple
max_channels: 512 # max_channels
2.4 在task.py中进行注册
关键步骤四:在task.py的parse_model函数中进行注册, C2f_DLKA
还是在parse_model函数下注册
2.5 执行程序
关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_C2f_DLKA.yaml的路径即可
from ultralytics import YOLO
# Load a model
# model = YOLO('yolov8n.yaml') # build a new model from YAML
# model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_C2f_DLKA.yaml') # build from YAML and transfer weights
# Train the model
model.train(batch=16)
🚀运行程序,如果出现下面的内容则说明添加成功🚀
from n params module arguments
0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2]
1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2]
2 -1 1 7360 ultralytics.nn.modules.block.C2f [32, 32, 1, True]
3 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2]
4 -1 2 49664 ultralytics.nn.modules.block.C2f [64, 64, 2, True]
5 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2]
6 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True]
7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2]
8 -1 1 460288 ultralytics.nn.modules.block.C2f [256, 256, 1, True]
9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5]
10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1]
12 -1 1 507604 ultralytics.nn.modules.block.C2f_DLKA [384, 128, 1]
13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1]
15 -1 1 225204 ultralytics.nn.modules.block.C2f_DLKA [192, 64, 1]
16 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2]
17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1]
18 -1 1 483028 ultralytics.nn.modules.block.C2f_DLKA [192, 128, 1]
19 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]
20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1]
21 -1 1 1146132 ultralytics.nn.modules.block.C2f_DLKA [384, 256, 1]
22 [15, 18, 21] 1 751507 ultralytics.nn.modules.head.Detect [1, [64, 128, 256]]
YOLOv8_test summary: 247 layers, 4,570,835 parameters, 4,570,819 gradients, 13.3 GFLOPs
3. 完整代码分享
https://pan.baidu.com/s/10ZJrWJiHxfAoHUZTHmttBQ?pwd=meyx
提取码: meyx
4. GFLOPs
关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution
未改进的YOLOv8nGFLOPs
改进后的GFLOPs
5. 进阶
可以结合损失函数或者卷积模块进行多重改进
6. 总结
D-LKA(可变形大核注意力)是一种尖端机制,旨在通过结合大卷积核和可变形卷积的优势来增强医学图像分割。其关键原理是利用大核来模拟自注意力机制的宽接受域,从而以更少的参数和计算资源捕获长距离依赖关系。这些大核进一步使用可变形卷积进行调整,可变形卷积根据输入特征调整其形状,从而更好地表示医学图像中常见的不规则结构,例如病变和器官。D-LKA 模块集成了深度卷积和扩张卷积以实现高效的特征处理,并采用残差连接来确保跨深层网络层的有效特征传播。该方法在 2D 和 3D 网络架构中均有实现,经过优化,可应对处理高维医学图像的计算挑战,同时保持较高的分割精度。