十念 发表于 2024-6-20 21:00:34

YoloV5、ShuffleNetV2、YoloV5-Lite网络概述

前言

前段时间必要在树莓派上部署一个深度学习情况,先试了YoloV5,fs基本才0.3,远远达不到要求,于是就实验了一下轻量化网络,试过mobileNet系列+YoloV4,fps有所提升,大概能到达0.9左右,但还是比较慢,于是就发现了YoloV5-Lite这个轻量化网络,极大地加快了fps,基本能到达3左右,因此详细相识了一下YoloV5-Lite网络,在这写一篇博客记录一放学习结果,有讲的不对的地方还望大家批评指正!!!
一、YoloV5概述

    yolov5的网络结构图如下图所示:https://img-blog.csdnimg.cn/direct/9912a0b30e754e6b943021a7b0f2c6ac.png
                                                             图1    yoloV5-5.0网络结构图
              
         yolov5团体结构分为Input,Backbone、Neck、Prediction network(Head)四个部门,其亮点有如下:
(1)输入端:Mosaic数据增强、自顺应锚框计算、自顺应图片缩放
(2)Backbone:Focus结构,CSP结构
(3)Neck:FPN+PAN结构
(4)Prediction network:GIOU Loss
        再者,作者也参加了新的模块:
1. Focus模块

        focus模块是一种用来加快特征提取的模块,其重要作用是将输入的特征图进行分组处理,以淘汰计算量和进步模型服从。focus模块通常用于替代传统的下采样操作(如池化或步长卷积),以更有效地捕获多标准的信息。focus模块可以资助模型更好地处理差别标准的特征信息,进步目标检测的精确性和服从。
        首先focus模块通常由两部门组成,即切片(Slice)和连接(Concatenate)操作,如图2所示。在切片操作中,输入的特征图被程度或垂直分割成多个子特征图,然后这些子特征图经过一系列的卷积操作后再通过连接操作合并为一个输出特征图。
                             https://img-blog.csdnimg.cn/direct/27ff53a1020d4f7ea5722e6e1eeda05a.png
图2     Focus层
        通过在输入特征图上进行分组处理,focus模块可以显著淘汰计算量,因为每个子特征图的尺寸较小,从而降低了计算复杂度。并且有助于捕获差别标准的信息,使模型更具鲁棒性,能够更好地顺应差别巨细和外形的目标。
        以yolov5为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,终极变成320 × 320 × 32的特征图。切片操作如下:
https://img-blog.csdnimg.cn/direct/0534e38890774f9ab3e317d216e98406.png
图3     Focus原理 
详细的代码实现如下: 
https://img-blog.csdnimg.cn/direct/52de361a6d3b4583a8f579002113da3f.png
图4   Focus层代码实现 
        从代码中可以看出,在切片完成后,进行了concat操作,使每个slice切片的合并成一个,然后经过卷积操作终极得到必要的输出。
-------增补:concat是通道数的增加,也就是说描述图像自己的特征数(通道数)增加了,而每一特征下的信息是没有增加;横向或纵向空间上的叠加。相称于把每个块堆叠起来,只增加特征的通道数,而不会对图像特征自己做改变。
2. CSP1_X  and  CSP2_X

        CSP1_X和CSP2_X的网络结构图如下所示:
https://img-blog.csdnimg.cn/direct/f4fd73f034434bceacfcf874a4332943.pnghttps://img-blog.csdnimg.cn/direct/5cda367f089c404db6f4e10fd9dc09ad.png
图5  C3层 
         CSP1_X 由 CSPNet 演变而来,该模块由 CBL 模块、Res unit、Conv、另有 Concate 组成,其中X代表有X个这个模块。CSP2_X 也是由 CSPNet 网络组成,该模块由 Conv 和 X个 CBL模块而成。这个也被称为C3模块,3的含义是它有三个卷积层。
        如下图,C3模块输入为BCHW,左右两路分别通过卷积后,通道数变为原来的一半,因为c=C/2,然后右路又经过BottleNeck层,在BottleNet层中,有两种形式,BottleNet1就是类似于Resnet先做两次卷积操作后,然后做了add操作。BottleNet2直接进行两次卷积。不管是哪种形式,因为是卷积核的巨细是1x1,而且c=c,所以输入和输出是一样的。
                https://img-blog.csdnimg.cn/direct/9320205691384393b4eb3d0c9db69a86.pnghttps://img-blog.csdnimg.cn/direct/be991af9977c4e9082a198b51e129df2.png
