PaddleLightModel--“轻量化模型,带你体验极致轻的感觉“

★★★ 本文源自AI Studio社区精品项目,【点击此处】查看更多精品内容 >>>


一、PaddleLightModel

PaddleLightMdel,其中包括经典的MobileNetV1-V3、PPLCNetV1-V2、SqueezeNetv2、ShuffleNet、MobileVit等轻量化模型以及自己复现的EdgeNeXt、Efficientnet-Lite、PeleeNet、VovNet等轻量化模型。

二、PaddleLightModel已有模型介绍和对比

  1. SqueezeNet,提出了fire module【使用 1x1 卷积核替换部分 3x3 卷积核,减少参数量;同时在squeeze阶段,限制 input feature map的channel数,又一次减少参数】。在整体网络模型中减少pooling,平均每3个fire module后有一个max pooling,分类前的全连接层替换成average pooling。

  2. Xception,参差结构+可分离卷积(Separable Convolution)【对每一个通道先进行 1x1 卷积,再进行 3x3 卷积】。在Inception v3模型上改进, 参数量没减少,精度提高。

  3. MobileNetv1,宽度\分辨率因子 + 深度可分离卷积(Depthwise Separable Convolution)【对每一个通道先进行 3x3 卷积,再进行 1x1 卷积】。参数量下降

  4. MobileNetv2,倒残差结构+深度可分离卷积+relu6。发现relu对低维特征损失较严重。

    1)提出反残差模块【先升维:增加信息量,再降维度:较少参数】;

    2)较少block最后的Relu改为lineat,减少信息破坏。移动部署float16,所以换成relu6。

  5. MobileNetv3,倒残差结构+深度可分离卷积+se注意力机制+h-swish激活。使用堆积木手段和nas搜索出一个small结构、一个large结构

  6. ShuffleNet,深度可分离卷积+分组卷积+shuffle机制 。借鉴Resnext的分组卷积思想,不过全部只用1x1卷积核,减少参数量;加入了shuffle机制(通道清洗),加强了通道间的信息流通,一定程度上缓解了由于分组卷积导致的通道关系损失。

(一)MobileNet系列模型

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

1. MobileNet-V1

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

2. MobileNet-V2

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

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

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

    • 整个过程为 “扩展- 卷积 - 压缩”,呈梭型;
    • 卷积操作为:卷积升维 (1×1) - DW卷积提取特征 (3×3) - 卷积降维 (1×1);
    • 使用 ReLU6 激活函数和线性激活函数。

3. MobileNet-V3

  • mobilenetV3相对于V1、V2的主要优化点为:

    • 更新Block(bneck):加入SE模块、更新激活函数
    • 使用NAS搜索参数(Neural Architecture Search)
    • 重新设计耗时层结构:减少第一个卷积层的核数(32->16),更新last-stage
ModelsTop1Top5Reference
top1
Reference
top5
FLOPS
(G)
Parameters
(M)
MobileNetV1_x0_250.5140.7550.5060.0700.460
MobileNetV1_x0_50.6350.8470.6370.2801.310
MobileNetV1_x0_750.6880.8820.6840.6302.550
MobileNetV10.7100.8970.7061.1104.190
MobileNetV1_ssld0.7790.9391.1104.190
MobileNetV2_x0_250.5320.7650.0501.500
MobileNetV2_x0_50.6500.8570.6540.8640.1701.930
MobileNetV2_x0_750.6980.8900.6980.8960.3502.580
MobileNetV20.7220.9070.7180.9100.6003.440
MobileNetV2_x1_50.7410.9171.3206.760
MobileNetV2_x2_00.7520.9262.32011.130
MobileNetV2_ssld0.76740.93390.6003.440
MobileNetV3_large_
x1_25
0.7640.9300.7660.7147.440
MobileNetV3_large_
x1_0
0.7530.9230.7520.4505.470
MobileNetV3_large_
x0_75
0.7310.9110.7330.2963.910
MobileNetV3_large_
x0_5
0.6920.8850.6880.1382.670
MobileNetV3_large_
x0_35
0.6430.8550.6420.0772.100
MobileNetV3_small_
x1_25
0.7070.8950.7040.1953.620
MobileNetV3_small_
x1_0
0.6820.8810.6750.1232.940
MobileNetV3_small_
x0_75
0.6600.8630.6540.0882.370
MobileNetV3_small_
x0_5
0.5920.8150.5800.0431.900
MobileNetV3_small_
x0_35
0.5300.7640.4980.0261.660
MobileNetV3_small_
x0_35_ssld
0.5560.7770.4980.0261.660
MobileNetV3_large_
x1_0_ssld
0.7900.9450.4505.470
MobileNetV3_large_
x1_0_ssld_int8
0.761
MobileNetV3_small_
x1_0_ssld
0.7130.9010.1232.940
ShuffleNetV20.6880.8850.6940.2802.260
ShuffleNetV2_x0_250.4990.7380.0300.600
ShuffleNetV2_x0_330.5370.7710.0400.640
ShuffleNetV2_x0_50.6030.8230.6030.0801.360
ShuffleNetV2_x1_50.7160.9020.7260.5803.470
ShuffleNetV2_x2_00.7320.9120.7491.1207.320
ShuffleNetV2_swish0.7000.8920.2902.260
GhostNet_x0_50.6680.8690.6620.8660.0822.600
GhostNet_x1_00.7400.9160.7390.9140.2945.200
GhostNet_x1_30.7570.9250.7570.9270.4407.300
GhostNet_x1_3_ssld0.7940.9450.7570.9270.4407.300

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/MobileNetV3.md

