第七章 MobileNetv2网络详解

系列文章目录

第一章 AlexNet网络详解

第二章 VGG网络详解

第三章 GoogLeNet网络详解 

第四章 ResNet网络详解 

第五章 ResNeXt网络详解 

第六章 MobileNetv1网络详解 

第七章 MobileNetv2网络详解 

第八章 MobileNetv3网络详解 

第九章 ShuffleNetv1网络详解 

第十章 ShuffleNetv2网络详解 

第十一章 EfficientNetv1网络详解 

第十二章 EfficientNetv2网络详解 

第十三章 Transformer注意力机制

第十四章 Vision Transformer网络详解 

第十五章 Swin-Transformer网络详解 

第十六章 ConvNeXt网络详解 

第十七章 RepVGG网络详解 

第十八章 MobileViT网络详解 


文章目录

  •  MobileNetv2网络详解
  • 0. 前言
  • 1. 摘要
  • 2.   MobileNetv2网络详解网络架构
    • 1.  MobileNetv2_Model.py(pytorch实现)
    • 2.
  • 总结


0、前言


1、摘要

        在这篇论文中,我们描述了一种新的移动架构MobileNetV2,它在多项任务和基准测试中改善了移动模型的最新性能,并跨越了不同模型大小的整个谱系。我们还介绍了在一个我们称之为SSDLite的新的框架中应用这些移动模型到目标检测的高效方法。此外,我们通过一种我们称之为Mobile DeepLabv3的DeepLabv3简化形式,展示了如何构建移动语义分割模型。MobileNetV2基于一个反向残差结构,其中快捷连接位于瘦瓶颈层之间。中间的扩展层使用轻量级深度可分离卷积来过滤特征作为非线性性的来源。此外,我们发现在窄层中去除非线性很重要,以保持表现力。我们展示了这种方法提高了性能,并提供了导致这种设计的直觉。最后,我们的方法允许从转换的表达能力中解耦输入/输出域,从而提供了一个方便的框架进行进一步的分析。我们在ImageNet [1]分类、COCO目标检测[2]和VOC图像分割[3]上测量了我们的性能。我们评估了准确性、乘加(MAdd)操作数量、实际延迟和参数数量之间的权衡。

2、MobileNetv2网络结构

神经网络已经彻底改变了机器智能领域的许多方面,使得能够实现在具有挑战性的图像识别任务中非凡的准确率。但是,为了提高准确率,往往需要付出代价:现代最先进的网络需要高强度的计算资源,而这些资源超出了许多移动和嵌入式应用程序所能承受的能力。本文给出了一种专门为移动及资源受限环境量身定制的新型神经网络结构。我们的网络通过显著减少操作和内存的数量来保持相同的准确性,推动了移动定制计算机视觉模型的最新技术。我们的主要贡献是一种新型的层模块:具有线性瓶颈的反向残差。该模块以低维压缩表示为输入,首先扩展到高维并使用轻量级深度卷积进行过滤。随后,将特征投影回到具有线性卷积的低维表示中。该模块可使用现代框架中的标准操作进行有效实现,并允许我们的模型在多个性能点上击败最先进的标准基准测试。此外,该卷积模块特别适用于移动设计,因为它允许在推理期间显着减少大型中间张量所需的存储器占用。这减少了许多嵌入式硬件设计中需要主存储器访问的需求,从而提供了小量的非常快速的软件控制缓存存储。

调整深度神经网络结构,在准确性和性能之间达到最佳平衡已成为近几年活跃研究领域。许多团队进行的人工结构搜索和训练算法的改进,使得网络性能有了大幅提升,超越了早期设计如AlexNet[5]、VGGNet[6]、GoogLeNet[7]和ResNet[8]。最近在算法结构探索方面取得了诸多进展,包括超参数优化[9,10,11],网络剪枝[12,13,14,15,16,17]和连接学习[18,19]等不同方法,还有一定数量的工作致力于改变内部卷积块的连接结构,如ShuffleNet[20],引入稀疏性[21]和其他方法[22]。最近,[23,24,25,26]开创了一种将遗传算法和强化学习等优化方法引入到网络结构搜索中的新方向,但其缺点是得到的网络变得非常复杂。本文的目标是发展更好的直觉,了解神经网络的运作方式,并利用这一方法设计最简单的网络结构。我们的方法与[23]和相关工作相辅相成,在此基础上继续改进性能,同时还可以提供一些有关其内部操作的信息。我们的网络设计基于MobileNetV1[27],保持其简单性,不需要任何特殊操作,但其准确性有了显著提升,在多个移动应用程序的图像分类和检测任务中达到了最先进水平。

