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

MobileOne: An Improved One millisecond Mobile Backbone

【参考代码】

【参考论文】

一句话总结

MobileOne(≈MobileNetV1+RepVGG+训练Trick)是由Apple公司提出的一种基于iPhone12优化的超轻量型架构,在ImageNet数据集上以<1ms的速度取得了75.9%的Top1精度。

1 论文解读

1.1 论文目的

高效率网络具有更强的实用价值,但学术界的研究往往聚焦于FLOPs或者参数量的降低,而这两者与推理效率之间并不存在严格的一致性。比如,FLOPs并未考虑访存消耗与计算并行度,像无参操作(如跳过连接导致的Add、Concat等)会带来显著的访存消耗,导致更长推理耗时。

为更好的分析高效率网络的瓶颈所在,作者以iPhone12平台为基准,从不同维度进行了"瓶颈"分析,见上图。从中可以看到:

  • 具有高参数量的模型也可以拥有低延迟,比如ShuffleNetV2;

  • 具有高FLOPs的模型也可以拥有低延迟,比如MobileNetV1和ShuffleNetV2;

TypeFlopsParameters
corr. p-valuecorr. p-value
Mobile Latency0.47 0.030.30 0.18
CPU Latency0.06 0.800.07 0.77

上表从SRCC角度进行了分析,可以看到:

  • 在移动端,延迟与FLOPs和参数量的相关性较弱;

  • 在PC-CPU端,该相关性进一步弱化。

1.2 具体方案

基于上述洞察,作者从先两个主要效率"瓶颈"维度上进行了对比,然后对性能"瓶颈"进行了分析并提出相应方案。

Activation Functions:上表对比了不同激活函数对于延迟的影响,可以看到:尽管具有相同的架构,但不同激活函数导致的延迟差异极大。本文默认选择ReLU激活函数。

Architectural Block:上表对影响延迟的两个主要因素(访存消耗与计算并行度)进行了分析,见上表,可以看到:当采用单分支结构时,模型具有更快的速度。此外,为改善效率,作者在大模型配置方面有限的实用了SE模块。

基于上述分析,MobileOne的核心模块基于MobileNetV1而设计,同时吸收了重参数思想,得到上图所示的结构。注:这里的重参数机制还存在一个超参k用于控制重参数分支的数量(实验表明:对于小模型来说,该变种收益更大)。

在Model Scaling方面类似MobileNetV2,上表给出了MobileOne不同配置的参数信息。

在训练优化方面,小模型需要更少的正则,因此作者提出了Annealing的正则调整机制(可带来0.5%指标提升);此外,作者还引入渐进式学习机制(可带来0.4%指标提升);最后,作者还采用EMA机制,最终MobileOne-S2模型达到了77.4%的指标。

1.3 实验结果

上表给出了ImageNet数据集上不同轻量型方案的性能与效率对比,可以看到:

  • 哪怕最轻量的Transformer也需要至少4ms,而MobileOne-S4仅需1.86ms即可达到79.4%的精度;

  • 相比EfficientNet-B0,MobileOne-S3不仅具有指标高1%,同时具有更快的推理速度;

  • 相比其他方案,在PC-CPU端,MobileOne仍具有非常明显的优势。

上表为MS-COCO检测、VOC分割以及ADE20K分割任务上的性能对比,很明显:

  • 在MC-COCO任务上,MobileOne-S4比MNASNet指标高27.8%,比MobileViT高6.1%;

  • 在VOC分割任务上,所提方案比MobileViT高1.3%,比MobileNetV2高5.8%;

  • 在ADE20K任务上,所提最佳方案比MobileNetV2高12%,而MobileOne-S1仍比MobileNetV2高2.9%。

在文章最后,作者俏皮的提了一句:“Although, our models are state-of-the art within the regime of efficient architectures, the accuracy lags large models ConvNeXt and Swin Transformer”。

2 模型训练

2.1 查看飞桨版本

# 1.查看飞桨版本
import paddle
print(paddle.__version__)
2.4.0

2.2 安装PaddleClas环境

添加了MobilieOne的PaddleClas已打包至PaddleClas.zip中,通过解压进行环境安装

参考文档:https://github.com/PaddlePaddle/PaddleClas/blob/release/2.2/docs/en/tutorials/install_en.md

# !git clone https://github.com/PaddlePaddle/PaddleClas.git -b develop
!unzip PaddleClas.zip
%cd /home/aistudio/PaddleClas
!pip install --upgrade pip
!pip install --upgrade -r requirements.txt --user -i https://mirror.baidu.com/pypi/simple

2.3 了解PaddleClas深度学习套件

【官方文档】 :拥有图像识别、图像分类、特征学习等内容

2.4 PaddleClas全局配置

