Yolo v5的工程代码实现:超参数与优化策略
在Yolo v5的代码中,训练时有几个需要配置的文件。一个是模型的yaml文件,当中包含了多个参数。
Model.yaml
我们以最小的yolov5s.yaml为例,它的配置文件如下所示:
1 |
|
网络深度与宽度
第一个需要了解的是这里的是depth_multiple
和width_multiple
。
depth_multiple
: 有些模块需要重复n次,这时就会将depth_multiple
$/times$n来控制模块重复的次数。例如在模型架构图中,包含C3模块如下:
1 |
|
这里的第二个数字用来控制C3模块中残差模块的个数。这时就将depth_multiple
乘以它来控制重复的次数,这时实际的残差模块的重复次数为1,2,3,1
,网络的深度就变浅了。当然,本来就为1的不会变。
C3模块是一个含有3个卷积层的bottleneck模块。留着以后学习。
width_multiple
: 控制某些模块输出的channel数。例如卷积层的channel数,用于控制网络宽度。例如卷积层:
1 |
|
其中的[64, 6, 2, 2]
代表输出通道数,卷积核,步长,Padding。当width_multiple
为0.5时,输出通道数即为32。
Anchor
引用链接:
锚框(anchor box)/先验框(prior bounding box)概念介绍及其生成-CSDN博客
锚框:Anchor box综述 - 知乎 (zhihu.com)
Yolov5中使用K-means的聚类来初始化9个锚框。这九个锚框分别在三个检测层的Feature Map上被使用。
尺度越大,Feature Map越大,对原图的下采样越小,感受野也越小,设置的Anchor也越小,对原图的小物体预测效果更好。
锚框又称为先验框,在Faster R-CNN中被提出。原先的目标检测方法需要使用固定尺寸的滑动窗口,遍历固定大小的窗口里的像素来判断是否是目标。这样会导致不适合形变较大的物体,并且计算量过大。
因此Faster R-CNN中加入了RPN(Regional Proposal),区域候选框。它负责找到图像中最可能出现目标分类的候选区域。
锚框则是人为预先选择好的不同大小的候选框。模型去预测Grounding Truth和锚框的偏移量。
篇幅有限,之后再学习。
总之,这个参数是对预测图片中的物体大小进行适配。如果检测物体较小,则需要调小。Yolo v5中,如果Anchor只设置为数字,则会调用AutoAnchor,找到最佳的锚框。
在Yaml文件中,Anchors可以看到包含三个列表,表示给三个尺度分配,这三个尺度在[[17, 20, 23], 1, Detect, [nc, anchors]] 指明,分别是网络的第17、20和23层。注释P3/8是指输入下采样了23 = 8倍,我们也可以发现网络的第17层特征图为输入的1/8。
[[17, 20, 23], 1, Detect, [nc, anchors]] 表示把第17、20和23三层作为Detect模块的输入, [nc, anchors]是初始化Detect模块的参数。Detect模块在model/yolo.py中声明,相当于从模型中提出想要的层作为输入,转换为相应的检测头,其输出用来计算loss。
网络架构
网络架构分为了Backbone和Head,这两个写法是一样。Yolov5按照配置文件实例化各个层,每行的列表中的四个元素分别代表:[from, number, module, args]:
- from:该层的输入,-1代表上一层
- number:该层的数量
- module:类名
- args:类的初始化参数
hyp.scrach.yaml
data/hyps
中存放了默认的初始化超参数。示例如下:
1 |
|
以下系数是数据增强系数,包括颜色空间和图片空间:
1 |
|
此外,在训练时,还可以调整训练超参数,包括训练图片的尺寸,Batch,Epoch等等。
2024/4/8 于苏州