Depthwise Separable Convolutions是许多高效神经网络架构的关键构建模块,我们在这项工作中也使用了它们。基本思想是用一个分解版本替换完整的卷积操作,将卷积分成两个独立的层。第一层是深度卷积,它通过对每个输入通道应用单个卷积滤波器来执行轻量级过滤。第二层是1×1卷积,称为点卷积,它负责通过计算输入通道的线性组合来构建新特征。标准卷积将一个hi×wi×di输入张量Li应用于卷积核K2Rk×k×di×dj,以产生一个hi×wi×dj输出张量Lj。标准卷积层的计算成本为hi·wi·di·dj·k·k。深度分离卷积是标准卷积层的替代品。实验证明,它们几乎和常规卷积一样好,但成本仅为:hi·wi·di(k2+dj),这是深度和1×1点卷积的和。实际上,深度可分离卷积与传统层相比减少了计算量,几乎达到了k21的水平。MobileNetV2使用k=3(3×3深度分离卷积),因此计算成本只比标准卷积小8到9倍,而准确性只有微小的降低。

第七章 MobileNetv2网络详解_第1张图片

 (图1:低维流形在高维空间中的ReLU变换实例。在这些例子中,初始螺旋线使用随机矩阵T嵌入到n维空间中,然后使用ReLU进行转换,并使用T-1投影回2D空间。在上面的例子中,n = 2;3会导致信息丢失,其中某些流形点会彼此坍塌,而对于n = 15至30,变换是极非凸的。)

这段话讲了一个由n层Li深层神经网络,每一层都有维度为hi×wi×di的激活张量。在该部分中,我们将讨论这些激活张量的基本特性,将其视为具有hi×wi“像素”和di维度容器。非正式地说,对于一个实际图像的输入集合来说,我们说层激活集合(对于任何层Li)形成了一个“感兴趣的流形”。人们长期以来认为神经网络中的流形可以嵌入到低维度的子空间中。换句话说,当我们查看深度卷积层的所有单个d通道像素时,这些值中所编码的信息实际上位于某个流形中,该流形可以嵌入到低维子空间中。乍一看,我们可以通过简单地减少层的维度来减少操作空间的维度,从而捕捉和利用这样一个事实。MobileNetV1 [27] 成功地利用了这种方法,通过宽度乘数参数有效地权衡了计算和准确性,同时还被纳入其他网络的高效模型设计中。按照这种直觉,宽度乘数方法允许降低激活空间的维度,直到感兴趣的流形跨越整个空间。但是,当我们回想起深度卷积神经网络实际上具有非线性的逐坐标变换,例如ReLU时,这种直觉就会崩溃。例如,ReLU应用于1D空间中的一条线会产生一条“射线”,而在Rn空间中,它通常会产生具有n个接头的分段线性曲线。很容易看出,通常情况下,如果层变换ReLU(Bx)的结果具有非零体积S,则映射到S内部的点是通过输入的线性变换B获得的,这表明与完整维度输出相对应的输入空间部分受到线性变换的限制。换句话说,深度神经网络仍然具有非线性属性。

第七章 MobileNetv2网络详解_第2张图片

(图2:可分离卷积块的演变。对角线的斜纹理表示不包含非线性层的层。最后一个(浅色)层表示下一个块的开始。注意:当叠加时,2d和2c是等效的块。最好在彩色视图下查看) 

第七章 MobileNetv2网络详解_第3张图片

(图3:残差块[8,30]和反向残差之间的差异。斜纹填充的层不使用非线性。我们使用每个块的厚度来表示其相对通道数。请注意,经典残差连接具有高通道数的层,而反向残差连接瓶颈。最好在彩色环境中查看) 

