之前实习用过太多次mobilenet_ssd,但是一直只是用,没有去了解它的原理。今日参考了一位大神的博客,写得很详细,也很容易懂,这里做一个自己的整理,供自己理解,也欢迎大家讨论。

先整理MobileNet
这里奉上大神的博客地址:https://blog.csdn.net/u013082989/article/details/77970196
论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
caffe版mobilenet:Caffe Implementation of Google’s MobileNets (v1 and v2)

1:mobilenet主要是为了适用于移动端而提出的一种轻量级深度网络模型。主要使用了深度可分离卷积Depthwise Separable Convolution将标准卷积核进行分解计算,减少了计算量
2:引入了两个超参数来减少参数量和计算量

  • 宽度乘数(Width Multiplier):减少输入输出的channels
  • 分辨率乘数(Resolution Multiplier):减少输入输出的feature map的大小

3:深度可分离卷积是将一个标准的卷积核分成深度卷积核和1x1的点卷积核,假设输入为M个通道的feature map,卷积核大小为 DKDK D K ∗ D K <script type="math/tex" id="MathJax-Element-7510">D_K *D_K</script>,输出通道为N,那么标准卷积核即为 MDKDKN M ∗ D K ∗ D K ∗ N <script type="math/tex" id="MathJax-Element-7511">M * D_K * D_K * N</script>。例如,输入feature map 为 mn16 m ∗ n ∗ 16 <script type="math/tex" id="MathJax-Element-7512">m * n * 16</script>,想输出32通道,那么卷积核应为 163332 16 ∗ 3 ∗ 3 ∗ 32 <script type="math/tex" id="MathJax-Element-7513">16 * 3 * 3 *32</script>,则可以分解为深度卷积: 1633 16 ∗ 3 ∗ 3 <script type="math/tex" id="MathJax-Element-7514">16 * 3 * 3</script>得到的是16通道的特征图谱。点卷积为 161132 16 ∗ 1 ∗ 1 ∗ 32 <script type="math/tex" id="MathJax-Element-7515">16 * 1 * 1 * 32</script>,如果用标准卷积,则计算量为: mn163332=mn4608 m ∗ n ∗ 16 ∗ 3 ∗ 3 ∗ 32 = m ∗ n ∗ 4608 <script type="math/tex" id="MathJax-Element-7516">m * n * 16 * 3 * 3 * 32 = m * n * 4608</script>。用深度可分解卷积之后的计算量为 mn1633+mn161132=mn656 m ∗ n ∗ 16 ∗ 3 ∗ 3 + m ∗ n ∗ 16 ∗ 1 ∗ 1 ∗ 32 = m ∗ n ∗ 656 <script type="math/tex" id="MathJax-Element-7517">m * n * 16 * 3 * 3 + m * n * 16 * 1 * 1 * 32 = m * n * 656</script>

4:所以和标准卷积核相比计算量比率为: DkDkDfDfM+DfDfMNDkDkMNDfDf=1N+1Dk2 D k ∗ D k ∗ D f ∗ D f ∗ M + D f ∗ D f ∗ M ∗ N D k ∗ D k ∗ M ∗ N ∗ D f ∗ D f = 1 N + 1 D k 2 <script type="math/tex" id="MathJax-Element-7518">\frac{D_k * D_k * D_f * D_f * M + D_f * D_f * M * N}{D_k * D_k * M * N * D_f * D_f} = \frac{1}{N} + \frac{1}{{D_{k}}^{2}}</script>

5:深度可分解卷积操作示意图如下:
第一步深度卷积操作是在输入的每个channel上进行卷积操作
第二步逐点卷积才是结合起来

6:mobilenet共28层(深度卷积和点卷积单独算一层),每层后边都跟有batchnorm层 和relu层
这里写图片描述
这里写图片描述

7:引入宽度乘数和分辨率乘数两个超参数,
宽度乘数 α α <script type="math/tex" id="MathJax-Element-7519">\alpha </script>主要用于减少channels,即即输入层的channels个数 M M <script type="math/tex" id="MathJax-Element-7520">M</script>,变成αM<script type="math/tex" id="MathJax-Element-7521">\alpha M</script>,输出层的channels个数 N N <script type="math/tex" id="MathJax-Element-7522">N</script>变成了αN<script type="math/tex" id="MathJax-Element-7523">\alpha N</script>
所以引入宽度乘数后的总的计算量是: DkDkαMDFDF+αMαNDFDF D k ⋅ D k ⋅ α M ⋅ D F ⋅ D F + α M ⋅ α N ⋅ D F ⋅ D F <script type="math/tex" id="MathJax-Element-7524">D_k⋅D_k⋅\alpha M⋅D_F⋅D_F+\alpha M⋅\alpha N⋅D_F⋅D_F</script>

分辨率乘数 ρ ρ <script type="math/tex" id="MathJax-Element-7525">\rho</script>主要用于降低图片的分辨率,即作用在feature map 上
所以引入分辨率乘数后的总的计算量为: DkDkαMρDFρDF+αMαNρDFρDF D k ⋅ D k ⋅ α M ⋅ ρ D F ⋅ ρ D F + α M ⋅ α N ⋅ ρ D F ⋅ ρ D F <script type="math/tex" id="MathJax-Element-7526">D_k⋅D_k⋅\alpha M⋅\rho D_F⋅\rho D_F+\alpha M⋅\alpha N⋅\rho D_F⋅\rho D_F</script>

在看看MobileNet_ssd
mobilenet_ssd caffe模型可视化地址:MobileNet_ssd
可以看出,conv13是骨干网络的最后一层,作者仿照VGG-SSD的结构,在Mobilenet的conv13后面添加了8个卷积层,然后总共抽取6层用作检测,貌似没有使用分辨率为38*38的层,可能是位置太靠前了吧。
提取默认框的6层为conv11, conv13, conv14_2, conv15_2, conv16_2, conv17_2,该6层feature map 每个cell产生的默认框个数分别为3,6,6,6,6,6。也就是说在那6层的后边接的用于坐标回归的3*3的卷积核(层名为conv11_mbox_loc……)的输出个数(num output)分别为12,24,24,24,24,24,24。用于坐标回归 查看输出个数

那6层后边接的用于类别得分的3*3卷积核(层名为conv11_mbox_conf……)的输出个数为3*21(类别为21类,3个默认框) = 63,126, 126, 126, 126, 126。用于输出类别得分 输出个数

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