本文创作为自用学习
yolov5-models-yolov5s.yaml
#l、m、s、x四个文件只有控制模型参数的两个参数depth-multiple和width-multiple不同,其他都相同
# parameters
nc: 80 #所判断目标类别的种类,此处80类
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
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 backbone
#backbone:每层layer,from=-1表示上层的输出为这层的输入;
#number表示该层的重复次数,但最后真正的重复次数还要number乘#以depth_multiple后取整;
#module表示该层的名字,args是每层layer的参数,
#[64,6,2,2]
#64是输出的通道(最终输出的还要乘以width-multiple取整),
#6是6×6卷积核,2是padding=2(边缘空白),2是stride
#0-P1/2表示该层为第0层,输出后会变成原图的二分之一
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 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, 9, 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, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]], # 9
]
# YOLOv5 head
head:
#head文件包括neck和detect两个部分
#上面最后一层C3输出chanel为1024,
#此处head第一层会改变chanel为512
[[-1, 1, Conv, [512, 1, 1]],
#nn.upsample不改变chanel但是会把图片宽和高都变为2倍
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
#现在就可以与前面backbone中的backbone P4阶段的最后一个输出做一个contect
#即输出40×40×512contact40×40×512=40×40×1024
[[-1, 6], 1, Concat, [1]], # cat backbone P4
#经过下面的C3输出为40×40×512
[-1, 3, C3, [512, False]], # 13
#即此时输出为40×40×512
[-1, 1, Conv, [256, 1, 1]],
经过这一层输出40×40×256
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
#上面两个是向上
#下面两个阶段是向下contect
[-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层下面
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
图像输入进入卷积,提取特征
↓
C3和conv交替出现
↓
spp是空间特征金字塔融合,进一步增大feature map 的感受野
使得物体在不同的尺度下输入时都可以被很好的检测到
↓
调整输出图片的大小使得neck的前两层可以向上融合
再有两层向下的contect
↓
detect