简述:我们总结了两个特性,表明感兴趣流形应该位于高维激活空间的低维子空间中:1、如果感兴趣的流形在 ReLU 转换后仍保持非零体积,则对应线性变换;2、ReLU 能够保留输入流形的全部信息,但前提是输入流形位于输入空间的低维子空间中。这两个洞见为我们优化现有神经架构提供了实证提示:假设感兴趣的流形是低维的,我们可以通过在卷积块中插入线性瓶颈层来捕捉这一点。实验证据表明,使用线性层至关重要,因为它可以防止非线性破坏过多信息。在第6节中,我们通过实验证明,在瓶颈中使用非线性层确实会导致性能下降数个百分点,从而进一步验证了我们的假设。我们注意到,在 [29]中,有相似的报告,其中非线性被从传统残余块的输入中删除,这导致在 CIFAR 数据集上的性能提高。本文余下部分将利用瓶颈卷积。我们将把输入瓶颈大小与内部大小之比称为扩展比率。

瓶颈块与残差块相似,每个块包含输入,后面跟随几个瓶颈,然后是扩展层[8]。然而,受到瓶颈实际上包含所有必要信息的启示,而扩展层仅作为伴随着张量的非线性转换的具体实现细节,我们直接在瓶颈之间使用捷径。图3提供了两种设计差异的示意图。插入捷径的动机与传统残差连接的动机类似:我们想提高渐变在乘法层之间传播的能力。然而,倒置设计在内存效率方面明显更高效(详见第5节),在我们的实验中也稍微更好。瓶颈卷积的运行时间和参数计数基本实现结构如表1所示。对于大小为h×w,扩展因子为t,核大小为k,d0输入通道和d00输出通道的块,所需的总乘法加法数量为h ·w·d0·t(d0 +k2 +d00)。与(1)相比,此表达式具有额外的项,因为我们确实有一个额外的1×1卷积,但我们网络的性质使我们能够利用更小的输入和输出维度。在表3中,我们比较了MobileNetV1、MobileNetV2和ShuffleNet之间各个解析度所需的大小。

我们的架构具有一个有趣的属性,即在瓶颈层(建筑块)的输入/输出域和层变换之间提供了自然分离。层变换是将输入转换为输出的非线性函数,而前者可以被视为网络在每一层的容量,而后者则是表达力。这与传统的卷积块(常规和可分离)形成对比,其中表达能力和容量都相互交织,并且是输出层深度的函数。特别地,在我们的情况下,当内层深度为零时,底层卷积是恒等函数,这要归功于快捷连接。当扩张比小于1时,这是一个经典的残差卷积块[8,30]。然而,为了我们的目的,我们展示了扩张比大于1是最有用的。这种解释使我们能够将网络的表达能力和容量分开研究,我们相信进一步探索这种分离是必要的,以提供更好地了解网络属性的方法。

1瓶颈残差块,将k通道转换为k0通道,步幅为s,并且扩展因子为t

Table 1:Bottleneck residual block transforming from k to k0 channels,with stride s,and expansion factor t.

输入

操作

输出

h × w × k

1 × 1 Conv2d, ReLU6

h × w × tk

h × w × tk

3 × 3 dwise s=s, ReLU6

h/s × w/s × tk

h/s × w/s × tk

Linear 1 × 1 conv2d

h/s × w/s × k’

第七章 MobileNetv2网络详解_第4张图片

现在我们详细描述我们的架构。如前一节所讨论的,基本构建块是一种具有残差的瓶颈深度可分离卷积。该块的详细结构在表1中显示。MobileNetV2的架构包含具有32个过滤器的初始完全卷积层,后跟在表2中描述的19个残余瓶颈层。我们使用ReLU6作为非线性,因为它在低精度计算中具有鲁棒性。我们始终使用核大小3×3,这是现代网络的标准,并在训练过程中利用丢弃和批量归一化。除了第一层外,我们在整个网络中使用恒定的扩展率。我们的实验发现,扩展率在5和10之间的结果几乎相同,较小的网络使用稍小的扩展率更好,而较大的网络使用稍大的扩展率具有稍好的性能。对于所有主要实验,我们使用扩展因子6应用于输入张量的大小。例如,对于一个接受64通道输入张量并产生一个具有128个通道的张量的瓶颈层,中间扩展层就是64·6 = 384个通道。

 在[27]中,我们采用可调节的超参数,如输入图像分辨率和宽度乘数,以便根据所需的准确性/性能权衡来调整不同性能点的架构。我们的主要网络(宽度乘数为1,224×224)具有3亿次乘加计算成本,并使用340万个参数。我们探讨了输入分辨率从96到224,宽度乘数从0.35到1.4的性能权衡。网络计算成本范围从7次乘法加法到585M乘法加法,而模型大小在1.7M和6.9M参数之间变化。与[27]的一个小型实现差别在于,对于小于1的乘数,我们将宽度乘以除最后一个卷积层之外的所有层。这提高了较小模型的性能。

