2. YOLO11网络结构详细解析(以n版本为例)

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

### 如何获取 YOLO 网络结构图 要获取 YOLO 网络结构图,可以通过以下几种方式实现: #### 方法一:直接查找官方文档或论文中的图片 许多关于 YOLO 的研究都附带详细网络结构图。这些图像通常可以在原始论文或者相关技术博客中找到。如,在 YOLO 官方 GitHub 页面以及学术文章中,作者经常提供清晰的网络架构图[^1]。 如果需要高分辨率版本,可以尝试访问原作者发布的资源页面,或者查阅引用的相关资料,比如【YOLO系列】YOLO v3(网络结构图+代码)、【YOLO 系列】YOLO v4-v5先验知识等。 #### 方法二:利用绘图工具自行制作 对于更灵活的需求,可以选择使用专业的绘图软件来重新创建网络结构图。Visio 是一种常用的流程图设计工具,能够帮助用户按照需求调整并绘制复杂的神经网络结构。具体操作方法可参考有关教程,如通过 Visio 绘制 YOLOv8 和 YOLOv11网络结构图[^2]。 以下是简单的 Python 脚本用于生成基础的可视化图表(仅作为辅助手段),虽然它无法完全替代高质量的手动绘制效果,但在快速预览时非常有用: ```python import matplotlib.pyplot as plt from tensorflow.keras.utils import plot_model from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(10, activation='softmax') ]) plot_model(model, to_file="yolo_structure.png", show_shapes=True) plt.show() ``` 此脚本会保存一张名为 `yolo_structure.png` 的文件到当前目录下,显示的是简化版卷积层和全连接层之间的关系示意图。 #### 方法三:在线搜索引擎查询公开素材 最后还可以借助 Google 图片搜索功能输入关键词 “YOLO network architecture diagram”,即可浏览大量已有的现成成果供下载选用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值