一文看遍mobilenet,毫无疑问,移动端的轻量级网络中mobienet肯定是首当其冲,从v1-v3,有着相当的提升和改进,但究其核心,最主要的还是引入了深度可分离卷积的计算,确实很有代表性,不过在v3中引入了NAS,这就比较玄学了,v3我没有直接复现过,只玩过基于它实现的目标检测网络,v3的yolov3我记得可以在voc上做到74%左右,效果挺好的,v1和v2的目标检测网络,比如mobilenet-ssd、mobilenet-yolo在部署的时候的确相当轻量化,尤其是当年mobilenetv1-ssd结合tensorflow的object-detection api来做,可以同时完成模型缩放和量化,模型大小只有几M,非常轻量化,本文详细解读mobilenetv1-v3的技术要点和变化,但不按照论文的结构和格式来叙述。
code:本文不提供code,详见各个框架的backbone
1、mobilenet-v1
paper:https://arxiv.org/pdf/1704.04861.pdf
v1中创新式的提出了构建mobilenet的核心层,称之为深度可分离卷积(depthwise separable filters),为整个mobilenet系列奠定了基础。
depthwise separable convolutionds是分解卷积的一种形式,可以将其拆解为深度卷积和点卷积(1*1卷积),如下图所示:
如上图所示,图a代表着Dk*Dk*M的conv layer,我们将其拆分为图b和图c两个卷积,这样得到的输出维度是一致的,但计算量和模型大小却明显得到减少,具体原理如下:
一个标准的卷积输入Batch*Df*Df*M的特征图,其中Df是输入特征图的宽度和高度,M是输入通道,假定输出特征图为Batch*Df*Df*N,N为输出通道。那么,对于标准卷积的计算量为:
Batch*Df*Df*M*N*Dk*Dk
怎么理解标准卷积计算量?简单说一下,可以理解为Df*Df的特征图与Dk*Dk的卷积进行计算,计算量为Df*Df*Dk*Dk,输入特征图有M个通道,对应卷积核也有M个输入通道,则由M个Df*Df的特征图与Dk*Dk卷积进行计算,则此时计算量为Df*Df*Dk*Dk*M,最后,有N个输出通道,则再将上一步的计算重复N次,最终计算量就变成了Df*Df*M*N*Dk*Dk。
拆分后,depthwise conv的计算量为:Batch*Df*Df*Dk*Dk*M,这里要注意一下,拆分后,卷积相乘时维度是对不上的,因此其实depthwish卷积是对每个输入通道单独使用1个卷积核来处理,并且结果不累加(常规卷积会累加输入通道的结果变成一个通道输出),那么此时输出特征维度依旧为batch*Df*Df*M。
进一步的,中间输出特征图再与点卷积相乘,此时的计算量为batch*Df*Df*M*N,输出特征维度为batch*Dk*Dk*N。
此时,计算量对比如下:
上面为mobilenet v1提出来的depthwise separable 卷积,下面是mobilenet v1的网络结构(注意:深度卷积只是起到了常规卷积的作用,但并不是直接替换常规卷积就能够跟常规卷积一样的效果,同样需要依赖于特定的网络结构,举例:darknet53如果你直接替换为depthwise separable darknet53,网络是不会收敛的!!!!)