倒置余量瓶颈层允许特别具有内存效率的实现,这对于移动应用非常重要。一个标准的高效推断实现,例如使用TensorFlow [31]或Caffe [32],构建了一个有向无环计算超图G,其中边表示操作,节点表示中间计算的张量。计算被安排以最小化需要存储在内存中的张量的总数。在最一般的情况下,它搜索所有可行的计算顺序Σ(G),并选择最小化M(G)=min π2Σ(G)max i21::n 24 X A2R(i;π;G)jAj 35 +size(πi)的顺序,其中R(i;π;G)是连接到任何πi:::πn节点的中间张量的列表,jAj表示张量A的大小,size(i)是在操作i期间需要的内部存储的总量。对于只有微不足道的并行结构(例如剩余连接)的图来说,只有一个非平凡的可行计算顺序,因此可以简化计算图G推断所需的总存储量和边界:M(G)=max 2G op2G 24 X A2opinp jAj +X B2opout jBj +jopj 35(2)或者重新说明,内存量只是组合所有操作的输入和输出的最大总大小。接下来我们将展示,如果将瓶颈残差块视为单个操作(并视内部卷积为一次性张量),那么内存总量将由瓶颈张量的大小主导,而不是由内部瓶颈的张量的大小主导(而且更大)。

瓶颈残差块是指一种由线性变换、非线性逐通道变换和另一种线性变换组成的算子,可以表示为 F(x)=[A ◦N ◦B]x,其中 A 和 B 分别是将输入变换到中间表示和从中间表示变换到输出的线性变换,N 是一种逐通道的非线性变换,本文中设为 ReLU6 ◦dwise◦ReLU6。这种算子可以实现低内存占用的计算,只需要在计算过程中保留一个大小为 n=t 的中间块即可。这种方法只适用于内部变换逐通道,且输入大小和输出大小差别不大的情况下。通过对输入进行分块,可以实现低内存占用,但由于增加了 cache misses 的次数,可能会影响运行效率。最适合的分块方式是 t=2 到 t=5。此方法可以利用机器学习框架提供的高度优化的矩阵乘法和卷积运算,但需要注意对缓存未命中所带来的影响。

1瓶颈残差块,将k通道转换为k0通道,步幅为s,并且扩展因子为t

Table 1:Bottleneck residual block transforming from k to k0 channels,with stride s,and expansion factor t.

输入

操作

输出

h × w × k

1 × 1 Conv2d, ReLU6

h × w × tk

h × w × tk

3 × 3 dwise s=s, ReLU6

h/s × w/s × tk

h/s × w/s × tk

Linear 1 × 1 conv2d

h/s × w/s × k’

2 MobileNetV2:每一行描述了一个具有1个或多个相同的(根据步长)层序列,该序列重复n次。同一序列中的所有层具有相同的输出通道数c。每个序列的第一层具有步幅s,其余层步幅为1。所有的空间卷积都使用3×3的内核。扩展系数t始终应用于表1中描述的输入大小。Table 2:MobileNetV2 :Each line describes a sequence of 1 or more identical (modulo stride)layers,repeated n times.All layers in the same sequence have the same number c of output channels.The first layer of each sequence has a stride s and all others use stride 1.All spatial convolutions use 3 ×3 kernels.The expansion factor t is always applied to the input size as described in Table 1.

输入

操作

扩展系数

输出通道数

序列重复次数

步长

224×224×3

Conv2d

-

32

1

2

112×112×32

bottleneck

1

16

1

1

112×112×16

bottleneck

6

24

2

2

56×56×24

bottleneck

6

32

3

2

28×18×32

bottleneck

6

64

4

2

14×14×64

bottleneck

6

96

3

1

14×14×96

bottleneck

6

160

3

2

7×7×160

bottleneck

6

320

1

1

7×7×320

Conv2d 1x1

-

1280

1

1

7×7×1280

Avgpool 7x7

-

-

1

-

1×1×1280

Conv2d 1x1

-

k

-

1