图6    C3模块 
        在BottleNet层结束后,进行一次concat操作,使得通道数翻倍,终极实现了输入的BCHW等于输出的BCHW。这里增补一下,add操作和concat操作的区别:
(1)concat是通道数的增加,也就是说描述图像自己的特征数(通道数)增加了,而每一特征下的信息是没有增加;横向或纵向空间上的叠加
(2)add为简单的像素叠加,是描述图像的特征下的信息量增多了,但是描述图像的维度自己并没有增加,只是每一维下的信息量在增加
如下图:
https://img-blog.csdnimg.cn/direct/e5d00adf12cb4f34b9842f8e55321fca.png
图7    concat和add 
add只是对两张图上的特征点进行了 操作,改变了图像的像素点对应的特征;而concat单纯的是一种堆叠举动,把两个输入堆叠成一个,因此输出图像的通道数会翻倍。
3.  SPP层

        在 YOLOv5 中,SPP(Spatial Pyramid Pooling)层是一种用于增强目标检测网络性能的关键技术。SPP 层的重要作用是在差别标准上对输入特征图进行空间金字塔池化操作,从而使网络能够更好地捕获多标准的信息,进步检测精度。
        SPP 层的作用是通过空间金字塔池化操作,从差别标准下提取特征,使得网络可以在差别标准上对目标进行检测,进步检测性能。SPP 层的结构包罗一个金字塔池化层和一个全连接层,如下图所示。金字塔池化层将输入特征图分别进行差别标准的池化操作,比方最大池化,然后将这些差别标准的特征图连接在一起。全连接层通常用于淘汰维度并提取更高级的特征。
https://img-blog.csdnimg.cn/direct/3737c604ad8b491886203063f49047d0.png
图8   SPP层 

[*] 多标准特征:通过 SPP 层,网络可以在差别的感受野下提取特征,从而克服固定感受野巨细的限定,进步模型对各种标准目标的检测能力。
[*] 淘汰参数量:SPP 层可以淘汰网络参数数量,因为它可以在差别标准上共享权重,从而淘汰模型的复杂度。
[*] 适用性:SPP 层通常应用在深度卷积神经网络中,特别是在目标检测任务中,以进步检测精确性和多标准检测性能。
总的来说,SPP 层在 YOLOv5 中被广泛应用,通过空间金字塔池化操作,有助于增强网络对多标准信息的敏感性,进步目标检测的精度和鲁棒性。
YoloV5的部门细节就讲完啦,更多细节不再做过多赘述,因为我们的主题是yolov5-Lite
二、YoloV5-Lite概述

        yoloV5-Lite是国内大佬ppogg在2021年做毕设消融实验创造出来的,源码地点:https://github.com/ppogg/YOLOv5-Lite,前言中也讲过,我也对比过其他轻量化网络,速度兼容精度yolov5-Lite是最好的,当然也只针对于我的项目,项目目标检测任务比较简单,种别数只有两个,且数据集不敷巨大,因此yolov5-Lite是很恰当数据集不足、种别数不多的情况的,而且ppogg的初衷就是能够部署在树莓派这种算力很低的装备上。下面先上图(原来想白嫖,找了一圈,只有一篇博文有图,但是有很多错误,因此自己画了一个):
https://img-blog.csdnimg.cn/direct/bda56773b79e449dba521fe47150f5e1.jpeg
图9  Yolov5-Lite网络结构图 
         从图中可看到,团体结构和yolov5是差不多的,最重要的是引入了ShuffleNetV2网络,极大地淘汰了计算量和参数。另有摘除了很多的C3层,淘汰了C3层的利用,因此团体速度有很大的提升。在讲解YoloV5-Lite团体结构前,先必要相识什么是ShuffleNetV2,因此从这里先讲起。
2.1  ShuffleNetV1

