本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet,ShuffleNet,EifficientNet,Vision Transformer,Swin Transformer,Visual Attention Network,ConvNeXt, MLP-Mixer,As-MLP,ConvMixer,MetaFormer
MobileNet 系列文章目录
前言
MobileNet系列是由谷歌公司的Andrew G. Howard等人于2016年提出的轻量级网络结构,并于2017年发布在arXiv上。MobileNet系列的特点是模型小、计算速度快,适合部署到移动端或者嵌入式系统中。相较于后期的巨型、难以训练的模型(如Transformer),MobileNet系列在卷积神经网络中是轻量级网络的经典。MobileNet对嵌入式设备非常友好。原作者团队后续对模型进行了进一步改进,先后提出了MobileNet V2和MobileNet V3版本,与GoogLeNet类似,MobileNet也是一系列文章。
MobileNet V1:https://arxiv.org/abs/1704.04861
MobileNet V2:https://arxiv.org/pdf/1801.04381
MobileNet V3:https://arxiv.org/abs/1905.02244
视频讲解:https://www.aideeplearning.cn/mcv_lesson/969/
注意:本文引用自Venus AI网站(www.aideeplearning.cn),更多AI知识请参考原站。
一、MobileNetV1
卷积神经网络(Convolutional Neural Networks,CNN),后简称为CNN,已经广泛应用于计算机视觉领域,并且取得了不错的效果。然而近年来CNN在ImageNet竞赛中为了追求更高的分类准确度,模型深度越来越深,模型的深度和复杂度也随之增加,如深度残差网络(ResNet)其层数已经多达152层。然而,在某些真实的应用场景,如移动或者嵌入式设备,如此庞大而复杂的模型是难以被应用的。
首先,这些场景面临内存不足的问题,因为模型过于庞大。其次,这些场景要求低延迟,换而言之就是响应速度要快,想象一下自动驾驶汽车的行人检测系统如果相应速度太慢会发生什么可怕的事情。因此,研究小而高效的CNN模型在这些场景中非常重要。
目前的研究可以归纳为两个方向:第一是对已经训练好的复杂模型进行压缩以得到小型模型,即模型量化;第二是直接设计小型模型并进行训练。无论哪种方法,其目标都是在保持模型准确度(Accuracy)的前提下降低模型参数量(Parameters Size),同时提升模型速度。
本文的主角是MobileNet系列的网络,这是Google最近提出的一种小巧而高效的CNN模型,它在准确度和延时性之间做出了折中。下面将详细介绍MobileNet。
1.深度可分离卷积
MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分。

如上图所示,模型推理中卷积操作占用了大部分的时间,因此MobileNetV1使用了深度可分离卷积对卷积操作做了进一步的优化,具体解释如下:
常规卷积操作
对于5x5x3的输入,如果想要得到3x3x4的feature map,那么卷积核的shape为3x3x3x4;如果padding=1,那么输出的feature map为5x5x4,如下图:

卷积层共4个Filter,每个Filter包含一个通道数为3(与输入信息通道相同),且尺寸为3×3的kernel。因此卷积层的参数数量可以用如下公式来计算(即:卷积核W x 卷积核H x 输入通道数 x 输出通道数):
N_std = 4 × 3 × 3 × 3 = 108
计算量可以用如下公式来计算(即:卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数 x 输出通道数):
C_std =3*3*(5-2)*(5-2)*3*4=972
深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
逐通道卷积(Depthwise Convolution)
Depthwise Convolution的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样,如下图所示:

一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution每个卷积核只负责计算输入信息的某一个通道。卷积核的数量与输入信息的通道数相同。所以一个三通道的图像经过运算后一定是生成了3个Feature map。卷积核的shape即为:(卷积核W x 卷积核H x 输入数据的通道数C)。
此时,卷积部分的参数个数计算如下( 卷积核Wx卷积核Hx输入通道数),即:
N_depthwise = 3 × 3 × 3 = 27
计算量为( 卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数)即:
C_depthwise=3x3x(5-2)x(5-2)x3=243
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法在通道维度上扩展或压缩Feature map的数量。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的features的相关性。简而言之,虽然减少了计算量,但是失去了通道维度上的信息交互。因此需要Pointwise Convolution来将这些Feature maps进行组合生成新的Feature maps。
逐点卷积(Pointwise Convolution)
Pointwise Convolution的运算与常规卷积运算非常相似,其实就是1X1的卷积。它的卷积核的尺寸为 1×1×M,M为上一层输出信息的通道数。所以这里Pointwise Convolution的每个卷积核会将上一步的feature maps在通道方向上进行加权组合,生成新的feature map。有几个卷积核就有几个输出多少个新的feature maps。

由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为(1 x 1 x 输入通道数 x 输出通道数):
N_pointwise = 1 × 1 × 3 × 4 = 12
计算量则为(1 x 1 特征层W x 特征层H x 输入通道数 x 输出通道数):
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
经过Pointwise Convolution之后,由四个卷积核输出了4张Feature map,与常规卷积的输出维度相同。
参数对比
回顾一下,常规卷积的参数个数为:
N_std = 4 × 3 × 3 × 3 = 108
Depthwise Separable Convolution的参数由两部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39
相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Depthwise Separable Convolution的神经网络层数可以做的更深。
计算量对比
回顾一下,常规卷积的计算量为:
C_std =33(5-2)*(5-2)34=972
Depthwise Separable Convolution的参数由两部分相加得到:
C_depthwise=3x3x(5-2)x(5-2)x3=243
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
C_separable = C_depthwise + C_pointwise = 351
相同的输入,同样是得到4张Feature map,Separable Convolution的计算量也是常规卷积的约1/3。因此,在计算量相同的情况下,Depthwise Separable Convolution可以将神经网络层数可以做的更深。
2.MBconv
前面讲述了depthwise separable convolution,这是MobileNet的基本操作,但是在真正应用中会加入batchnorm,并使用ReLU激活函数,所以depthwise separable convolution的基本结构如下图右面所示, 左面是正常的conv:

整体网络就是通过不断堆叠MBconv组件组成的,这种深度可分离卷积的操作方式在减少计算量的同时保持了模型的表达能力。
3.Model Architecture
MobileNet的网络结构如表1所示。首先是一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2进行down sampling。经过 卷积提取特征后再采用average pooling将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。