3:不同架构每个空间分辨率需要材料化的最大通道/内存(以Kb为单位)数量。我们假设激活使用16位浮点数。对于ShuffleNet,我们使用2x;g=3MobileNetV1MobileNetV2的性能相匹配。对于MobileNetV2ShuffleNet的第一层,我们可以使用第5节中描述的技巧来减少内存需求。尽管ShuffleNet在其他地方采用瓶颈技术,但由于非瓶颈张量之间存在快捷方式,因此仍需要材料化非瓶颈张量。

Table 3:The max number of channels/memory (in Kb)that needs to be materialized at each spatial res olution for different architectures.We assume 16-bit floats for activations.For ShuffleNet,we use 2x;g =3 that matches the performance of MobileNetV1 and MobileNetV2.For the first layer of MobileNetV2 and ShuffleNet we can employ the trick described in Sec tion 5 to reduce memory requirement.Even though ShuffleNet employs bottlenecks elsewhere,the non bottleneck tensors still need to be materialized due to the presence of shortcuts between the non-bottleneck ten sors.

尺寸

MobileNetV1

MobileNetV2

ShuffleNet(2x,g=3)

112×112

64/160

16/400

32/800

56×56

128/800

32/200

48/300

28×28

256/400

64/100

400/600k

14×14

512/200

160/62

800/310

7×7

1024/199

320/32

1600/156

1×1

1024/2

1280/2

1600/3

max

1600k

400k

600k

本表格描述了不同架构在不同空间分辨率下需要占用的最大通道数和内存量(以KB为单位)。

 第七章 MobileNetv2网络详解_第5张图片

(图4:不同架构的卷积块比较。ShuffleNet使用组卷积[20]和随机打乱,它还使用传统的残差方法,其中内部块比输出更窄。ShuffleNet和NasNet的插图来自各自的论文。) 

第七章 MobileNetv2网络详解_第6张图片

 (图5: MobileNetV2对比MobileNetV1、ShuffleNet、NAS表现曲线。我们的网络采用多种乘数:0.35、0.5、0.75、1.0,用于各种分辨率,224的分辨率增加了1:4。最佳色彩效果。)

第七章 MobileNetv2网络详解_第7张图片

((a)瓶颈层非线性对模型的影响)

 第七章 MobileNetv2网络详解_第8张图片

((b)残差块变化对模型的影响) 

[图6:非线性和各种类型的快捷(残差)连接的影响。]

1. 本文介绍了一种新的移动架构——MobileNetV2,在多个任务和基准测试上改善了移动模型的性能以及不同模型大小的性能表现。

2. 该论文的研究背景是为了提高移动设备上的计算机视觉模型的性能。

3. 该论文的主要论点是介绍一种新的移动架构MobileNetV2,并且通过一个全新的框架SSDLite,有效地将这种模型应用于物体检测,同时提出了移动语义分割模型的构建思想。

4. 过去的研究主要采用传统的残差模型和扩展表示,并且难以在移动设备上实现高性能的人工智能模型。

5. 本文提出了一种基于反向残差结构的MobileNetV2架构,采用轻量级的深度可分离卷积来过滤中间扩展层的特征,并且在狭窄层中移除了非线性,以保持表征能力。

6. 该研究的发现是MobileNetV2架构在多个任务和基准测试上表现良好,并且能够有效地解决移动设备上部署人工智能模型的问题。然而,该研究的局限性是只针对移动设备而非桌面设备等其他类型的计算机设备。

第七章 MobileNetv2网络详解_第9张图片

第七章 MobileNetv2网络详解_第10张图片

目标检测:本文中,我们使用COCO数据集[2]进行修改过的单次检测器(SSD)[34]对MobileNetV2和MobileNetV1进行特征提取器[33]的性能评估和比较。我们还将其与YOLOv2[35]和原始SSD(以VGG-16[6]为基础网络)进行比较。我们不会与其他架构(例如Faster-RCNN[36]和RFCN[37])进行比较,因为我们的重点在于移动/实时模型。SSDLite:在本文中,我们介绍了SSD的移动友好型变体。我们将所有常规卷积替换为可分离卷积(深度相隔再1×1投影)在SSD预测层。这种设计与MobileNets的整体设计一致,并且在计算上更加高效。我们称这个修改版本为SSDLite。与常规SSD相比,SSDLite在参数计数和计算成本方面都有显着降低,如表5所示。对于MobileNetV1,我们遵循[33]中的设置。对于MobileNetV2,SSDLite的第一层附加到第15层的扩展部分(输出步幅为16)。SSDLite的第二层和其余层都附加在最后一层的上方(输出步幅为32)。该设置与MobileNetV1一致,因为所有层都附加到相同输出步幅的特征图上。

