一、yolov5的yaml文件构成
yaml文件如下图
不论是backbone还是head,每一行都由一个列表组成,列表里面有四个元素,另外,还有两个参数depth和width。在搭建模型的时候,会利用每一行的信息生成一个模块,并按照顺序放进一个列表里面,这样子就得到一个模块列表
二、列表中每个元素的意义
[-1, 1, Conv, [128, 3, 2]]
[[-1, 6], 1, Concat, [1]]
列表的第一个元素:
如果是一个-1,则不会用到其他层的信息,只做自己的前向传播就好,如果是一个列表,比如上面第二行代码,会将数字6保存下来,表示当前模块会用到模块列表中第六个模块的信息,那么在前向传播的时候第六个模块的输出将会被保存
列表的第二个元素:
把这个元素用n来表示,则n和上面提到的depth一起用来控制模型的深度,下面是代码
n = max(round(n * depth), 1) if n > 1 else n
通过上面的代码更新n的值,这个n将会被用来表示当前模块被重复的次数
列表的第三个元素:
这个元素用来实例化一个类,比如conv模块
class Conv(nn.Module):
# Standard convolution
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super(Conv, self).__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = nn.ReLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
def forward(self, x):
return self.act(self.bn(self.conv(x)))
def fuseforward(self, x):
return self.act(self.conv(x))
列表的第四个元素:
这个会被作为参数输入到模块中,不过会被做一些处理,其中比较重要的是第一个元素将会乘以width参数作为这个模块的输出通道数,