YOLOv5 网络架构与组件(二)

文章目录

    • 1. YOLOV5 组成
    • 2. YOLOV5 网络结构
    • 3. 各个模块的介绍
    • 4. YOLOv5 灵活配置不同复杂度的模型

1. YOLOV5 组成

  • Backbone: Focus,BottleneckCSP,SPP
  • Head: PANet +Detect (YOLOv3/v4 Head)

2. YOLOV5 网络结构

YOLOv5 网络架构与组件(二)_第1张图片
整个网络结构分为Backbone 和 Head两大块,具体各模块介绍如下:
1. Backbone 部分

左边图片输入640 x 640 x 3,第一个模块进入的是Focus模块,经过Focus特征图长宽变为原来的一半,具有下采样的效果。然后还有4个带凸起的Cnv(stride=2),总共有5次下采样,即32倍的下采样,640 x 640 的图片输入,就变成了20 x 20的特征层。中间有3个橙色的BCSP:,分别是BCSP1BCSP2BSCP3:(数字表示BSCP的重复次数)。后面是SPP层(空间金字塔池化操作)

2. Head 部分

在Head部分中有两次上采样,其中带黄色的BCSP1(不带shutcats的Bottleneck),这里有两次上采样的输出都会和Backbone中同样尺寸的特征图进行拼接Concat。拼接后经过后面的模块,最终都会经过Detect这个模块的处理。输出的3个特征图的大小分别为:20 x 20, 40 x 40,80 x 80。对于COCO数据集它的深度都是255.

3. 各个模块的介绍

蓝色的Conv层
在这里插入图片描述
组合的Conv包括Conv2d、BatchNormalization和HardSwish激活函数
带凸起的蓝色的Conv层
在这里插入图片描述
带凸起的Conv唯一区别是stride=2,起到下采样的作用
Bottlenack (True)

YOLOv5 网络架构与组件(二)_第2张图片

表示一个残差结构,一路:2个串联的Conv模块,另一路:需要跟2个串联的Conv模块的输出进行相加运算

Bottlenack(False)
YOLOv5 网络架构与组件(二)_第3张图片

没有残差结构,由两个Conv层串联组成。

BCSPn (Bottleneck CSP)
橙色的
YOLOv5 网络架构与组件(二)_第4张图片

小写的n表示由多少个Bottleneck,即Bottleneck重复n

BCSPn (Bottleneck CSP)
黄色的
在这里插入图片描述

黄色的BCSPn 和橙色的BCSPn的区别是Bottleneck(false),即Bottleneck没有残差网络结构

Focus网络模块
YOLOv5 网络架构与组件(二)_第5张图片

Focus 模块,先做分片slice,然后在做Concat拼接,最后经过一个Conv操作,Focus经过分片后,它的特征图的宽、高都会变为原来的一般,因此是有下采样的效果的。

YOLOv5 网络架构与组件(二)_第6张图片

Focus模块把输入数据切分为4份,每份数据都是相当于2倍下采样得到,然后在channel维度进行拼接,最后进行卷积操作。

如上图我们可以看到4x4的输入,我们这里切分可以看到不同的颜色区分,各种颜色分别取4个。这样的话我们的特征图减小为1/4,channel方向是原来的4倍。

  • Focus模块的设计是用来减少FLOPS(浮点运算计算量)和增加速度,但对mAP的提高帮助不大
  • 经过Focus操作后,输入[b,c,h,w] ->[b,c *4, h//2,w//2],把宽度和高度的信息整合的channel空间
  • 以Yolov5s的结构为例,原始640 x 640 x 3的图像输入Focus结构,采用切片操作,先变成320 * 320 * 12的特征图,再经过一次32个卷积核的卷积操作,最终图像变成320 * 320 *32

SPP模块(Spatial Pyramid Pooling)
YOLOv5 网络架构与组件(二)_第7张图片
YOLOv5 网络架构与组件(二)_第8张图片

SPP即空间金字塔池化,它前后都有一个Conv操作,中间是最大池化,池化盒的大小分别是5 x 5, 9 x 9, 13 x13,最下面一路没有池化操作,而是直接直连。这四路的输出再经过拼接Concat,最好经过Conv层输出

这个模块可以增大感受野,提取出最重要的上下文特征,但是不会带来运算速度的减少

例子:如上图,图片大小为416 x 416。处理获得 13 x 13 x 512 特征图,经过SPP模块我们可以看到,特征图的尺寸并没有变化,这里通过padding进行填充,使得特征图大小不变。其中最左边的一路没有经过池化,然后这四路在channel维度进行拼接,拼接后特征图大小变为13 x 13 x 2048这样的特征图张量。

CSPNet
CSP(Cross Stage Partial Network) 跨阶段局域网络
YOLOv5 网络架构与组件(二)_第9张图片

我们可以看到,对于一般的网络,比如ResNet 网络,Base layer经过n个残差结构;对于CSP呢,它的Base layer分成两个部分,这两部分接收同样的输入数据。其中一部分直接输出,另一部分经过一个n个残差结构,这样有助于提高运行的速度。

CSPNet
Path -Aggregation Network 路径聚合网络
YOLOv5 网络架构与组件(二)_第10张图片

  • 对于一般的FPN网络,它的特征图大小,不同尺度是通过层层进行融合的,但最大特征图往上传递信息时,信息会丢失不容易和第一层有较好的融合
  • PANet 会增加一个Bottom-up路径,使得下面大尺度的特征图和最上面的特征图直接融合,信息比较容易网上传。同时在相同尺度上进行融合。然后在做拼接操作。
  • 这里既有bottom-down ,也有bottom-up这样融合的信息会更加丰富
  • 在yolov5的网络架构图中,可以看到有两次上采样,两个带凸起的Conv又是两次下采样
  • 然后在相同尺度的特征图,进行concat操作,这里意味着有从上往下的信息流,又有从下问你个事的信息流,最后经过融合送入到detect模块进行处理,这样的话就实现了PANet的操作思想

4. YOLOv5 灵活配置不同复杂度的模型

YOLOv5 网络架构与组件(二)_第11张图片

我们看这个表,YOLOv5可以灵活配置不同复杂度的模型,它就是采用了类似于EfficientNet的channel和layer的控制因子,这里分别是depth_multiple、width_multiple这两个控制参数来控制网络的深度和宽度。

  • 其中第一个depth_multiple它控制网络的深度,体现在改变网络中BottleneckCSP的数量,另外width_multiple它控制网络的宽度,也就是卷积核的数量。
  • YOLOv5l的depth_multiple、width_multiple都是1.0,其中BottleneckCSP(True)为(3,9,9),BottleneckCSP(False)为(3),另外它的卷积核数量分别为(64,128,256,512,1024),其中第一个64为focus模块中卷积核的数量。
  • 对于YOLOv5s它的depth_multiple=0.33, 他的BottleneckCSP(true)=(3,9,9)*0.33 取整后等于(1,3,3)。BottleneckCSP(false)= 3 x 0.33=1. 卷积核数量=(64,128,256,512,1024) x width_multiple(0.5)=(32,64,128,256,512)。
  • 同理YOLOv5m,YOLOv5x也是这样计算
  • 我们通过改变depth_multiple、width_multiple的系数就可以得到不同的大小的YOLOv5网络模型,由此这四种YOLOv5就非常容易构建

你可能感兴趣的