https://img-blog.csdnimg.cn/direct/e13b4e80bd01422097b90a2e6544371c.png
图10    ShuffleNetV1论文 
         ShuffleNetV1 是由国产旷视科技团队在 2017年提出的,其原始论文为 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices。ShuffleNetV1 重要在于提出了 Channel Shuffle 的思想,shuffleNet Unit 中全是 Group Conv 以及 DW Conv。  其焦点网络结构图如下:
https://img-blog.csdnimg.cn/direct/8ed8ddfc18d8469abb1d3e500c9b1362.png
图11  ShuffleNetV1网络模块
图中(a)图为ResNet的网络结构图,(b)和(c)为ShuffleNetV1的两个模块,可以看出,作者是基于ResNet做了相干改进,下面就逐一介绍:
2.1.1   channnel Shuffle思想

        在介绍Channel Shuffle思想前,先讲一下什么是组卷积?什么是深度卷积? 组卷积是将输入通道分成若干组,在每一组内进行卷积操作,并将每组的输出连接起来。用图解更轻易明白,如下图:https://img-blog.csdnimg.cn/direct/917c63be513446bcb97a0d892e1bcd22.png
图12   组卷积&深度卷积表示图 
        对于常规卷积,假设输入的卷积核巨细为kxk,Channel为n,经过卷积后,输出的参数量为k*k*Cin*n ;而分组卷积是将输入分为g组,那么卷积核的Channel也会被分为g组,那每组对应输出的卷积参数为多少呢?就是k*k*Cin/g*n/g,对g组进行concat拼接,通道数就变为原来的g倍,那对应的输出必要的参数就是(k*k*Cin/g*n/g)*g,化简之后就是k*k*Cin*n*1/g,可以看到,对比常规卷积,参数量变为了原来的1/g。 当Cin=g,n=Cin时,就是DW卷积。
        在遍及完了什么是组卷积后,我们就可以看看论文中的亮点,Channnel Shuffle思想,  如下图如:https://img-blog.csdnimg.cn/direct/6107a1ed4ceb4217b11d8c32f84668a2.png
    图13  channel shuffle表示图    
 Channel  Shuffle的提出是因为作者在论文中说到:
https://img-blog.csdnimg.cn/direct/cacd35a42fac4eb0a5876288db7324d0.png
图14    ShuffleNetV1论文节选 
大抵意思就是通过GConv之后,每个组之间是没有信息交互的,因此如果经过多次卷积后, 组与组之间的连接会越来越弱,这显然是我们不想看到的,因此,作者就创造了Channel Shuffle思想,Channel Shuffle是指在深度神经网络中对通道(channel)进行重新分列的一种思想。大抵实现就是:假设卷积层有g组,输出有g×n个通道,先将输出通道维数reshape为(g,n),转置,展平,作为下一层的输入(即使两个卷积的组数差别,操作依然有效),下图摘自大佬同济子豪兄,我以为画的很清晰明白,表达了Channel Shuffle的焦点思想。
https://img-blog.csdnimg.cn/direct/59d3dd991d0b4613b8a6cfacf98abc58.png
图15  Channel  Shuffle流程图 
 2.1.2  ShuffleNetV1网络构架

        作者在论文中提到:如下图
                            https://img-blog.csdnimg.cn/direct/b410367cda074bb3ade4b21077e4f4eb.png       https://img-blog.csdnimg.cn/direct/4344afdb1f9c4a2b98e5ce23891a0a39.png
 图16   Resnet网络结构图
标蓝的部门写到,通过效果,我们发现常规的1x1卷积占据了93.4%的内存量,而我们网络中的分组卷积(DWConv)只占了很小的一部门,所以作者就改进了Resnet后,网络结构为:
https://img-blog.csdnimg.cn/direct/15f2028252af4b939fadc85744269479.png
图17    ShuffleNetV1结构图
图中,(a)图为Resnet网络结构图,(b)和(c)为改进后的ShuffleNetV1网络结构图,可以看出作者将1x1的常规卷积换成了 GConv,而且在第一个GConv后又参加了Channel Shuffle操作,(b)和(c)的区别就是(c)中先做了下采样,再concat拼接后保持输入和输出是相同的。
        下图就是ShuffleNetV1的结构计划:
https://img-blog.csdnimg.cn/direct/dba10bcfd8294ed3a31f087735b3b4c3.png
图18    ShuffleNetV1结构计划图 
 从图中可以看出,作者首先对输入进行了卷积和最大池化,进行下采样,输入尺寸变为原来的1/4,在进行一次步长为2的block,然后3次步长为1的block,重复操作,末了通过一个全局池化和全连接层输出特征。论文中还提到了一些注意点,首先就是图18说明末了面一段话:
https://img-blog.csdnimg.cn/direct/7b493e9196cb46c7afe3cc537704b311.png
图19    ShuffleNetV1论文相干  
这句话的意思就是对于第一个stage2的第一个卷积,我们不进行组卷积操作,而是利用常规卷积Conv,因为第一个stage2的输入Channel只有24,没必要进行组卷积,组卷积的作用之前也讲过就是对差别通道进行融合从而打乱数据,但是如果通道数相对过少,就不消利用。
其二就是作者在这段话中提到:https://img-blog.csdnimg.cn/direct/cd2f6808819f493daa8bb2f522dbbdef.png
图20    ShuffleNetV1论文相干 
第一个block也就是图17的(b)中,作者引用了resnet的思想,在第一个组卷积和第二个组卷积中利用了input/4的Channel巨细,末了一个组卷积恢复为input巨细的Channel,终极输出稳定。对应网络计划图中,如果必要搭建网络的话,就要注意stage2中stride=1的block中第一个和第二个卷积是240/4,也就是Channel数为60。
末了,我们看一下作者对比resnet、resnext和ShuffleNetV1的FLOPs比较:
                                 https://img-blog.csdnimg.cn/direct/3d2949988e1742678352fa516b752afa.png
图21    ShuffleNetV1论文相干  
https://img-blog.csdnimg.cn/direct/e1f0ea2949634725964d7ac6582991fb.png
图22   三者FLOPs对比 
显而易见,ShuffleNetV1的FLOPs是小了很多的。
----------------小提示:关于FLOPs             
   https://img-blog.csdnimg.cn/direct/3d8931d7b37542e8b968e9411a4e43ca.png https://img-blog.csdnimg.cn/direct/ba906262cfe0490a93fbb5c6d0f24ecc.png
图23     FLOPs 
2.2  ShuffleNetV2 

        https://img-blog.csdnimg.cn/direct/97a15b51e6e846c18239fe6d9505073f.png
图24   ShuffleNetV2论文 
        ShuffleNetV2,它是由旷视科技团队在 2018 年提出的,原论文发表在ECCV上。在划一复杂度下,ShuffleNetV2比ShuffleNetV1和MobileNetv2更精确。这篇论文除了提出这个全新的轻量化网络结构以外,还创新性地提出四个重要的实用性原则,并通过实验证明其精确性。
2.2.1  ShuffleNetV2网络结构图

        ShuffleNetV2的网络结构图如下所示
https://img-blog.csdnimg.cn/direct/75cabc13121047679229f459d401b815.png
图25   ShuffleNetV2网络结构图 
图中(a)和(b)为ShuffleNetV1的block,(c)和(d)为ShuffleNetV2的block,可以看出作者还是做了很多改进的,其中分支结构没有变化,(a)和(c)的区别是:①引入了Channel spit(后面会讲);②将1x1GConv的组卷积换作1x1Conv的常规卷积;③将Channel Shuffle移到了末了一步;④concat操作取代and操作 。(b)和(d)的区别是:①将3x3均匀池化换作3x3的深度卷积再接一个1x1的常规卷积;②将1x1GConv的组卷积换作1x1Conv的常规卷积;③将Channel Shuffle移到了末了一步;④将Relu操作移到了末了一个Conv层后面,而并非输出的末了面。那作者为什么要这么操作呢,这就和作者提出的四条高效计划网络准则有关了。。。
2.2.2   四条高效计划网络准则

        作者在文章中提到:
                      https://img-blog.csdnimg.cn/direct/16e0dc8f239a43049280f39c6f24ba46.png
