MobilenetV1、V2、V3系列详解

Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用,很多算法都会使用其作为backbone提取特征,这一章对Mobilenet系列模型做一个总结。

一、MobilnetV1

        MobilenetV1提出了深度可分离卷积(Depthwise Convolution),它将标准卷积分解成深度卷积以及一个1x1的卷积即逐点卷积,大幅度减少了运算量和参数量。下面看一下普通卷积和深度可分卷积的对比:

普通卷积:

MobilenetV1、V2、V3系列详解_第1张图片 

深度可分离卷积:

DW卷积:对每个输入通道(输入深度)应用一个滤波器

MobilenetV1、V2、V3系列详解_第2张图片

PW卷积:(就是普通的卷积,只不过卷积核的大小为1x1),一个简单的1×1卷积,然后被用来创建一个线性组合的输出的深度层

MobilenetV1、V2、V3系列详解_第3张图片 两种卷积计算量对比:

MobilenetV1、V2、V3系列详解_第4张图片

普通卷积层的特征提取与特征组合一次完成并输出,而深度可分离卷积先用厚度为1的3*3的卷积核(depthwise分层卷积),再用1*1的卷积核(pointwise 卷积)调整通道数,将特征提取与特征组合分开进行。

MobilenetV1、V2、V3系列详解_第5张图片 

mobileNetV1的网络结构如下,前面的卷积层中除了第一层为标准卷积层外,其他都是深度可分离卷积(Conv dw + Conv/s1),卷积后接了一个7*7的平均池化层,之后通过全连接层,最后利用Softmax激活函数将全连接层输出归一化到0-1的一个概率值,根据概率值的高低可以得到图像的分类情况。 

MobilenetV1、V2、V3系列详解_第6张图片

 二、MobileNetV2

mobilenetV2相对于V1的主要优化点为:

  • 倒残差结构:Inverted Residuals
  • Linear Bottlenecks

倒残差结构:        

对于倒残差结构的理解,主要在于对通道数变化(维度变化)的理解。在残差结构中,先使用 1x1 卷积实现降维,再通过 3x3 卷积提取特征,最后使用 1×1 卷积实现升维。这是一个两头大、中间小的沙漏型结构。但在倒残差结构中,先使用 1x1 卷积实现升维,再通过 3x3 的 DW 卷积(逐通道卷积)提取特征,最后使用 1×1 卷积实现降维。调换了降维和升维的顺序,并将 3×3 的标准卷积换为 DW 卷积,呈两头小、中间大的梭型结构。二者比较参见下图:

MobilenetV1、V2、V3系列详解_第7张图片

这里要注意,只有stride=1且输入特征矩阵与输出特征矩阵shape相同时,才有shortcut连接。

  • 残差模块
    (1) 整个过程为 “压缩 - 卷积 - 扩张”,呈沙漏型;
    (2) 卷积操作为:卷积降维 (1×1) - 标准卷积提取特征 (3×3) - 卷积升维 (1×1);
    (3) 统一使用 ReLU 激活函数;
  • 倒残差模块
    (1) 整个过程为 “扩展- 卷积 - 压缩”,呈梭型;
    (2) 卷积操作为:卷积升维 (1×1) - DW卷积提取特征 (3×3) - 卷积降维 (1×1);
    (3) 使用 ReLU6 激活函数和线性激活函数。

 Linear Bottlenecks

线性瓶颈结构,就是末层卷积使用线性激活的瓶颈结构(将 ReLU 函数替换为线性函数),论文中的解释如下图:

下面来看一下mbv2的模型结构:

MobilenetV1、V2、V3系列详解_第8张图片 

三、MobileNetV3

mbv3的主要亮点为:

  • 更新Block(bneck):加入SE模块、更新激活函数
  • 使用NAS搜索参数(Neural Architecture Search)
  • 重新设计耗时层结构:减少第一个卷积层的核数(32->16),更新last-stage

mbv3的bneck如下图:

MobilenetV1、V2、V3系列详解_第9张图片

(NL 代表使用非线性激活函数,并不特指)

SE模块:

在bottlenet结构中加入了SE结构,并且放在了depthwise filter之后,如下图。因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,这样作者发现,即提高了精度,同时还没有增加时间消耗。并且SE结构放在了depthwise之后。实质为引入了一个channel级别的注意力机制,其细节如下:

MobilenetV1、V2、V3系列详解_第10张图片

更新激活函数:

使用h-swish替换swish,swish是谷歌自家的研究成果,颇有点自卖自夸的意思,这次在其基础上,为速度进行了优化。swish与h-swish公式如下所示,由于sigmoid的计算耗时较长,特别是在移动端,这些耗时就会比较明显,所以作者使用ReLU6(x+3)/6来近似替代sigmoid,观察下图可以发现,其实相差不大的。利用ReLU有几点好处,1.可以在任何软硬件平台进行计算,2.量化的时候,它消除了潜在的精度损失,使用h-swish替换swith,在量化模式下回提高大约15%的效率,另外,h-swish在深层网络中更加明显。

MobilenetV1、V2、V3系列详解_第11张图片

重新设计耗时层结构:

(1)减少第一个卷积层的卷积核个数(32—>16),减少卷积核的个数但是准确率没变,计算量反而会降低,检测速度更快

(2)精简Last Stage

将延迟时间减少了7毫秒,这是运行时间的11%,并将操作数量减少了3000万MAdds,几乎没有损失准确性。

MobilenetV1、V2、V3系列详解_第12张图片 (笔者曾经试着在mbv2的模型基础上将last stage参考mbv3的来改动,即将最后的conv放到pooling后面,但是实验结果在笔者的任务上变差了很多。。。所以这里提到的不会损失准确性,笔者保持怀疑态度,大概是和mbv3其他的修改合到一起才能保证不损失精度?)

MobileNetV3-Large 模型结构

MobilenetV1、V2、V3系列详解_第13张图片

NBN是不使用bn层的 SE打钩才使用注意力机制 exp size对应倒残差块刚开始1*1卷积输出的深度 out对应倒残差块最后的深度。

mbv3-small的模型结构:

MobilenetV1、V2、V3系列详解_第14张图片

最后附上原论文实验结果:

MobilenetV1、V2、V3系列详解_第15张图片写在最后

 虽然论文中的结果,mbv3比mbv2在速度和效果上都要好,但是在笔者的一个任务中表现却并非如此,mbv3的模型初始化时间和推理时间比v2都要慢一些(分析过程见:端侧模型性能优化——Flops与访存量的坑_Turned_MZ的博客-CSDN博客),至于效果,mbv2也比mbv3好一些,因此在使用这些网络时,还是需要具体任务具体分析。

 

 

 

 

 

你可能感兴趣的:(深度学习-图像相关,深度学习,计算机视觉,cnn,神经网络)