哥,yolov5s-v7.0的网络结构图能不能出一期呀,这样的文章太少了,现在我都不清楚检测层的网络结构是啥
不知道你这个问题是否已经解决, 如果还没有解决的话:思想: 传统的特征融合往往只是简单的feature map叠加/相加 (sum them up), 比如使用concat或者shortcut连接, 而不对同时加进来的feature map进行区分。然而,不同的输入feature map具有不同的分辨率, 它们对融合输入feature map的贡献也是不同的, 因此简单的对他们进行相加或叠加处理并不是最佳的操作, 所以这里我们提出了一种简单而高效的加权特融合的机制。
yolov5代码:
class Sum(nn.Module):
# Weighted sum of 2 or more layers https://arxiv.org/abs/1911.09070
def __init__(self, n, weight=False): # n: number of inputs
super().__init__()
self.weight = weight # apply weights boolean
self.iter = range(n - 1) # iter object
# 针对n层特征层构建n-1个可学习参数
if weight:
self.w = nn.Parameter(-torch.arange(1., n) / 2, requires_grad=True) # layer weights
def forward(self, x):
y = x[0] # no weight
if self.weight:
w = torch.sigmoid(self.w) * 2
# 特征权重的加权和
# y = x[0] + x[1]*w0 + x[2]*w1 + x[3]*w2
for i in self.iter:
y = y + x[i + 1] * w[i]
else:
# 普通的特征融合, 无权重区分
# y = x[0] + x[1] + x[2] + x[3]
for i in self.iter:
y = y + x[i + 1]
return y
# 测试代码
if __name__ == '__main__':
x = torch.rand([2, 32, 8, 8])
p = [x, x, x, x]
bottleneck = Sum(n=4, weight=True)
print(bottleneck(p).shape)
根据参考资料给出的网络结构图,可以看出yolov5s的网络结构包括了backbone和head部分。
首先,backbone部分定义了网络的主要骨干部分,由一系列卷积层组成,负责提取输入图像的特征。backbone的结构如下:
backbone:
[[-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
]
其中,Conv表示卷积层,C3表示3x3卷积块,SPPF表示空洞金字塔池化层。这些层的不同参数会影响网络的感受野和特征提取能力。
接着,head部分定义了网络的检测头结构,负责在提取到的特征上进行目标检测。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) 80
[-1, 1, Conv, [512, 3, 2]], #
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[-1, 1, Conv, [512, 1, 1]], # 24 减少了c
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # /16
[[-1, 6, 20], 1, Concat, [1]], # 26 c= 1/3
[-1, 3, C3, [512, False]], # 27
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # / 8
[[-1, 4, 17], 1, Concat, [1]], # 29
[-1, 3, C3, [512, False]], # 30 加深了c
[[17, 20, 23, 30], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
其中,Conv和nn.Upsample分别表示卷积层和上采样层,Concat表示特征拼接操作,C3表示3x3卷积块,Detect表示检测层。
从整体上看,head部分的结构是将backbone提取到的特征图在不同尺度上进行拼接和上采样操作,然后再经过一系列的卷积层来进行检测。
在了解了yolov5s的网络结构之后,请问您还有其他的问题或需求吗?