参数名称具体含义默认值
checkpoints断点模型路径,用于恢复训练null
pretrained_model预训练模型路径null
output_dir保存模型路径“./output/”
save_interval每隔多少个epoch保存模型1
eval_during_train是否在训练时进行评估True
eval_interval每隔多少个epoch进行模型评估1
epochs训练总epoch数
print_batch_step每隔多少个mini-batch打印输出10
use_visualdl是否是用visualdl可视化训练过程False
image_shape图片大小[3,224,224]
save_inference_dirinference模型的保存路径“./inference”
eval_modeeval的模式“classification”

注:

  • image_shape值除了默认还可以选择list, shape: (3,)

  • eval_mode除了默认值还可以选择"retrieval"

参考文档:

https://github.com/PaddlePaddle/PaddleClas/blob/release/2.2/docs/en/tutorials/config_description_en.md

3 数据集

3.1 官方分类尝试

下载并解压flowers102数据集,数据集中有:

  • train_list.txt:训练集,1020张图

  • val_list.txt: 验证集,1020张图

  • train_extra_list.txt:大的训练集,7169张图

# 1.修改当前路径
!mkdir /home/aistudio/dataset
%cd /home/aistudio/dataset
# 2.下载数据集
!wget https://paddle-imagenet-models-name.bj.bcebos.com/data/flowers102.zip
# 3.解压数据
!unzip flowers102.zip

4 模型训练

ImageNet-1K

ModelTop-1 Acc.Latency*
MobileOne-S071.40.79
MobileOne-S175.90.89
MobileOne-S277.41.18
MobileOne-S378.11.53
MobileOne-S479.41.86
  • Latency measured on iPhone 12 Pro.

这里我们选用复现好的MobileOne_S0网络模型的配置进行鲜花分类模型的训练

!python tools/train.py -c ppcls/configs/MobileOne/MobileOne_S0.yml

运行tools文件夹下的train.py文件

  • -c指的是训练使用的配置文件的路径为./ppcls/configs/ImageNet/VovNet/vovnet39_x1.0.yaml

  • -o表示的是是否使用预训练模型,可以是选择为True或False,也可以使用预训练模型存放路径。

# 切换目录到PaddleClas下
%cd /home/aistudio/PaddleClas
# 开始训练
!python tools/train.py \
    -c ppcls/configs/MobileOne/MobileOne_S0.yml \
    -o Global.pretrained_model=/home/aistudio/PaddleClas/pretrain/mobileone_s0 

5 模型预测

  • -c为训练配置文件

  • -o Infer.infer_imgs=为预测的图片

  • -o Global.pretrained_model=为用于预测的模型

!python tools/infer.py -c ppcls/configs/MobileOne/MobileOne_S0.yml \
                     -o Infer.infer_imgs=/home/aistudio/dataset/flowers102/jpg/image_00001.jpg \
                     -o Global.pretrained_model=/home/aistudio/PaddleClas/output/MobileOne_S0/best_model

6 模型评估

import paddle

!python -m paddle.distributed.launch \
    tools/eval.py \
        -c ppcls/configs/MobileOne/MobileOne_S0.yml \
        -o Global.pretrained_model=/home/aistudio/PaddleClas/output/MobileOne_S0/best_model

7 模型导出

!python tools/export_model.py \
    -c ppcls/configs/MobileOne/MobileOne_S0.yml \
    -o Global.pretrained_model=/home/aistudio/PaddleClas/output/MobileOne_S0/best_model \
    -o Global.save_inference_dir=inference_output

8 paddle2onnx 模型转化与预测

# 1. 环境准备
!python3.7 -m pip install paddle2onnx
!python3.7 -m pip install onnxruntime
!mkdir models_onnx
# 2. 模型转换
!paddle2onnx --model_dir=/home/aistudio/PaddleClas/models_onnx/ \
    --model_filename=/home/aistudio/PaddleClas/inference_output/inference.pdmodel \
    --params_filename=/home/aistudio/PaddleClas/inference_output/inference.pdiparams \
    --save_file=/home/aistudio/PaddleClas/models_onnx/inference.onnx \
    --opset_version=10 \
    --enable_onnx_checker=True
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: /home/aistudio/PaddleClas/inference_output/inference.pdmodel
[Paddle2ONNX] Paramters file path: /home/aistudio/PaddleClas/inference_output/inference.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 10 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2023-05-09 18:29:27 [INFO]	===============Make PaddlePaddle Better!================
2023-05-09 18:29:27 [INFO]	A little survey: https://iwenjuan.baidu.com/?code=r8hu2s

e=r8hu2s

9 总结

在本文中成功复现了MobileOne网络模型,并添加至PaddleClas中,完成对Flowers102数据集上的训练、评估以及预测。今后的工作将添加MobileOne至目标检测、图像分割的模型中作为backbone,更好的加快网络提取特征的速度和能力。

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

Please click here for more detailed instructions.

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