【YOLOv4探讨 之二】 网络结构

【YOLOv4探讨 之二】 网络结构

  • 1.主流程图
  • 2.CSPDarknet53模型--Backbone
  • 3.SPP结构--Neck
  • 4.PAN结构--Neck
  • 5.Mish激活函数
  • 6.小结

在观察YOLO的各个版本的进化历程中,网络结构的优化是最先进入我们视野的。在前面的文章《YOLOv1、YOLOv2和YOLOv3对比》中我们讨论了YOLO从v1到v3的网络结构,呈现出3个趋势:

  • 深度越来越深:backbone从能够完成基本功能的网络(v1),进化到具有成熟结构的darknet19(v2),又进化到darknet53(v3),网络能够变深的根本原因是使用了残差结构,保证网络加深的同时性能不会退化。

  • 结构越来越简洁:逐渐取消池化层,更多使用更加便于求导的线性激活函数,卷基层逐渐模块化(包含了标准化、激活),残差结构也呈现模块化的状态,全连接层消失。简洁不意味着简单,而是更加优美和便于计算。

  • 不断增加新的技术:随着标准化层、残差层、路由层等经典结构出现,YOLO的网络结构不断引入这些新东西。探测层也由detection到region到yolo,reorg也是在v2中昙花一现就再也没有出现过。

到了YOLOv4,结合以上三个趋势看:深度更深了,从v3标准版的总共107层,到v4发展至163层;结构继承了v3,使用了CSPDarknet53的结构,基于Darknet53,结构复杂了一些;新的技术方面,仅从网络结构来说,使用了Mish激活函数,SPP和PAN结构。
下面我们就解析一下cfg配置文件,看看YOLOv4的结构到底是什么样子吧。

1.主流程图

按照论文中的3段式结构,我们根据cfg配置文件画出了YOLOv4的主流程图。
【YOLOv4探讨 之二】 网络结构_第1张图片
其中,CNN层模块使用CNN[size-stride-filters-BN-Mish]或CNN[size-stride-filters-BN-Leaky]表示,route层使用ROUTE[layers]表示,upsample层使用UPSAMPLE[stride]表示。
CNN层中BN表示使用了batch nomalization,Mish表示使用的是Mish激活函数,在CPSDarknet53的Backbone中使用,Leaky表示使用的是Mish激活函数,在neck中使用。深蓝色表示输出feature map通道数没有的size=1的CNN层,棕色表示输出feature map通道数变化的size=1的CNN层,不合并提取特征,只是加深特征;浅蓝色为size≠1的CNN层,可以合并提取特征或兼具下采样的功能。给他们设置颜色是为了便于下一步和YOLOv3进行对比。
橙色模块RES[filters[size_1-stride_1,size_2-stride_2]-BN-Mish]×cnnlayer_number为残差层组合。具体结构如下:
【YOLOv4探讨 之二】 网络结构_第2张图片
【YOLOv4探讨 之二】 网络结构_第3张图片
【YOLOv4探讨 之二】 网络结构_第4张图片
【YOLOv4探讨 之二】 网络结构_第5张图片
【YOLOv4探讨 之二】 网络结构_第6张图片
这个残差结构中使用原型+号表示shortcut层。
SPP表示SPP模块,为了方便拆解将CNN[1-1-512-BN-Leaky]也划分进来,具体结构放在第3节展开,PAN PROCESS表示执行PAN结构的层的组合,具体结构放在第4节展开。

2.CSPDarknet53模型–Backbone

在YOLOv4中,使用了CSPDarknet53代替了Darknet53,这是论文三大块BoF、BoS和Methodology(方法论)中Methodology第一步“架构选择”中的内容。CSP就是cross stage partial的缩写,即阶段交叉梯度模型,其实就是把不同位置的梯度交叉混合一下。源于台湾研究小组2019年11月份的论文《CSPNet: A New Backbone that can Enhance Learning Capability of CNN》中的研究成果。设计优势在于:

  • 丰富的梯度分流——提高训练准确度和收敛速度
  • 计算权重的均衡——提高运算速度和硬件资源使用率

我们将对比YOLOv3,看看YOLOv4中CSPDarknet的backbone到底有哪些改进。YOLOv3的模型如下:
【YOLOv4探讨 之二】 网络结构_第7张图片

对比第1节中的YOLOv4网络结构图可见,区别主要就是在下采样CNN之前,将下采样(downsample)前一次残差层前后的主要feature map通过route层放在一起,在进行下一次的downsample。这里没有FPN,因为route层组合的feature map是在两次downsample之间,虽然两组feature map进行过特征强化或者通道压缩,但是route前通道数相同。个人以为这种方式其实是对残差模块的优化,通过route的方式进行梯度分流。当然如果将route+shortcut设计成一个嵌套的残差层也是一种思路,但是这样会弱化内部残差结构的效果,route+shortcut应优于嵌套shortcut。
至于运算速度,《CSPNet: A New Backbone that can Enhance Learning Capability of CNN》中其实并没有给出特别清晰的理论分析,只是针对DenseNet从平衡每层计算量和通道数量产生的影响方面进行简要说明,但是YOLOv3实验效果明显。在YOLOv4论文论述中YOLOv4中确实也提高了效率,而且CSPDarknet53优于CSPResNext50。

3.SPP结构–Neck