4:不同网络在ImageNet上的性能比较。根据惯例,我们统计总乘-加次数。最后一列报告了单个Google Pixel 1手机(使用TF-Lite)的运行时间,以毫秒(ms)为单位。我们没有报告ShuffleNet的数字,因为目前还不支持高效的组卷积和洗牌操作。

Table 4:Performance on ImageNet,comparison for dif ferent networks.As is common practice for ops,we count the total number of Multiply-Adds.In the last column we report running time in milliseconds (ms)for a single large core of the Google Pixel 1 phone (using TF-Lite).We do not report ShuffleNet numbers as effi cient group convolutions and shuffling are not yet sup ported.factor t.

网络

Top-1准确率

参数数量

乘法加法计算量

CPU测试时间

MobileNetV1

70.6

4.2M

575M

113ms

ShuffleNet(1.5)

71.5

3.4M

292M

-

ShuffleNet(x2)

73.7

5.4M

524M

-

NasNet-A

74.0

5.3M

564M

183ms

MobileNetV2

72.0

3.4M

300M

75ms

MobileNetV2(1.4)

74.7

6.9M

585M

143ms

该表格对比了不同网络在ImageNet上的性能表现,其中包括每个网络的Top 1准确率、参数个数、MAdds总数和运行时间(以毫秒为单位)。在MAdds总数中,我们计算了乘法和加法的总量。在最后一列中,我们报告了谷歌Pixel 1手机上单个大核心的运行时间(使用TF-Lite)。我们没有报告ShuffleNet的数据,因为高效的组合卷积和shuffle操作还没有得到支持。MobileNetV1是表格中参数最少、但运行时间最长的网络,而MobileNetV2在这方面则有了明显的优化。NasNet-A是性能最好的网络,它在准确率、参数数量和运行时间方面都是非常优秀的。

5SSDSSDLite配备MobileNetV2进行80种类预测时大小和计算成本的比较。

Table 5:Comparison of the size and the computa tional cost between SSD and SSDLite configured with MobileNetV2 and making predictions for 80 classes.factor t.

参数

乘法加法计算量

SSD

14.8M

1.25B

SSDLite

2.1M

0.35B

在表5中,比较了两种不同的目标检测模型SSDSSDLite的大小和计算成本。这两个模型都配置了MobileNetV2,并经过训练,用于预测80个类别。

深度学习模型的参数是指神经网络中使用的权重和偏差的数量。模型的参数越多,它就越复杂和准确,但也需要更多的计算能力来训练和运行。在表格中,我们可以看到SSD模型有34层和1480万个参数,而SSDLite模型只有210万个参数,表明它要小得多且不太复杂。

MAdds(百万加法)指标是衡量模型计算成本的一种方法。它统计模型在推理期间需要执行的乘积累加操作的数量。在表5中,我们可以看到SSD模型需要12.5亿个MAdds,而SSDLite模型只需要3.5亿个MAdds。这意味着SSDLite模型速度更快,需要更少的计算能力来预测。

总的来说,SSDSSDLite之间的比较表明,虽然SSD模型更复杂和准确,但也需要更多的计算能力来运行。另一方面,SSDLite是一种更简单和更快的模型,为了效率而牺牲了一些准确性。选择两种模型之间的选择取决于用户的特定需求,例如可用的计算资源和所需的准确性水平。

表格6MobileNetV2 +SSDLite和其他实时检测器在COCO数据集的对象检测任务中的表现比较。MobileNetV2 +SSDLite在显著减少参数和计算复杂度的同时,实现了竞争性的准确率。所有模型都是在trainval35k上进行训练,然后在test-dev上进行评估。SSD/YOLOv2的数字来自[35]。在Google Pixel 1手机的大内核上运行时间是使用TF-Lite引擎的内部版本报告的。

Table 6:Performance comparison of MobileNetV2 +SSDLite and other realtime detectors on the COCO dataset object detection task.MobileNetV2 +SSDLite achieves competitive accuracy with significantly fewer parameters and smaller computational complexity.All models are trained on trainval35k and evaluated on test-dev.SSD/YOLOv2 numbers are from [35].The running time is reported for the large core of the Google Pixel 1 phone,using an internal version of the TF-Lite engine

