YOLO11-n的网络结构图,如下:
网上的关于YOLO11网格结构图,要么有错误,要么细节不清晰。这是我找到最好的版本,原图见博文:YOLO11 沉浸式讲解 YOLOV11网络结构以及代码剖析-CSDN博客
YOLO11网格结构的具体实现,可以在nn/task.py中parse_model函数显示的位置设置断点,调试过程中观察yaml文件被一行一行的解析。
具体解析如下:
YOLO11-backbone(n版本) | 结构图 | 模块图 |
scales: # [depth, width, max_channels] n: [0.50, 0.25, 1024] backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64*0.25, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128*0.25, 3, 2]] # 1-P2/4 - [-1, 2*0.50, C3k2, [256*0.25, False, 0.25]] - [-1, 1, Conv, [256*0.25, 3, 2]] # 3-P3/8 - [-1, 2*0.50, C3k2, [512*0.25, False, 0.25]] - [-1, 1, Conv, [512*0.25, 3, 2]] # 5-P4/16 - [-1, 2*0.50, C3k2, [512*0.25, True]] - [-1, 1, Conv, [1024*0.25, 3, 2]] # 7-P5/32 - [-1, 2*0.50, C3k2, [1024*0.25, True]] - [-1, 1, SPPF, [1024*0.25, 5]] # 9 - [-1, 2*0.50, C2PSA, [1024*0.25]] # 10 | | CBS:
Bottleneck: C3K: C3K2(False):
C3K2(True): SPPF:
C2PSA: |
YOLO11-backbone | 层号 | 说明 |
- [-1, 1, Conv, [64*0.25, 3, 2]] # 0-P1/2 | 0 | 640→320, c1=3, c2=64*0.25=16, CBS: k=3 s=2 |
- [-1, 1, Conv, [128*0.25, 3, 2]] # 1-P2/4 | 1 | 320→160, c1=16, c2=128*0.25=32, CBS: k=3 s=2 |
- [-1, 2*0.5, C3k2, [256*0.25, False, 0.25]] | 2 | 160→160, c1=32, c2=256*0.25=64, e=0.25, C3K2(False): 第1个CBS: cin=c1=32, cout=c2*e*2=32, k=1 s=1 Split: 2个c=c2*e=16 Bottleneck: n=2*0.5=1个, cin=cout=c=16, shortcut=true, 2个CBS: 第1个CBS: cin=16, cout=16*0.5=8, k=3 s=1 第2个CBS: cin=16*0.5=8, cout=16, k=3 s=1 Concat: (2+n)*c=48 第2个CBS: cin=(2+n)*c=48, cout=c2=64, k=1 s=1 |
- [-1, 1, Conv, [256*0.25, 3, 2]] # 3-P3/8 | 3 | 160→80, c1=64, c2=256*0.25=64, CBS: k=3 s=2 |
- [-1, 2*0.5, C3k2, [512*0.25, False, 0.25]] | 4 | 80→80, c1=64, c2=512*0.25=128, e=0.25, C3K2(False): 第1个CBS: cin=c1=64, cout=c2*e*2=64, k=1 s=1 Split: 2个c=c2*e=32 Bottleneck: n=2*0.5=1, cin=cout=c=32, shortcut=true, 2个CBS: 第1个CBS: cin=32, cout=32*0.5=16, k=3 s=1 第2个CBS: cin=32*0.5=16, cout=32, k=3 s=1 Concat: (2+n)*c=96 第2个CBS: cin=(2+n)*c=96, cout=c2=128, k=1 s=1 |
- [-1, 1, Conv, [512*0.25, 3, 2]] # 5-P4/16 | 5 | 80→40, c1=128, c2=512*0.25=128, CBS: k=3 s=2 |
- [-1, 2*0.5, C3k2, [512*0.25, True]] | 6 | 40→40, c1=128, c2=512*0.25=128, e=0.5(默认值), C3K2(True): 第1个CBS: cin=c1=128, cout=c2*e*2=128, k=1 s=1 Split: 2个c=c2*e=64 C3K: n=2*0.5=1, cin=cout=c=64, shortcut=true CBS-1: cin=c=64, cout=c*e=32, k=1 s=1 CBS-2: cin=c=64, cout=c*e=32, k=1 s=1 2个Bottleneck: cin=c*e=32, cout= c*e=32, shortcut=true 第1个CBS: cin= c*e=32, cout= c*e =32, k=3 s=1 第2个CBS: cin= c*e =32, cout= c*e=32, k=3 s=1 Concat: c*e + c*e=64 CBS-3: cin= c*e + c*e=64, cout=c=64, k=1 s=1 Concat: (2+n)*c=192 第2个CBS: cin=(2+n)*c=192, cout=c2=128, k=1 s=1 |
- [-1, 1, Conv, [1024*0.25, 3, 2]] # 7-P5/32 | 7 | 40→20, c1=128, c2=1024*0.25=256, CBS: k=3 s=2 |
- [-1, 2*0.5, C3k2, [1024*0.25, True]] | 8 | 20→20, c1=256, c2=1024*0.25=256, e=0.5(默认值), C3K2(True): 第1个CBS: cin=c1=256, cout=c2*e*2=256, k=1 s=1 Split: 2个c=c2*e=128 C3K: n=2*0.5=1, cin=cout=c=128, shortcut=true CBS-1: cin=c=128, cout=c*e=64, k=1 s=1 CBS-2: cin=c=128, cout=c*e=64, k=1 s=1 2个Bottleneck: cin=c*e=64, cout= c*e=64, shortcut=true 第1个CBS: cin= c*e=64, cout= c*e =64, k=3 s=1 第2个CBS: cin= c*e =64, cout= c*e=64, k=3 s=1 Concat: c*e + c*e=128 CBS-3: cin= c*e + c*e=128, cout=c=128, k=1 s=1 Concat: (2+n)*c=384 第2个CBS: cin=(2+n)*c=384, cout=c2=256, k=1 s=1 |
- [-1, 1, SPPF, [1024*0.25, 5]] # 9 | 9 | 20→20, c1=256, c2=1024*0.25=256, k=5, SPPF: 第1个CBS: cin=c1=256, cout=c1/2=128, k=1 s=1 MaxPool2d: k=5, s=1, p=2 Concat: (c1/2)*4=512 第2个CBS: cin=(c1/2)*4=512, cout=c2=256, k=1 s=1 |
- [-1, 2*0.5, C2PSA, [1024*0.25]] # 10 | 10 | 20→20, c1=256, c2=1024*0.25=256, C2PSA: 第1个CBS: cin=c1=256, cout=256, k=1 s=1 Split: 2个c=c1*0.5=128 PSABlock: n=2*0.5=1, Attention: cin=c=128, cout=128, shortcut=true FNN: cin=c=128, cout=128, shortcut=true 第1个CBS: cin=128, cout=256, k=1 s=1 第2个CBS: cin=256, cout=128, k=1 s=1 Concat: 128+128=256 第2个CBS: cin =256, cout=256, k=1 s=1 |
YOLO11-head | 结构图 |
head: - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 2*0.5, C3k2, [512*0.25, False]] # 13 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 2*0.5, C3k2, [256*0.25, False]] # 16 (P3/8-small) - [-1, 1, Conv, [256*0.25, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 2*0.5, C3k2, [512*0.25, False]] # 19 (P4/16-medium) - [-1, 1, Conv, [512*0.25, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 2*0.5, C3k2, [1024*0.25, True]] # 22 (P5/32-large) | |
YOLO11-head | 层号 | 说明 |
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] | 11 | 20→40, c1=256, c2=256 Upsample(scale_factor=2.0, mode='nearest') |
- [[-1, 6], 1, Concat, [1]] # cat backbone P4 | 12 | 40→40, c1=128+256, c2=384 |
- [-1, 2*0.5, C3k2, [512*0.25, False]] # 13 | 13 | 40→40, c1=384, c2=512*0.25=128, e=0.5(默认值), C3K2(False): 第1个CBS: cin=c1=384, cout=c2*e*2=128, k=1 s=1 Split: 2个c=c2*e=64 Bottleneck: n=2*0.5=1个, cin=cout=c=64, shortcut=true, 2个CBS: 第1个CBS: cin=64, cout=64*0.5=32, k=3 s=1 第2个CBS: cin=64*0.5=32, cout=64, k=3 s=1 Concat: (2+n)*c=192 第2个CBS: cin=(2+n)*c=192, cout=c2=128, k=1 s=1 |
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] | 14 | 40→80, c1=128, c2=128 Upsample(scale_factor=2.0, mode='nearest') |
- [[-1, 4], 1, Concat, [1]] # cat backbone P3 | 15 | 80→80, c1=128+128, c2=256 |
- [-1, 2*0.5, C3k2, [256*0.25, False]] # 16 (P3/8-small) | 16 | 80→80, c1=256, c2=256*0.25=64, e=0.5(默认值), C3K2(False): 第1个CBS: cin=c1=256, cout=c2*e*2=64, k=1 s=1 Split: 2个c=c2*e=32 Bottleneck: n=2*0.5=1个, cin=cout=c=32, shortcut=true, 2个CBS: 第1个CBS: cin=32, cout=32*0.5=16, k=3 s=1 第2个CBS: cin=32*0.5=16, cout=32, k=3 s=1 Concat: (2+n)*c=96 第2个CBS: cin=(2+n)*c=96, cout=c2=64, k=1 s=1 |
- [-1, 1, Conv, [256*0.25, 3, 2]] | 17 | 80→40, c1=64, c2=256*0.25=64, CBS: k=3 s=2 |
- [[-1, 13], 1, Concat, [1]] # cat head P4 | 18 | 40→40, c1=128+64, c2=192 |
- [-1, 2*0.5, C3k2, [512*0.25, False]] # 19 (P4/16-medium) | 19 | 40→40, c1=192, c2=512*0.25=128, e=0.5(默认值), C3K2(False): 第1个CBS: cin=c1=192, cout=c2*e*2=128, k=1 s=1 Split: 2个c=c2*e=64 Bottleneck: n=2*0.5=1个, cin=cout=c=64, shortcut=true, 2个CBS: 第1个CBS: cin=64, cout=64*0.5=32, k=3 s=1 第2个CBS: cin=64*0.5=32, cout=64, k=3 s=1 Concat: (2+n)*c=192 第2个CBS: cin=(2+n)*c=192, cout=c2=128, k=1 s=1 |
- [-1, 1, Conv, [512*0.25, 3, 2]] | 20 | 40→20, c1=128, c2=512*0.25=128, CBS: k=3 s=2 |
- [[-1, 10], 1, Concat, [1]] # cat head P5 | 21 | 20→20, c1=128+256, c2=384 |
- [-1, 2*0.5, C3k2, [1024*0.25, True]] # 22 (P5/32-large) | 22 | 20→20, c1=384, c2=1024*0.25=256, e=0.5(默认值), C3K2(True): 第1个CBS: cin=c1=384, cout=c2*e*2=256, k=1 s=1 Split: 2个c=c2*e=128 C3K: n=2*0.5=1, cin=cout=c=128, shortcut=true CBS-1: cin=c=128, cout=c*e=64, k=1 s=1 CBS-2: cin=c=128, cout=c*e=64, k=1 s=1 2个Bottleneck: cin=c*e=64, cout= c*e=64, shortcut=true 第1个CBS: cin= c*e=64, cout= c*e =64, k=3 s=1 第2个CBS: cin= c*e =64, cout= c*e=64, k=3 s=1 Concat: c*e + c*e=128 CBS-3: cin= c*e + c*e=128, cout=c=128, k=1 s=1 Concat: (2+n)*c=384 第2个CBS: cin=(2+n)*c=384, cout=c2=256, k=1 s=1 |