本节主要介绍mobilenet系列:mobilenetV1、mobilenetV2、mobilenetV3三个特征提取网络。MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution(深度可分离卷积)。

(二)PPLC-Net系列模型

本模型提出一种基于MKLDNN加速的轻量CPU模型PP-LCNet,它在多个任务上改善了轻量型模型的性能。本文列举了一些可以提升模型精度且保持延迟几乎不变的技术,基于这些改进,所提PP-LCNet可以凭借同等推理速度大幅超过其他已有网络。本节主要介绍PPLC-Net-V1和PPLC-Net-V2网络模型。

1. PPLC-Net-V1

  • Better activation function

    • H-Swish替换BaseNet中的ReLU,性能大幅提升,而推理速度几乎不变。
  • SE modules at appropriate positions

    • SE模块采用了与MobileNetV3相似的机制:SE中的两个激活函数分别为SE和H-Sigmoid。
  • Larger convolution kernels

    • 使用一个尺寸的卷积,并在低延迟&高精度情形下使用大尺度卷积核。
ModelParams(M)FLOPs(M)Top-1 Acc(%)Top-5 Acc(%)Latency(ms)预训练模型下载地址inference模型下载地址
PPLCNet_x0_251.51851.8675.651.74下载链接下载链接
PPLCNet_x0_351.62958.0980.831.92下载链接下载链接
PPLCNet_x0_51.94763.1484.662.05下载链接下载链接
PPLCNet_x0_752.49968.1888.302.29下载链接下载链接
PPLCNet_x1_03.016171.3290.032.46下载链接下载链接
PPLCNet_x1_54.534273.7191.533.19下载链接下载链接
PPLCNet_x2_06.559075.1892.274.27下载链接下载链接
PPLCNet_x2_59.090676.6093.005.39下载链接下载链接
PPLCNet_x0_5_ssld1.94766.1086.462.05下载链接下载链接
PPLCNet_x1_0_ssld3.016174.3992.092.46下载链接下载链接
PPLCNet_x2_5_ssld9.090680.8295.335.39下载链接下载链接

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/PP-LCNet.md

如下图所示,在图像分类任务方面,所提PP-LCNet在推理延迟-精度均衡方面大幅优于ShuffleNetV2、MobileNetV2、MobileNetV3以及GhostNet;在其他下游任务(如目标检测、语义分割等),所提方案同样表现优异。

2. PPLC-Net-V2

PP-LCNetV2 模型是在 PP-LCNetV1 的基础上优化而来,主要使用重参数化策略组合了不同大小卷积核的深度卷积,并优化了点卷积、Shortcut等。在不使用额外数据的前提下,PPLCNetV2_base 模型在图像分类 ImageNet 数据集上能够取得超过 77% 的 Top1 Acc,同时在 Intel CPU 平台的推理时间在 4.4 ms 以下。PPLCNetV2_base_ssld模型的Top1 Acc,则达到80%。

ModelParams(M)FLOPs(M)Top-1 Acc(%)Top-5 Acc(%)Latency(ms)预训练模型下载地址inference模型下载地址
PPLCNetV2_base6.660477.0493.274.32下载链接下载链接
PPLCNetV2_base_ssld6.660480.0794.874.32下载链接下载链接

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/tree/release/2.5/docs/zh_CN/models/ImageNet1k/PP-LCNetV2.md

(三)ShuffleNet、SqueezeNet与Xception模型

1. ShuffleNet

