backbone结构:
from:
-n,代表是从前n层获得的输入
-1,表示从前一层获得输入
repeats:
表示模块的数目
Module:
表示网络模块的名称
args:
表示向不同模块内传递的参数
[输出通道数(ch_out),卷积核(kernel),步长(stride),padding(填充),groups(分组)]
这里没有输入通道数,原因是都是上一层的输出
具体的程序注释如下:
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 第0层,使用64个3x3的卷积核,步长为2进行卷积,得到P1/2特征图
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 第1层,使用128个3x3的卷积核,步长为2进行卷积,得到P2/4特征图
- [-1, 3, C2f, [128, True]] #第2层,进行3次池化操作,每次操作使用128个通道,最后一次操作使用降维(True)
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 第3层,使用256个3x3的卷积核,步长为2进行卷积,得到P3/8特征图
- [-1, 6, C2f, [256, True]] #第4层,进行6次池化操作,每次操作使用256个通道,最后一次操作使用降维(True)
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 第5层,使用512个3x3的卷积核,步长为2进行卷积,得到P4/16特征图
- [-1, 6, C2f, [512, True]] #第6层,进行6次池化操作,每次操作使用512个通道,最后一次操作使用降维(True)
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 第7层,使用1024个3x3的卷积核,步长为2进行卷积,得到P5/32特征图
- [-1, 3, C2f, [1024, True]] #第8层,进行3次池化操作,每次操作使用1024个通道,最后一次操作使用降维(True)
- [-1, 1, SPPF, [1024, 5]] # 9 第9层,使用1024个通道的SPPF(空间金字塔池化)层,使用5个不同大小的池化核进行池化操作
然后,P1/2表示进行操作后的图形大小
举例,yolov8的输入为:3x640x640
args:为[64,3,2],[ch_out,kernel,stride]
特征图计算公式为:
Feature_new(W,H)=(Feature_old-kernel+2*padding)/stride+1
=(640-3+2*1)/(2+1)=320,为原图的一半
head结构:
head:连接部分
10,12,13,15,16,18,19,21层与backbone中层含义一样
11层的意思为:
[-1,6]:将上一层和第6层进行连接
1:重复次数为1
concat:层的名字(意思为连接)
14,17,20层以此类推
22层次的意思为:
[15,18,21]:15层,18层,21层,进行检测
[nc]:为目标的数量
scales部分
此部分为模型的参数,有n,s,m,l,x,5个不同的版本
[depth,width,max_channels]
depth:用于控制模型的深度,仅在repeats不等于1的时候启用
width:用于控制模型的宽度,主要用于args中的ch_out
举例:
以n模型下的,第一层和第三层为例,
第一层:[-1, 1, Conv, [64, 3, 2]] # 0-P1/2
此时卷积核为64*0.25=16
第三层:[-1, 3, C2f, [128, True]]
此时的重复次数为3*0.33=1
最后附上官网的结构图