文章目录
- 前言
- 一、yolov5配置yaml文件
- 二、模型结构详解图
- 总结
前言
YOLO-V5(GIT链接):https://github.com/ultralytics/yolov5
一、yolov5配置yaml文件
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
先分段介绍一下上面代码中一些参数表示的意思。
# Parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
Parameters
为一些超参数的设置内容。其中,
-
nc
表示类别的数量,由于默认使用COCO数据集,这里nc=80
; -
depth_multiple
表示深度因子,用来控制一些特定模块的数量的,模块数量多网络深度就深; -
width_multiple
表示宽度因子,用来控制整个网络结构的通道数量,通道数量越多,网络就看上去更胖更宽; -
anchors
表示预先设置的anchor框大小,由于有3个检测输出头位置,因此有3行。
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
这里就是开始构建整体的网络中各个模块的结构,都用list
的格式表示为[from, number, module, args]
。其中,
-
from
表示该模块的输入来源,如果为-1则表示来自于上一个模块中,如果为其他具体的值则表示从特定的模块中得到输入信息; -
number
表示建立number个该模块叠加起来,后期将简写成n
,n=1
表示这个模块就放了一个; -
module
表示具体的模块名称,具体可以看YOLOV5项目代码中common.py
文件。(不嫌弃的话,手画了一张图放在下面,简单看看) -
args
表示该模块具体的参数设置,不同的模块是不同的参数设置,在后面的图里会详细说的。
二、模型结构详解图
在深度因子depth_multiple
与宽度因子width_multiple
都为1.0
的情况下,我们绘制了如下图的模型解释表,Layer_ID
表示这个层的ID位置,方便后面from
调用的查看,output_FM_size
表示该层输出的特征图大小(这里假设输入图片为640x640x3
)。
上图中有些符号与颜色解释一下:
-
灰色背景字
表示模型的Concat操作位置; -
绿色背景字
表示模型的检测输出头位置; -
黄色五角星
表示模型中被其他层通过from
调用的层结构位置; -
红色圈
是深度因子控制下的叠加层数量,当深度因子为1.0
时,依次为3、6、9、3、3、3
;当深度因子为0.33
时,乘上0.33,依次为1、2、3、1、1、1
; -
红色框
是宽度因子控制下的通道数量,当宽度因子为1.0
时,依次为3、64、128...
;当深度因子为0.50
时,乘上0.50,依次为3、32、64...
。
下图是YOLO-V5的实际结构图,可以与上图中的信息对应着看。其中,
-
红色实线箭头
表示与上图Layer_ID
一致的结构构造流程; -
模块右上角红字
表示该模块的Layer_ID
,仅标注了一些与结构相关的重要模块; -
黄色五角星
表示被其他模块通过from
调用的模块位置,与上图中的黄色五角星
对应; -
灰色底矩形
表示Concat操作模块,与上图中的灰色背景字
对应; -
绿色底矩形
表示检测输出头,与上图中的绿色背景字
对应。
总结
本文仅表示个人理解,如果有错误欢迎指出。