date: 2018/08/05


上一篇文章《RK3399上Tengine平台搭建 | Hey~YaHei!》中在RK3399上搭建了Tengine平台并试运行了MobileNet SSD网络,本文将为你解析MobileNets v1的实现思路。

下边分解过程是按自己理解画的图,如果理解有误欢迎指正~


论文:《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications(2017)


深度向卷积分解(Depthwise Separable Convolution)


基本思路

将普通卷积的过程分解为“滤波”和“组合”两个阶段——

traditional conv1.jpg

如上图,

假设 M 通道输入图 I 大小为 ,经过一个核大小 的卷积层,最终输出一张大小为 的 N 特征图 O


  1. ①阶段为“滤波”阶段,N 个卷积核分别作用在图 I 的每个通道上提取特征,最终输出 N 张大小为 的单通道特征图;
  2. ②阶段为“组合”阶段,N 张特征图堆叠组合起来,得到一张 N 通道的特征图 O


更详细地,①过程还能进一步分解——

traditional conv2.jpg


如上图,将①阶段进一步细分为 Ⅰ 到 Ⅳ 四个子阶段,


  1. Ⅰ 阶段,将原图 I按通道分离成 的 M 张单通道图;
  2. Ⅱ 阶段,用M个卷积核 对各个单通道图提取特征,分别得到一张大小为 的单通道特征图;
  3. Ⅲ 阶段,对 Ⅱ 阶段输出的 M 张单通道特征图按通道堆叠起来然后“拍扁”(沿通道方向作加法操作),得到原图在该卷积核作用下的最终输出
  4. Ⅳ 阶段,用另外 N-1 个卷积核重复 Ⅱ 、 Ⅲ 阶段,得到 N 张大小为 的单通道特征图


可以看到,传统的卷积中用 N 个不同的卷积核不厌其烦地对原图进行特征提取来得到 N 通道的输出,这其中必定从原图中提取到了大量的重复特征。有没有可能只用单个卷积核来做特征提取,最后依旧能输出多通道的特征图呢?这就是深度向卷积分解的核心思想。

观察①阶段中的第三个子阶段,该阶段将多张单通道特征图按通道堆叠起来之后“拍扁”,如果去掉这个“拍扁”的过程,其实就可以提取得到一张 M 通道的特征图啦,再经过一个M 维空间到 N 维空间的线性映射,就能够和普通的卷积操作一样得到一张 N 通道的特征图 O。完整的卷积过程如下图所示——

depthwise conv.jpg


  1. 滤波Depthwise Convolution
    ①、②阶段与传统卷积①阶段的前两个阶段完全相同,③阶段比传统卷积①阶段的第三个阶段少了一个“拍扁”的过程,直接堆叠形成一张 M 通道的特征图;
  2. 组合Pointwise Convolution
    ④阶段用 N 个 卷积核将特征图从 M 维空间线性映射到 N 维空间上


效率比较


假设 M通道输入图 I 大小为 ,经过一个核大小 的卷积层,最终输出一张大小为 的 N 特征图 O


对于普通的卷积操作,



对于深度向分解后的卷积操作,



总的来说,参数数量和乘加操作的运算量均下降为原来的 ,通常使用 的卷积核,也就是下降为原来的九分之一到八分之一左右。而从论文的实验部分来看,准确率也只有极小的下降。

dw_vs_full.png


模型结构


v1_body_architecture.png


dw_vs_full_train.png

resource.png


训练细节



本文介绍了MobileNets v1的主要思想——Depthwise Separable Convolution以及网络的完整结构,其实这一思想也不是MobileNet首创,在MobileNets v1之前Xception就已经提出这种思路。此外,MobileNets v1还是只是一个传统的结构,而且没有像Xception一样去RELU来避免卷积后通道下降非线性单元对特征信息造成的损失,在今年Google新发的MobileNets v2就分析和缓解这一问题,并且引入了类似ResNet的shortcut设计。


但,我们还是先一步步解剖好chuanqi305的MobileNets-SSD网络,所以暂时不就MobileNets v2的设计展开讨论,下篇文章将继续讨论目标检测框架SSD的设计——《SSD框架解析 | Hey~YaHei!》。