ShuffleNetV2中提出了一个关键点,之前的轻量级网络都是通过计算网络复杂度的一个间接度量,即FLOPs为指导。通过计算浮点运算量来描述轻量级网络的快慢。但是从来不直接考虑运行的速度。在移动设备中的运行速度不仅仅需要考虑FLOPs,还需要考虑其他的因素,比如内存访问成本(memory access cost)和平台特点(platform characterics)。

  • ShuffleNetv2提出了设计应该考虑两个原则:

    • 应该使用直接度量(如速度)而不是间接度量(如FLOPs。
    • 这些指标应该在目标平台上进行评估。(也就是实事求是)
  • ShuffleNetv2根据这两个原则,提出了四种有效的网络设计原则:

    • G1: Equal channel width minimizes memory access cost (MAC)
    • G2: Excessive group convolution increases MAC
    • G3: Network fragmentation reduces degree of parallelism
    • G4: Element-wise operations are non-negligible

ShuffleNetV2做出了改进,如图( c )所示,在每个单元的开始,c特征通道的输入被分为两个分支(在ShuffleNetV2中这里是对channels均分成两半)。根据G3,不能使用太多的分支,所以其中一个分支不作改变,另外的一个分支由三个卷积组成,它们具有相同的输入和输出通道以满足G1。两个1 × 1卷积不再是组卷积,而改变为普通的1x1卷积操作,这是为了遵循G2(需要考虑组的代价)。卷积后,两个分支被连接起来,而不是相加(G4)。因此,通道的数量保持不变(G1)。然后使用与ShuffleNetV1中相同的“channels shuffle”操作来启用两个分支之间的信息通信。需要注意,ShuffleNet v1中的“Add”操作不再存在。像ReLU和depthwise convolutions 这样的元素操作只存在于一个分支中。

  • ShuffleNet准确率、参数量
ModelsTop1Top5Reference
top1
Reference
top5
FLOPS
(G)
Parameters
(M)
ShuffleNetV20.6880.8850.6940.2802.260
ShuffleNetV2_x0_250.4990.7380.0300.600
ShuffleNetV2_x0_330.5370.7710.0400.640
ShuffleNetV2_x0_50.6030.8230.6030.0801.360
ShuffleNetV2_x1_50.7160.9020.7260.5803.470
ShuffleNetV2_x2_00.7320.9120.7491.1207.320
ShuffleNetV2_swish0.7000.8920.2902.260

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/ShuffleNetV2.md

2. SqueezeNet

Fire Module是本文的核心构件,思想非常简单,就是将原来简单的一层conv层变成两层:squeeze层+expand层,各自带上Relu激活层。

  • 设计原则

    • 替换3x3的卷积kernel为1x1的卷积kernel

    • 减少输入3x3卷积的input feature map数量

    • 减少pooling

ModelsTop1Top5Reference
top1
Reference
top5
FLOPS
(G)
Parameters
(M)
SqueezeNet1_00.5960.8170.5751.5501.240
SqueezeNet1_10.6010.8190.6901.230

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/SqueezeNet.md

3. XceptionNet

  • Separable Convolution Module

    先进行普通卷积操作,再对 1×11×1 卷积后的每个channel分别进行 3×33×3 卷积操作,最后将结果concat。

  • 设计原则

    • 提出Separable Convolution (可分离卷积)【与 MobileNet的不同】

    • 参差思想

ModelsTop1Top5Reference
top1
Reference
top5
FLOPS
(G)
Parameters
(M)
Xception410.7930.9450.7900.94516.74022.690
Xception41
_deeplab
0.7960.94418.16026.730
Xception650.8100.95525.95035.480
Xception65
_deeplab
0.8030.94527.37039.520
Xception710.8110.95531.77037.280

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/Xception.md

(四) 高效推理网络:PeleeNet、VoVNet

1. PeleeNet

在MobileNet的轻量化网络中广泛采用深度可分离卷积用于减少参数量和计算量,但文章指出这样的结构在不同深度学习推理框架中效率却不高。对此模型全部采用传统卷积的形式在DenseNet的基础上进行改进得到名为PeleeNet的网络。相比MobileNet网络更加轻量化,运行的速度也更快。

  • Two-Way Dense Layer:这部分改进是参考InceptionNet系列网络,在原本的Dense Layer中再添加两个分支,从而可以增加网络对大目标的感知力与网络表达能力。

  • Stem Block:对于网络输入的初级文章使用多分枝的结构进行改进,避免直接采用增加初级channel数量的方式进行网络表达能力增强(开销大)。

  • Dynamic Number of Channels in Bottleneck Layer :这里将DenseNet中的Bottleneck中的中间层channel变化倍率与输入特征图的分辨率进行关联,从而抛弃之前采用的固定倍率的方案。也就是大尺寸的特征图相应得到更小的倍率,从而减少计算量。

  • Transition Layer without Compression:这里对transition层中的channel数量不做压缩,避免对特征表达带来损失;

  • Composite Function:采用Conv+BN+ReLU的形式而不是Conv+ReLU+BN的形式,从而方便进行网络折叠。

ModelFLOPs#parametersTop-1 AccFPS (NVIDIA TX2)
MobileNet569 M4.2 M70.0136
ShuffleNet 2x524 M5.2 M73.7110
Condensenet (C=G=8)274M4.0M7140
MobileNet v2300 M3.5 M72.0123
ShuffleNet v2 1.5x300 M5.2 M72.6164
PeleeNet (our)508 M2.8 M72.6240
PeleeNet v2 (our)621 M4.4 M73.9245

注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/PeleeNet.md

2. VoVNet

VoVNet在DenseNet的基础上从MAC(memory access cost)和GPU并行计算效率角度对DenseNet中的dense_block进行改进,从而得到兼顾性能和效率的OSA(one-shot aggregation)模块,并在此基础上构建了VoVNet。其在计算速度和功耗上均比相同级别的DenseNet具有较大改善。

A PaddlePaddle Implementation of VoVNet Backbone Networks

This is a PaddlePaddle implementation of VoVNet backbone networks as described in the paper An Energy and GPU-Computation Efficient Backbone Network for Real-Time Object Detection. This is implemented through PaddlePaddle/vision style.

ModelTop-1Top-5Inference time
VoVNet-3923.23%6.57%10 ms
VoVNet-5722.27%6.28%13 ms

注:该对比数据来源于https://github.com/stigma0617/VoVNet.pytorch/blob/master/README.md

(五)MobileVit与EdgeNeXt:轻量、通用和适用移动设备的Vision Transformer

1. MobileVit

轻量级卷积神经网络(CNN)是移动视觉任务的实际应用,它们的空间归纳偏差允许它们在不同的视觉任务中以较少的参数学习表征.然而,这些网络在空间上是局部.为了学习全局表征,采用基于自注意力的Vision Transformer(ViTs).

  • MobileVit网络模型结构

  • MobileVit网络模型参数
ModelDatasetLearning RateLR SchedulerOptimizerWeight decayAcc@1/ValAcc@5/Val
MobileViTImageNet-1k0.05Cosine LRSGDM1e-561.918%83.05%

注:该对比数据来源于https://github.com/wilile26811249/MobileViT/blob/main/README.md

2. EdgeNeXt

EdgeNeXt是一种集CNN与Transformer于一体的混合架构,鉴于现有大多流行方法,在追求更高精度的同时并不能很好的保持更快推理速度,以至于在资源受限设备上的部署表现不足。EdgeNeXt在保持较小模型容量的同时提升模型性能。

  • EdgeNeXt网络模型结构

    • 卷积编码器(Convolution Encoder)

    • 分割深度转置注意编码器(SDTA Encoder)

整体架构采取标准的“四阶段”金字塔范式设计,其中包含卷积编码器与SDTA编码器两个重要的模块。在卷积编码器中,自适应核大小的设计被应用,这与SDTA中的多尺度感受野的思想相呼应。而在SDTA编码器中,特征编码部分使用固定的3×3卷积,但通过层次级联实现多尺度感受野的融合,而此处若使用不同尺寸的卷积核是否会带来更好的效果有待考证。在自注意计算部分,通过将点积运算应用于通道维度,得到了兼顾计算复杂度与全局注意力的输出。

  • EdgeNeXt网络模型参数
NameAcc@1#ParamsMAdds
edgenext_small_usi81.075.59M1.26G
edgenext_small79.415.59M1.26G
edgenext_x_small74.962.34M538M
edgenext_xx_small71.231.33M261M
edgenext_small_bn_hs78.395.58M1.25G
edgenext_x_small_bn_hs74.872.34M536M
edgenext_xx_small_bn_hs70.331.33M260M

注:该对比数据来源于https://github.com/mmaaz60/EdgeNeXt/blob/main/README.md

三、快速开始——Quick Start

(一)基础知识

图像分类顾名思义就是一个模式分类问题,PaddleLightModel继承了经典的CNN结构轻量模型和CNN与Transformer结合的移动端轻量化模型。

1. 数据集

  • 训练集(train dataset):用来训练模型,使模型能够识别不同类型的特征;
  • 验证集(val dataset):训练过程中的测试集,方便训练过程中查看模型训练程度;
  • 测试集(test dataset):训练模型结束后,用于评价模型结果的测试集。

2. 预训练模型

加载预训练模型的方法可以认为是让模型基于一个更好的初始状态进行学习,从而能够达到更好的性能。

3. 迭代轮数(epoch)

模型训练迭代的总轮数,模型对训练集全部样本过一遍即为一个 epoch。当测试错误率和训练错误率相差较小时,可认为当前迭代轮数合适;当测试错误率先变小后变大时,则说明迭代轮数过大,需要减小迭代轮数,否则容易出现过拟合。

4. 损失函数(Loss Function)

训练过程中,衡量模型输出(预测值)与真实值之间的差异

5. 准确率(Acc):表示预测正确的样本数占总数据的比例

  • Top1 Acc:预测结果中概率最大的所在分类正确,则判定为正确;
  • Top5 Acc:预测结果中概率排名前 5 中有分类正确,则判定为正确;

(二)环境安装和配置

## 环境安装与配置
%cd PaddleLightModel/
!pip install -r requirements.txt --user

(三)数据的准备与处理

%cd dataset/
!wget https://paddle-imagenet-models-name.bj.bcebos.com/data/flowers102.zip
# 解压
!unzip flowers102.zip

(四)模型训练

1. 使用CPU进行模型训练

由于使用CPU来进行模型训练,计算速度较慢,此模型计算量较小,在 CPU 上计算速度较快。但是也因为模型较小,训练好的模型精度也不会太高。

(1) 不使用预训练模型
!python tools/train.py -c ./ppcls/configs/Light_models/VoVNet/vovnet39.yaml
  • -c 参数是指定训练的配置文件路径,训练的具体超参数可查看yaml文件
  • yamlGlobal.device 参数设置为cpu,即使用CPU进行训练(若不设置,此参数默认为True
  • yaml文件中epochs参数设置为20,说明对整个数据集进行20个epoch迭代,预计训练20分钟左右(不同CPU,训练时间略有不同),此时训练模型不充分。若提高训练模型精度,请将此参数设大,如40,训练时间也会相应延长
%cd /home/aistudio/PaddleLightModel/
# 1.不使用预训练模型
! python tools/train.py -c ./ppcls/configs/Light_models/MobileNetV3/MobileNetV3_large_x0_5.yaml
(2)使用预训练权重
! python tools/train.py -c ./ppcls/configs/Light_models/MobileNetV3/MobileNetV3_large_x0_5.yaml -o Arch.pretrained=True
# 2.使用预训练模型
# ! export CUDA_VISIBLE_DEVICES=0 # 使用GPU进行模型训练
! python tools/train.py -c ./ppcls/configs/Light_models/MobileNetV3/MobileNetV3_large_x0_5.yaml -o Arch.pretrained=True

(五)模型预测

训练完成后,可以使用训练好的模型进行预测,以训练的 MobileNetV3_large_x0_5 模型为例,预测代码如下:

! python tools/infer.py -c ./ppcls/configs/Light_models/MobileNetV3/MobileNetV3_large_x0_5.yaml -o Infer.infer_imgs=dataset/flowers102/jpg/image_00001.jpg -o Global.pretrained_model=output/MobileNetV3_large_x0_5/best_model

-i 输入为单张图像路径,运行成功后,示例结果如下:

[{'class_ids': [76, 51, 37, 33, 9], 'scores': [0.99998, 0.0, 0.0, 0.0, 0.0], 'file_name': 'dataset/flowers102/jpg/image_00001.jpg', 'label_names': ['passion flower', 'wild pansy', 'great masterwort', 'mexican aster', 'globe thistle']}]

四、总结

本项目中,主要引用和复现的轻量化网络,为模型真正应用于实际项目中有较大的作用。本项目的不足在于由于一个人在开发,因此复现的部分模型缺少预训练模型。在之后的开发过程中将继续改进和优化项目结构,达到合格的项目,以供开发者学习和使用。

五、参考论文和代码

(一)参考代码

  1. PaddleClas
  2. VoVNet
  3. PeleeNet
  4. EdgeNeXt

(二)参考论文

  1. SqueezeNet
  2. XceptionNet
  3. MobileNet
  4. ShuffleNet
  5. PeleeNet
  6. VoVNet
  7. PPLCNet
  8. MobileVit
  9. EdgeNeXt

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值