网络

平均精度

参数数量

乘法加法计算量

CPU测试时间

SSD300

23.2

36.1M

35.2B

-

SSD512

26.8

36.1M

99.5 B

-

YOLOv2

21.6

50.7M

17.5 B

-

MnetV1+SDDLite

22.2

5.1M

1.3 B

270ms

MnetV2+SDDLite

22.1

4.3M

0.8 B

200ms

这段文字主要介绍了在COCO数据集的对象检测任务中,MobileNetV2 + SSDLite网络的性能比其他实时检测器具有更少的参数和更小的计算复杂度,同时具有有竞争力的精度。其中,表6列出了不同网络模型的性能比较,包括网络名称、平均准确度、参数数量、乘加次数、CPU使用情况、SSD300/512的指标以及运行时间等。此外,该模型使用Google Pixel 1手机的大核心,并使用TF-Lite引擎的内部版本进行评估。

本节中,我们比较了MobileNetV1MobileNetV2模型作为特征提取器以及DeepLabv3在移动语义分割任务中的性能。DeepLabv3采用了空洞卷积,通过控制特征图分辨率的方式构建了包括空洞空间金字塔池化模块、1×1卷积头以及图像级特征的五个并行头部。对于语义分割,我们通常采用输出步长=168来获取更密集的特征图。我们在带有额外标注图像的PASCAL VOC 2012数据集上进行实验,并采用mIOU评估指标。为了构建一个移动模型,我们尝试了三种设计变化:(1)不同的特征提取器,(2)简化DeepLabv3头部以获得更快的计算速度,以及(3)不同的推理策略来提高性能。我们的结果总结在第7表中。我们发现:(a)推理策略,包括多尺度输入和添加左右翻转图像,显著增加了MAdds,因此不适合用于设备应用;(b)使用输出步长=16比使用输出步长=8更有效;(c)MobileNetV1已经是一个强大的特征提取器,仅需要大约4.9-5.7倍的MAddsResNet-101 [8]更少(例如,mIOU78.56 vs 82.70MAdds941.9B vs 4870.6B);(d)MobileNetV2的次最后特征图上建立DeepLabv3头比在原始的最后一层特征图上建立要更有效,因为次最后特征图包含320个通道而不是1280个,通过这样做,我们可以获得类似的性能,但需要的操作次数要比MobileNetV12.5倍;(e)DeepLabv3头部计算成本高,可以通过简化来移除。

表格7:在PASCAL VOC 2012验证集上使用MobileNet+DeepLabv3推断策略。MNet V2*:使用第二个最后的特征映射作为DeepLabv3 heads,包括(1)扩张空间金字塔池化(ASPP)模块,以及(2)1×1卷积和图像池化特征。OS:输出步幅控制分割图的输出分辨率。MF:测试过程中使用多尺度和左右翻转输入。所有模型都在COCO上进行了预先训练。粗体显示的是适用于设备应用的潜在候选者。PASCAL图像的维度为512×512,扩张卷积可控制输出特征分辨率而不增加参数数量。

Table 7:MobileNet +DeepLabv3 inference strategy on the PASCAL VOC 2012 validation set.MNet V2*:Second last feature map is used for DeepLabv3 heads,which includes (1)Atrous Spatial Pyramid Pool ing (ASPP)module,and (2)1 ×1 convolution as well as image-pooling feature.OS:output stride that con trols the output resolution of the segmentation map.MF:Multi-scale and left-right flipped inputs during test.All of the models have been pretrained on COCO.The po tential candidate for on-device applications is shown in bold face.PASCAL images have dimension 512 ×512 and atrous convolution allows us to control output fea ture resolution without increasing the number of param eters.

网络

输出步幅控制分割图的输出分辨率

扩张金字塔池化模块

测试过程中使用多尺度和左右翻转输入

mIOU

参数数量(Million)

乘法加法计算量(Billion)

Mnet V1

16

35.2B

75.29

11.15

14.25

8

78.56

11.15

941.9

Mnet V2*

16

17.5 B

75.70

4.52

5.8

8

78.42

4.52

387

Mnet V2*

16

75.32

2.11

2.75

8

77.33

2.11

152.6

ResNet-101

16

80.49

58.16

81.0

8

82.70

58.16

4870.6

