模型配置文件
YOLO v5的模型配置文件都一样,区别在层深depth_multiple和宽度width_multiple控制不一样。YOLO v5s是最简洁的一个模型,深度为1就是说没有重复模块,因此方便用来分析其结构。模型的具体深度需要跑一下才能看到,或者将depth_multiple与各层 number相乘,按下式计算:
n = max(round(n * gd), 1) if n > 1 else n # depth gain
下面给出了具体的 YOLO v5s 参数配置信息:
from n params module arguments layer cin cout
---------------------------------------------------------------------------------------------------------------------------------------------
0 -1 1 3520 models.common.Focus [3, 32, 3] Focus 3 32
1 -1 1 18560 models.common.Conv [32, 64, 3, 2] Conv 32 64
2 -1 1 19904 models.common.BottleneckCSP [64, 64, 1] BottleneckCSP 64 64
3 -1 1 73984 models.common.Conv [64, 128, 3, 2] Conv 64 128
4 -1 1 161152 models.common.BottleneckCSP [128, 128, 3] BottleneckCSP 128 128
5 -1 1 295424 models.common.Conv [128, 256, 3, 2] Conv 128 256
6 -1 1 641792 models.common.BottleneckCSP [256, 256, 3] BottleneckCSP 256 256
7 -1 1 1180672 models.common.Conv [256, 512, 3, 2] Conv 256 512
8 -1 1 656896 models.common.SPP [512, 512, [5, 9, 13]] SPP 512 512
9 -1 1 1248768 models.common.BottleneckCSP [512, 512, 1, False] BottleneckCSP 512 512
10 -1 1 131584 models.common.Conv [512, 256, 1, 1] Conv 512 256
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] Upsample 512 256
12 [-1, 6] 1 0 models.common.Concat [1] Concat 512 512
13 -1 1 378624 models.common.BottleneckCSP [512, 256, 1, False] BottleneckCSP 512 256
14 -1 1 33024 models.common.Conv [256, 128, 1, 1] Conv 256 128
15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] Upsample 256 128
16 [-1, 4] 1 0 models.common.Concat [1] Concat 256 256
17 -1 1 95104 models.common.BottleneckCSP [256, 128, 1, False] BottleneckCSP 256 128
18 -1 1 2322 torch.nn.modules.conv.Conv2d [128, 18, 1, 1] Conv2d 128 255
19 -2 1 147712 models.common.Conv [128, 128, 3, 2] Conv 128 128
20 [-1, 14] 1 0 models.common.Concat [1] Concat 128 256
21 -1 1 313088 models.common.BottleneckCSP [256, 256, 1, False] BottleneckCSP 256 256
22 -1 1 4626 torch.nn.modules.conv.Conv2d [256, 18, 1, 1] Conv2d 256 255
23 -2 1 590336 models.common.Conv [256, 256, 3, 2] Conv 256 256
24 [-1, 10] 1 0 models.common.Concat [1] Concat 256 512
25 -1 1 1248768 models.common.BottleneckCSP [512, 512, 1, False] BottleneckCSP 512 512
26 -1 1 9234 torch.nn.modules.conv.Conv2d [512, 18, 1, 1] Conv2d 512 255
27 [-1, 22, 18] 1 0 Detect [1, anchors Detect 512 255
网络可视化
根据配置文件定义,将网络进行图1划分:

归纳整理得到图2:

搭建网络
根据网络划分和梳理的连接就可以自行搭建网络了。
class YoloModel(nn.Module):
anchors = [[116, 90, 156, 198, 373, 326],
[30, 61, 62, 45, 59, 119],
[10, 13, 16, 30, 33, 23]]
def __init__(self, class_num=1, input_ch=3):
super(YoloModel, self).__init__()
self.build_model(class_num)
# Build strides, anchors
s = 128 # 2x min stride
self.Detect.stride = torch.tensor(
[s / x.shape[-2] for x in self.forward(torch.zeros(1, input_ch, s, s))]) # forward
self.Detect.anchors /= self.Detect.stride.view(-1, 1, 1)
check_anchor_order(self.Detect)
self.stride = self.Detect.stride
# print('Strides: %s' % self.Detect.stride.tolist()) # [8.0, 16.0, 32.0]
print("Input size must be multiple of", self.stride.max().item())
torch_utils.initialize_weights(self)
self._initialize_biases() # only run once
# model_info(self)
def build_model(self, class_num):
# output channels
self

本文深入解析YOLOv5模型结构,从配置文件到网络搭建,再到检测模块的细节,全面介绍了YOLOv5的工作原理及实现方式。
最低0.47元/天 解锁文章
5857





