2. YOLO11网络结构详细解析(以n版本为例)
网上的关于YOLO11网格结构图,要么有错误,要么细节不清晰。我们对YOLO11网格结构进行了具体解析。
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 |
更多推荐
所有评论(0)