SPP是Spatial pyramid pooling的缩写,即空间金字塔池化,单纯看这个名字实在是不能理解,其实就是将SPM中的Matching前的处理过程通过池化层Pooling来解决。属于YOLOv4论文中BoS的范畴。原理图如下:
【YOLOv4探讨 之二】 网络结构_第8张图片
具体操作方法就是将backbone输出的feature map分别进行尺度为5×5,9×9和13×13的最大池化,然后使用route层将未池化和3种池化结果混合。
SPP来源于论文《Spatial pyramid pooling in deep convolutional networks for visual recognition》,主要目的在于便于处理不同尺寸的图像。即开始的时候不规定特征图的尺寸,而是在卷积后将各种不同尺寸的图像输出结果统一到全连接层固定的输入。
上个论文截图:
【YOLOv4探讨 之二】 网络结构_第9张图片
论文说SPP有如下的三个优点:

  • 可以解决输入图片大小不一造成的缺陷。
  • 由于把一个feature map从不同的角度进行特征提取,再聚合的特点,显示了算法的robust的特性。
  • 同时也在object recongtion增加了精度。

其实,在YOLOv4中完全不存在尺寸融合的问题,因为在loaddata的时候,就已经将图像拉伸到固定尺寸了。这里主要还是使用了后面两个优点。
对于608×608的输入,到这里就已经变成了19×19了,尤其是后面的13×13已经占用了一大半的空间了,这时这里的效果就是一个非均匀的池化和合并的过程,理论上这种情况结合ROI Pooling效果更佳。

4.PAN结构–Neck

PAN来源于获得COCO 2017 instance segmentation的冠军论文《Path Aggregation Network for Instance Segmentation》。PAN是Path Aggregation Network的缩写,就是路径增强,用在YOLOv4中从cfg配置文件layer编号的顺序就是将YOLOv3三种不同尺度的处理过程先倒过来,再把后面有用的信息route前面去。
YOLOv3中YOLO层前feature map处理过程原理图和YOLOv4中PAN过程原理图分别如下:
【YOLOv4探讨 之二】 网络结构_第10张图片
【YOLOv4探讨 之二】 网络结构_第11张图片
YOLOv3是先处理尺度最大的feature map;然后使用route层获取一个倒数第二次downsample的feature map,接着upsample到中尺度;最后在此基础上使用route层获取一个倒数第三次downsample的feature map,接着upsample到小尺度。
YOLOv4是在完成SPP之后,先得到尺度最大的feature map(FM1)。然后进行1次upsample获得一个feature map,同时使用route层获取一个倒数第二次downsample的feature map,将两个中尺度feature map混合得到FM2;接着经过若干卷基层,再进行1次upsample获得一个feature map,同时使用route层获取一个倒数第三次downsample的feature map,将两个小尺度feature map混合得到FM3。接下来,先处理尺度最小的FM3,从倒数第三次downsample层route一个小尺度feature map,将其与FM3混合,经过若干卷基层后,最终通过YOLO层进行处理。下面,重头戏来了,从小尺度层的YOLO层前倒数第三层,抽取一个小尺度的feature map,将其与FM2进行若干次卷积后的feature map混合,然后downsample到中尺度,最终通过YOLO层进行处理。最后再进行类似的操作,route一个倒数第二次downsample层和FM2若干次卷积后的feature map的混合,然后downsample到大尺度,最终通过YOLO层进行处理。至此,完成所有的探测。
论文中对于PAN原理的描述如下图:
【YOLOv4探讨 之二】 网络结构_第12张图片
虽然叫做PAN但是使用的是PAN network中的Bottom-up Path Augmentation 策略。
图中(a)部分为常规的FPN,加入一条top-down的旁路连接,能给feature增加high-level的语义性有利于分类。由于low-level的feature是很利于定位,虽然FPN中P5也间接得有了low-level的特征,但是信息流动路线太长了,如红色虚线所示,YOLOv4标准模型达到六七十层卷积,通过图中(b)的Bottom-up Path Augmentation,可以使得最底层的特征流动到N2-N5只需要经过很少的层如绿色需要所示(仅仅有几个降维的卷积)。

5.Mish激活函数

具体的函数公式为
y = x ∗ t a n h ( s o f t p l u s ( x ) ) y=x *tanh(softplus(x)) y=xtanh(softplus(x))
,其中 t a n h ( x ) = e 2 x − 1 e 2 x + 1 tanh(x) = \frac{e^{2x}-1}{e^{2x}+1} tanh(x)=e2x+1e2x1 , s o f t p l u s ( x ) = l o g ( 1 + e x ) softplus(x) = log(1+e^x) softplus(x)=log(1+ex)
其函数形状如图所示:
【YOLOv4探讨 之二】 网络结构_第13张图片
对比Leaky和ReLU函数:
【YOLOv4探讨 之二】 网络结构_第14张图片
【YOLOv4探讨 之二】 网络结构_第15张图片
Mish激活函数是有点类似于Leaky或ReLU的激活函数,在输入>0时,具有近似线性特征;在输入≤0时,不至于输出为0,同时在输入趋于 − ∞ -∞ 时,输出又能收敛于0。
Mish和ReLU、Leaky一样,避免了由于封顶而导致的饱和。相比较ReLU,对负值的轻微允许允许更好的梯度流,相比较Leaky又可以使得在负输入较大时,输出不能收敛。同时,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

6.小结

YOLOv4在结构上的改进从本质上都是正向推理时特征信息更加完备,反向传播过程中梯度流能够更好的传播。CSPDarknet主要对残差模块进行升级,丰富了backbone的梯度流;SPP和PAN都是金字塔模型的方法,其中SPP相当于把YOLOv3久违的池化层集中找回来了,PAN采用反馈式的传播方式,丰富了neck中的梯度流;Mish采用了更加精确的梯度流控制。后面有机会我们将分析一下相关的反向传播原理。

你可能感兴趣的:(YOLOv4,人工智能,深度学习,神经网络)