消融研究反向残差连接。残差连接的重要性已经得到广泛研究 [8,30,46]。本文报道的新结果是,连接瓶颈的快捷方式优于连接扩展层的快捷方式(见图6b进行比较)。线性瓶颈的重要性。线性瓶颈模型比具有非线性的模型严格更不强大,因为激活可以始终在线性区间内运行,只要进行适当的偏置和缩放变化。然而,我们在图6a中的实验表明,线性瓶颈可以提高性能,支持非线性会破坏低维空间中的信息。

1.MobileNetv2.py(pytorch实现)

from torch import nn
import torch

def _make_divisible(ch, divisor=8, min_ch=None):
    if min_ch is None:
        min_ch = divisor
    new_ch = max(min_ch, int(ch + divisor / 2) // divisor * divisor)
    if new_ch < 0.9 * ch:
        new_ch += divisor
    return new_ch

class ConvBNReLU(nn.Sequential):
    def __init__(self, in_channel, out_channel, kernel_size=3, stride=1, groups=1):
        padding = (kernel_size - 1) // 2
        super(ConvBNReLU, self).__init__(
            nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding, groups=groups, bias=False),
            nn.BatchNorm2d(out_channel),
            nn.ReLU6(inplace=True)
        )

class InvertedResidual(nn.Module):
    def __init__(self, in_channel, out_channel, stride, expand_ratio):
        super(InvertedResidual, self).__init__()
        hidden_channel = in_channel * expand_ratio
        self.use_shortcut = stride == 1 and in_channel == out_channel
        layers = []
        if expand_ratio != 1:
            layers.append(ConvBNReLU(in_channel, hidden_channel, kernel_size=1))
        layers.extend([
            ConvBNReLU(hidden_channel, hidden_channel, stride=stride, groups=hidden_channel),
            nn.Conv2d(hidden_channel, out_channel, kernel_size=1, bias=False),
            nn.BatchNorm2d(out_channel)
        ])
        self.conv = nn.Sequential(*layers)
    def forward(self, x):
        if self.use_shortcut:
            return x + self.conv(x)
        else:
            return self.conv(x)

class MobileNetV2(nn.Module):
    def __init__(self, num_classes=1000, alpha=1.0, round_nearest=8):
        super(MobileNetV2, self).__init__()
        block = InvertedResidual
        input_channel = _make_divisible(32*alpha, round_nearest)
        last_channel = _make_divisible(1280*alpha, round_nearest)

        Inverted_residul_setting = [
            [1, 16, 1, 1],
            [6, 24, 2, 2],
            [6, 32, 3, 2],
            [6, 64, 4, 2],
            [6, 96, 3, 1],
            [6, 160, 3, 2],
            [6, 320, 1, 1]
        ]
        features = []
        features.append(ConvBNReLU(3, input_channel, stride=2))
        for t, c, n, s in Inverted_residul_setting:
            output_channel = _make_divisible(c * alpha, round_nearest)
            for i in range(n):
                stride = s if i == 0 else 1
                features.append(block(input_channel, output_channel, stride, expand_ratio=t))
                input_channel = output_channel
        features.append(ConvBNReLU(input_channel, last_channel, 1))
        self.features = nn.Sequential(*features)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.classifier = nn.Sequential(
            nn.Dropout(0.2),
            nn.Linear(last_channel, num_classes)
        )
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out')
                if m.bias is not None:
                    nn.init.zeros_(m.bias)
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.ones_(m.weight)
                nn.init.zeros_(m.bias)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0.01)
                nn.init.zeros_(m.bias)
    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

总结

我们描述了一种非常简单的网络架构,使我们能够构建出一系列高效移动模型。我们的基本构建单元具有几个特性,使其特别适合移动应用。它允许非常内存高效的推断,并利用了所有神经框架中存在的标准操作。对于ImageNet数据集,我们的架构在各种性能点上提高了最新技术水平。对于目标检测任务,我们的网络在COCO数据集上的准确度和模型复杂度方面都优于最新的实时探测器。值得注意的是,我们的架构与SSDLite检测模块相结合,计算量比YOLOv2少20倍,参数数比少10倍。在理论方面:我们提出的卷积块具有一种独特的属性,可以将网络的表现力(由扩展层编码)与其容量(由瓶颈输入编码)分离。探索这一点是未来研究的重要方向。感谢Matt Streeter和Sergey Ioffe的有益反馈和讨论。

你可能感兴趣的:(机器学习,网络,python)