图26   ShuffleNetV2论文 
这两段话总结下来的意思就是: 
第一:应该用直接指标(比方速度)替换间接指标
第二:这些指标应该在目标平台上进行
基于以上,作者提出了矿石横空的四条硬核高效计划网络准则:
https://img-blog.csdnimg.cn/direct/993518942d24474e99c726e084798f33.png图27   四条高效计划网络准则 
G1) Equal channel width minimizes memory access cost (MAC)
       相同通道宽度能够最小化MAC(内存访问本钱)
       作者在前面也说了,衡量网络的指标不能只看FLOPs,而是应该把MAC考虑进去,因此作者给出了如下的不等式:
                                              https://img-blog.csdnimg.cn/direct/bd502e72e48941f1bacf7862a738211e.png
 图28     MAC不等式 
其中,MAC=hw(c1+c2)+c1c2 ,我们可以把它看成三项,其中第一项为hwc1,因为输入的长宽为hw,通道数为c1,所以mac就为这个,输出同理,那后面的c1*c2如何明白呢,这对应的是卷积核的参数消耗,因为对于1x1的卷积核,h*w就是1,所以mac为c1c2。公式中B=h*w*c1*c2,也就是我们的FLOPs;
        那为啥会有这个不等式呢,是根据均值不等式演变而来的,即(c1+c2)/2 ≥ c1c2,带入得
                                    https://img-blog.csdnimg.cn/direct/fe75632310d1452cae4440e42083f4e8.png
图29   MAC不等式 
那不等式相等条件是什么呢,即c1等于c2的时间,所以这也就直接的印证了G1准则。那么,实践是检验真理的唯一标准,作者通过做对比实验,如下图:
https://img-blog.csdnimg.cn/direct/b34aff3d0a6b4ab1bca124ebdc919f3e.png
图30   C1:C2对比实验图 
通过对比实验我们发现,当c1与c2的比值越来越大,不论是在GPU还是在CPU,推理速度都是越来越慢的。

G2) Excessive group convolution increases MAC
       太过的组卷积会增加 MAC
        万变不离MAC,如果将1x1常规卷积变为组卷积GConv,那MAC为多少呢,如下图:
https://img-blog.csdnimg.cn/direct/c36f37dec8084af8bd640e8c0e7ddead.pnghttps://img-blog.csdnimg.cn/direct/6525f39659bb412b9175be43db9d5efe.png
图31   GConv的MAC 
显而易见,必要对输入和输出的Channel数除以g,因为我们分为了g组。当然作者提到了这个假设的前提是FLOPs稳定,而是一旦输入确定,我们的hwc1也是不会变化的;将公式化简后,因为hwc1稳定,B也稳定,因此只有g是随着mac变化而变化的,这也就印证了G2理论。作者也做了对比实验,如下图:
https://img-blog.csdnimg.cn/direct/971b9b4df7684c2a9e6a0f1d94618da9.png
图32   G2对比实验 
从图中可看出,作者对g做了1248四种,其中g=1也就是我们的常规卷积,实验发现,常规卷积是最快的,这也就是为什么最开始网络中看到的将GConv又换作了Conv。
G3) Network fragmentation reduces degree of parallelism
       网络碎片化会降低并行程度
        作者在论文中写道:
https://img-blog.csdnimg.cn/direct/d665eaa89b1c46608cd098e2161b6db5.png
图33  ShuffleNetV2论文 
 作者的大抵意思是网络碎片化程度,这里可以明白为网络的串行结构或者并行结构越多,对算力比较高的装备是不有好的。作者也做了对比实验:如下图
https://img-blog.csdnimg.cn/direct/cba36ded065840a99a9db1fe0d84eb66.pnghttps://img-blog.csdnimg.cn/direct/993978c9efd64453a08a5ed52e863a79.png
图34  G3准则实验对比图 
 对于(a)--(e)的网络,其推理速度在GPU上变化很大,但在CPU上变化幅度就比较小,这个就更加证明白利用更少的组卷积是有利于网络的,因为越多的组卷积,会造成网络的碎片化程度越高。
G4) Element-wise operations are non-negligible
       Element-wise(元素,神经网络中对应的就是张量)操作的影响不可忽略
        论文中提到:
https://img-blog.csdnimg.cn/direct/4a801db114d242ae92330b4451b4f51a.png
 图35  ShuffleNetV2论文相干
 论文中写道,一些有关张量计算的操作也是不可忽视的,比如Relu和分支中的add计算,另有一些
偏置项等。作者也做了对比实验,如下图:
https://img-blog.csdnimg.cn/direct/4a6320bb34b942ca86c706151fb085d6.png
图36   G4准则对比实验 
通过对比实验,可以看出当Relu和short-Cut为no的时间,速度是最快的。这也就是为什么网络中用concat取代add。
2.2.3  ShuffleNetV2总结

末了,作者基于四条准则总结出了如下四点:
①use ”balanced“ convolutions (equal channel width);
②be aware of the cost of using group convolution;
③reduce the degree of fragmentation;
④reduce element-wise operations.
第一点就是利用均衡卷积,通道数要对等
第二点就是制止太过利用GConv
第三点是降低网络的复杂程度
第四点就是降低element-wise的操作

末了,作者对网络的改进做相识释:
https://img-blog.csdnimg.cn/direct/23466009d50a4361a4052a8b98951813.pnghttps://img-blog.csdnimg.cn/direct/cbc03be6ec55409aa578c05c807b50a9.pnghttps://img-blog.csdnimg.cn/direct/474b587ffa174925b418e87c69d1f26c.png
 图37  ShuffleNetV2论文
        第一段写道,input被分别为c-c'和 c'。根据G3,一个分支没有做任何操作,另一个分支输入等于输出,这符合G1准则,用普通卷积替换了组卷积,符合G2准则
        第二段写道,两个分支的做concat操作,保持输入和输出相等,末了利用Channel Shuffle将差别通道进行信息融合。
        第三段写道,在Channel Shuffle之后,and操作被concat替代,relu操作上移到了其中一个分支,不在作用于全局。而且concat,Channel Shuffle和chann spit都在一个单一分支,这个符合g4 
末了,看一下ShuffleNetV2的网络计划图:
https://img-blog.csdnimg.cn/direct/b8774f0e41b544eda0d2adb89ed200a3.png
图38  ShuffleNetV2网络计划图
作者提到对比ShuffleNetNetV1,只有一个差别,就是在全局池化前面加上了一个7x7的卷积层 。
2.3  Yolov5-Lite网络

2.3.1 团体网络构架

https://img-blog.csdnimg.cn/direct/58a676ab387c40759c9fe5a9217f351d.png
图39  Yolov5-Lite网络结构图 
 如上图所示,网络大抵分为backbone、neck和head三部门,其中backbone中沿用了ShuffleNetV2的构架,首先是一个Conv层和最大池化层,进行下采样,然后就是3个stage操作,这个是完全一样的,但是作者ppogg取消了Channel数为1024的Conv层和5x5的全局池化。
        接着就是neck层,其和yolov5是完全一样的,只有一个改进就是将CBL层换成了CBS层,也就是将激活函数由Relu换成了Silu。
        末了就是head层,也是采用了和yolov5一样的输出。
2.3.2   YoloV5-Lite计划理念

对于Yolov5-Lite的计划理念,做了总结就是:
(1)摘除Focus层,制止多次采用slice操作
(2)制止多次利用C3 Leyer以及高通道的C3 Layer淘汰噪音
(3)对yolov5 head进行通道剪枝,剪枝细则参考G1
(4)摘除shufflenetv2 backbone的1024 conv 和 5×5 pooling


至此,关于yolov5、ShuffleNetV2以及YoloV5-Lite的网络结构大概讲完了,作者程度有限,如果有任何错误的地方,渴望大家积极在批评区讨论以便作者及时更正
参考文献:
ppog------YOLOv5-Lite:更轻更快易于部署的YOLOv5
三叔家的猫-----yolov5中的Focus模块的明白
混分巨兽龙某某------基于树莓派4B的YOLOv5-Lite目标检测的移植与部署(含训练教程)
路人贾-----【轻量化网络系列(5)】ShuffleNetV2论文超详细解读 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: YoloV5、ShuffleNetV2、YoloV5-Lite网络概述