赞
踩
PaddleLightMdel,其中包括经典的MobileNetV1-V3、PPLCNetV1-V2、SqueezeNetv2、ShuffleNet、MobileVit等轻量化模型以及自己复现的EdgeNeXt、Efficientnet-Lite、PeleeNet、VovNet等轻量化模型。
SqueezeNet,提出了fire module【使用 1x1 卷积核替换部分 3x3 卷积核,减少参数量;同时在squeeze阶段,限制 input feature map的channel数,又一次减少参数】。在整体网络模型中减少pooling,平均每3个fire module后有一个max pooling,分类前的全连接层替换成average pooling。
Xception,参差结构+可分离卷积(Separable Convolution)【对每一个通道先进行 1x1 卷积,再进行 3x3 卷积】。在Inception v3模型上改进, 参数量没减少,精度提高。
MobileNetv1,宽度\分辨率因子 + 深度可分离卷积(Depthwise Separable Convolution)【对每一个通道先进行 3x3 卷积,再进行 1x1 卷积】。参数量下降
MobileNetv2,倒残差结构+深度可分离卷积+relu6。发现relu对低维特征损失较严重。
1)提出反残差模块【先升维:增加信息量,再降维度:较少参数】;
2)较少block最后的Relu改为lineat,减少信息破坏。移动部署float16,所以换成relu6。
MobileNetv3,倒残差结构+深度可分离卷积+se注意力机制+h-swish激活。使用堆积木手段和nas搜索出一个small结构、一个large结构
ShuffleNet,深度可分离卷积+分组卷积+shuffle机制 。借鉴Resnext的分组卷积思想,不过全部只用1x1卷积核,减少参数量;加入了shuffle机制(通道清洗),加强了通道间的信息流通,一定程度上缓解了由于分组卷积导致的通道关系损失。
Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用,很多算法都会使用其作为backbone提取特征,这一小节对Mobilenet系列模型做一个总结。
MobilenetV1提出了深度可分离卷积(Depthwise Convolution),它将标准卷积分解成深度卷积以及一个1x1的卷积即逐点卷积,大幅度减少了运算量和参数量。
mobilenetV2相对于V1的主要优化点为:
残差模块
倒残差模块
mobilenetV3相对于V1、V2的主要优化点为:
Models | Top1 | Top5 | Reference top1 | Reference top5 | FLOPS (G) | Parameters (M) |
---|---|---|---|---|---|---|
MobileNetV1_x0_25 | 0.514 | 0.755 | 0.506 | 0.070 | 0.460 | |
MobileNetV1_x0_5 | 0.635 | 0.847 | 0.637 | 0.280 | 1.310 | |
MobileNetV1_x0_75 | 0.688 | 0.882 | 0.684 | 0.630 | 2.550 | |
MobileNetV1 | 0.710 | 0.897 | 0.706 | 1.110 | 4.190 | |
MobileNetV1_ssld | 0.779 | 0.939 | 1.110 | 4.190 | ||
MobileNetV2_x0_25 | 0.532 | 0.765 | 0.050 | 1.500 | ||
MobileNetV2_x0_5 | 0.650 | 0.857 | 0.654 | 0.864 | 0.170 | 1.930 |
MobileNetV2_x0_75 | 0.698 | 0.890 | 0.698 | 0.896 | 0.350 | 2.580 |
MobileNetV2 | 0.722 | 0.907 | 0.718 | 0.910 | 0.600 | 3.440 |
MobileNetV2_x1_5 | 0.741 | 0.917 | 1.320 | 6.760 | ||
MobileNetV2_x2_0 | 0.752 | 0.926 | 2.320 | 11.130 | ||
MobileNetV2_ssld | 0.7674 | 0.9339 | 0.600 | 3.440 | ||
MobileNetV3_large_ x1_25 | 0.764 | 0.930 | 0.766 | 0.714 | 7.440 | |
MobileNetV3_large_ x1_0 | 0.753 | 0.923 | 0.752 | 0.450 | 5.470 | |
MobileNetV3_large_ x0_75 | 0.731 | 0.911 | 0.733 | 0.296 | 3.910 | |
MobileNetV3_large_ x0_5 | 0.692 | 0.885 | 0.688 | 0.138 | 2.670 | |
MobileNetV3_large_ x0_35 | 0.643 | 0.855 | 0.642 | 0.077 | 2.100 | |
MobileNetV3_small_ x1_25 | 0.707 | 0.895 | 0.704 | 0.195 | 3.620 | |
MobileNetV3_small_ x1_0 | 0.682 | 0.881 | 0.675 | 0.123 | 2.940 | |
MobileNetV3_small_ x0_75 | 0.660 | 0.863 | 0.654 | 0.088 | 2.370 | |
MobileNetV3_small_ x0_5 | 0.592 | 0.815 | 0.580 | 0.043 | 1.900 | |
MobileNetV3_small_ x0_35 | 0.530 | 0.764 | 0.498 | 0.026 | 1.660 | |
MobileNetV3_small_ x0_35_ssld | 0.556 | 0.777 | 0.498 | 0.026 | 1.660 | |
MobileNetV3_large_ x1_0_ssld | 0.790 | 0.945 | 0.450 | 5.470 | ||
MobileNetV3_large_ x1_0_ssld_int8 | 0.761 | |||||
MobileNetV3_small_ x1_0_ssld | 0.713 | 0.901 | 0.123 | 2.940 | ||
ShuffleNetV2 | 0.688 | 0.885 | 0.694 | 0.280 | 2.260 | |
ShuffleNetV2_x0_25 | 0.499 | 0.738 | 0.030 | 0.600 | ||
ShuffleNetV2_x0_33 | 0.537 | 0.771 | 0.040 | 0.640 | ||
ShuffleNetV2_x0_5 | 0.603 | 0.823 | 0.603 | 0.080 | 1.360 | |
ShuffleNetV2_x1_5 | 0.716 | 0.902 | 0.726 | 0.580 | 3.470 | |
ShuffleNetV2_x2_0 | 0.732 | 0.912 | 0.749 | 1.120 | 7.320 | |
ShuffleNetV2_swish | 0.700 | 0.892 | 0.290 | 2.260 | ||
GhostNet_x0_5 | 0.668 | 0.869 | 0.662 | 0.866 | 0.082 | 2.600 |
GhostNet_x1_0 | 0.740 | 0.916 | 0.739 | 0.914 | 0.294 | 5.200 |
GhostNet_x1_3 | 0.757 | 0.925 | 0.757 | 0.927 | 0.440 | 7.300 |
GhostNet_x1_3_ssld | 0.794 | 0.945 | 0.757 | 0.927 | 0.440 | 7.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(深度可分离卷积)。
本模型提出一种基于MKLDNN加速的轻量CPU模型PP-LCNet,它在多个任务上改善了轻量型模型的性能。本文列举了一些可以提升模型精度且保持延迟几乎不变的技术,基于这些改进,所提PP-LCNet可以凭借同等推理速度大幅超过其他已有网络。本节主要介绍PPLC-Net-V1和PPLC-Net-V2网络模型。
Better activation function
SE modules at appropriate positions
Larger convolution kernels
Model | Params(M) | FLOPs(M) | Top-1 Acc(%) | Top-5 Acc(%) | Latency(ms) | 预训练模型下载地址 | inference模型下载地址 |
---|---|---|---|---|---|---|---|
PPLCNet_x0_25 | 1.5 | 18 | 51.86 | 75.65 | 1.74 | 下载链接 | 下载链接 |
PPLCNet_x0_35 | 1.6 | 29 | 58.09 | 80.83 | 1.92 | 下载链接 | 下载链接 |
PPLCNet_x0_5 | 1.9 | 47 | 63.14 | 84.66 | 2.05 | 下载链接 | 下载链接 |
PPLCNet_x0_75 | 2.4 | 99 | 68.18 | 88.30 | 2.29 | 下载链接 | 下载链接 |
PPLCNet_x1_0 | 3.0 | 161 | 71.32 | 90.03 | 2.46 | 下载链接 | 下载链接 |
PPLCNet_x1_5 | 4.5 | 342 | 73.71 | 91.53 | 3.19 | 下载链接 | 下载链接 |
PPLCNet_x2_0 | 6.5 | 590 | 75.18 | 92.27 | 4.27 | 下载链接 | 下载链接 |
PPLCNet_x2_5 | 9.0 | 906 | 76.60 | 93.00 | 5.39 | 下载链接 | 下载链接 |
PPLCNet_x0_5_ssld | 1.9 | 47 | 66.10 | 86.46 | 2.05 | 下载链接 | 下载链接 |
PPLCNet_x1_0_ssld | 3.0 | 161 | 74.39 | 92.09 | 2.46 | 下载链接 | 下载链接 |
PPLCNet_x2_5_ssld | 9.0 | 906 | 80.82 | 95.33 | 5.39 | 下载链接 | 下载链接 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/PP-LCNet.md
如下图所示,在图像分类任务方面,所提PP-LCNet在推理延迟-精度均衡方面大幅优于ShuffleNetV2、MobileNetV2、MobileNetV3以及GhostNet;在其他下游任务(如目标检测、语义分割等),所提方案同样表现优异。
PP-LCNetV2 模型是在 PP-LCNetV1 的基础上优化而来,主要使用重参数化策略组合了不同大小卷积核的深度卷积,并优化了点卷积、Shortcut等。在不使用额外数据的前提下,PPLCNetV2_base 模型在图像分类 ImageNet 数据集上能够取得超过 77% 的 Top1 Acc,同时在 Intel CPU 平台的推理时间在 4.4 ms 以下。PPLCNetV2_base_ssld模型的Top1 Acc,则达到80%。
Model | Params(M) | FLOPs(M) | Top-1 Acc(%) | Top-5 Acc(%) | Latency(ms) | 预训练模型下载地址 | inference模型下载地址 |
---|---|---|---|---|---|---|---|
PPLCNetV2_base | 6.6 | 604 | 77.04 | 93.27 | 4.32 | 下载链接 | 下载链接 |
PPLCNetV2_base_ssld | 6.6 | 604 | 80.07 | 94.87 | 4.32 | 下载链接 | 下载链接 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/tree/release/2.5/docs/zh_CN/models/ImageNet1k/PP-LCNetV2.md
ShuffleNetV2中提出了一个关键点,之前的轻量级网络都是通过计算网络复杂度的一个间接度量,即FLOPs为指导。通过计算浮点运算量来描述轻量级网络的快慢。但是从来不直接考虑运行的速度。在移动设备中的运行速度不仅仅需要考虑FLOPs,还需要考虑其他的因素,比如内存访问成本(memory access cost)和平台特点(platform characterics)。
ShuffleNetv2提出了设计应该考虑两个原则:
ShuffleNetv2根据这两个原则,提出了四种有效的网络设计原则:
ShuffleNetV2做出了改进,如图( c )所示,在每个单元的开始,c特征通道的输入被分为两个分支(在ShuffleNetV2中这里是对channels均分成两半)。根据G3,不能使用太多的分支,所以其中一个分支不作改变,另外的一个分支由三个卷积组成,它们具有相同的输入和输出通道以满足G1。两个1 × 1卷积不再是组卷积,而改变为普通的1x1卷积操作,这是为了遵循G2(需要考虑组的代价)。卷积后,两个分支被连接起来,而不是相加(G4)。因此,通道的数量保持不变(G1)。然后使用与ShuffleNetV1中相同的“channels shuffle”操作来启用两个分支之间的信息通信。需要注意,ShuffleNet v1中的“Add”操作不再存在。像ReLU和depthwise convolutions 这样的元素操作只存在于一个分支中。
Models | Top1 | Top5 | Reference top1 | Reference top5 | FLOPS (G) | Parameters (M) |
---|---|---|---|---|---|---|
ShuffleNetV2 | 0.688 | 0.885 | 0.694 | 0.280 | 2.260 | |
ShuffleNetV2_x0_25 | 0.499 | 0.738 | 0.030 | 0.600 | ||
ShuffleNetV2_x0_33 | 0.537 | 0.771 | 0.040 | 0.640 | ||
ShuffleNetV2_x0_5 | 0.603 | 0.823 | 0.603 | 0.080 | 1.360 | |
ShuffleNetV2_x1_5 | 0.716 | 0.902 | 0.726 | 0.580 | 3.470 | |
ShuffleNetV2_x2_0 | 0.732 | 0.912 | 0.749 | 1.120 | 7.320 | |
ShuffleNetV2_swish | 0.700 | 0.892 | 0.290 | 2.260 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/ShuffleNetV2.md
Fire Module是本文的核心构件,思想非常简单,就是将原来简单的一层conv层变成两层:squeeze层+expand层,各自带上Relu激活层。
设计原则
替换3x3的卷积kernel为1x1的卷积kernel
减少输入3x3卷积的input feature map数量
减少pooling
Models | Top1 | Top5 | Reference top1 | Reference top5 | FLOPS (G) | Parameters (M) |
---|---|---|---|---|---|---|
SqueezeNet1_0 | 0.596 | 0.817 | 0.575 | 1.550 | 1.240 | |
SqueezeNet1_1 | 0.601 | 0.819 | 0.690 | 1.230 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/SqueezeNet.md
Separable Convolution Module
先进行普通卷积操作,再对 1×11×1 卷积后的每个channel分别进行 3×33×3 卷积操作,最后将结果concat。
设计原则
提出Separable Convolution (可分离卷积)【与 MobileNet的不同】
参差思想
Models | Top1 | Top5 | Reference top1 | Reference top5 | FLOPS (G) | Parameters (M) |
---|---|---|---|---|---|---|
Xception41 | 0.793 | 0.945 | 0.790 | 0.945 | 16.740 | 22.690 |
Xception41 _deeplab | 0.796 | 0.944 | 18.160 | 26.730 | ||
Xception65 | 0.810 | 0.955 | 25.950 | 35.480 | ||
Xception65 _deeplab | 0.803 | 0.945 | 27.370 | 39.520 | ||
Xception71 | 0.811 | 0.955 | 31.770 | 37.280 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/Xception.md
在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的形式,从而方便进行网络折叠。
Model | FLOPs | #parameters | Top-1 Acc | FPS (NVIDIA TX2) |
---|---|---|---|---|
MobileNet | 569 M | 4.2 M | 70.0 | 136 |
ShuffleNet 2x | 524 M | 5.2 M | 73.7 | 110 |
Condensenet (C=G=8) | 274M | 4.0M | 71 | 40 |
MobileNet v2 | 300 M | 3.5 M | 72.0 | 123 |
ShuffleNet v2 1.5x | 300 M | 5.2 M | 72.6 | 164 |
PeleeNet (our) | 508 M | 2.8 M | 72.6 | 240 |
PeleeNet v2 (our) | 621 M | 4.4 M | 73.9 | 245 |
注:该对比数据来源于https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/ImageNet1k/PeleeNet.md
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.
Model | Top-1 | Top-5 | Inference time |
---|---|---|---|
VoVNet-39 | 23.23% | 6.57% | 10 ms |
VoVNet-57 | 22.27% | 6.28% | 13 ms |
注:该对比数据来源于https://github.com/stigma0617/VoVNet.pytorch/blob/master/README.md
轻量级卷积神经网络(CNN)是移动视觉任务的实际应用,它们的空间归纳偏差允许它们在不同的视觉任务中以较少的参数学习表征.然而,这些网络在空间上是局部.为了学习全局表征,采用基于自注意力的Vision Transformer(ViTs).
Model | Dataset | Learning Rate | LR Scheduler | Optimizer | Weight decay | Acc@1/Val | Acc@5/Val |
---|---|---|---|---|---|---|---|
MobileViT | ImageNet-1k | 0.05 | Cosine LR | SGDM | 1e-5 | 61.918% | 83.05% |
注:该对比数据来源于https://github.com/wilile26811249/MobileViT/blob/main/README.md
EdgeNeXt是一种集CNN与Transformer于一体的混合架构,鉴于现有大多流行方法,在追求更高精度的同时并不能很好的保持更快推理速度,以至于在资源受限设备上的部署表现不足。EdgeNeXt在保持较小模型容量的同时提升模型性能。
EdgeNeXt网络模型结构
卷积编码器(Convolution Encoder)
分割深度转置注意编码器(SDTA Encoder)
整体架构采取标准的“四阶段”金字塔范式设计,其中包含卷积编码器与SDTA编码器两个重要的模块。在卷积编码器中,自适应核大小的设计被应用,这与SDTA中的多尺度感受野的思想相呼应。而在SDTA编码器中,特征编码部分使用固定的3×3卷积,但通过层次级联实现多尺度感受野的融合,而此处若使用不同尺寸的卷积核是否会带来更好的效果有待考证。在自注意计算部分,通过将点积运算应用于通道维度,得到了兼顾计算复杂度与全局注意力的输出。
Name | Acc@1 | #Params | MAdds |
---|---|---|---|
edgenext_small_usi | 81.07 | 5.59M | 1.26G |
edgenext_small | 79.41 | 5.59M | 1.26G |
edgenext_x_small | 74.96 | 2.34M | 538M |
edgenext_xx_small | 71.23 | 1.33M | 261M |
edgenext_small_bn_hs | 78.39 | 5.58M | 1.25G |
edgenext_x_small_bn_hs | 74.87 | 2.34M | 536M |
edgenext_xx_small_bn_hs | 70.33 | 1.33M | 260M |
注:该对比数据来源于https://github.com/mmaaz60/EdgeNeXt/blob/main/README.md
图像分类顾名思义就是一个模式分类问题,PaddleLightModel继承了经典的CNN结构轻量模型和CNN与Transformer结合的移动端轻量化模型。
加载预训练模型的方法可以认为是让模型基于一个更好的初始状态进行学习,从而能够达到更好的性能。
模型训练迭代的总轮数,模型对训练集全部样本过一遍即为一个 epoch。当测试错误率和训练错误率相差较小时,可认为当前迭代轮数合适;当测试错误率先变小后变大时,则说明迭代轮数过大,需要减小迭代轮数,否则容易出现过拟合。
训练过程中,衡量模型输出(预测值)与真实值之间的差异
## 环境安装与配置
%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
由于使用CPU来进行模型训练,计算速度较慢,此模型计算量较小,在 CPU 上计算速度较快。但是也因为模型较小,训练好的模型精度也不会太高。
!python tools/train.py -c ./ppcls/configs/Light_models/VoVNet/vovnet39.yaml
-c
参数是指定训练的配置文件路径,训练的具体超参数可查看yaml
文件yaml
文Global.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
! 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']}]
本项目中,主要引用和复现的轻量化网络,为模型真正应用于实际项目中有较大的作用。本项目的不足在于由于一个人在开发,因此复现的部分模型缺少预训练模型。在之后的开发过程中将继续改进和优化项目结构,达到合格的项目,以供开发者学习和使用。
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。