mmclassification/configs/mobileone
mzr1996 d90dfc3d99 [Docs] Use relative link to config instead of abs link in README. 2022-09-22 09:59:06 +08:00
..
deploy [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
README.md [Docs] Use relative link to config instead of abs link in README. 2022-09-22 09:59:06 +08:00
metafile.yml [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
mobileone-s0_8xb128_in1k.py [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
mobileone-s1_8xb128_in1k.py [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
mobileone-s2_8xb128_in1k.py [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
mobileone-s3_8xb128_in1k.py [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00
mobileone-s4_8xb128_in1k.py [Feature] Add MobileOne Backbone For MMCls 1.x. (#1030) 2022-09-16 11:55:10 +08:00

README.md

MobileOne

An Improved One millisecond Mobile Backbone

Abstract

Efficient neural network backbones for mobile devices are often optimized for metrics such as FLOPs or parameter count. However, these metrics may not correlate well with latency of the network when deployed on a mobile device. Therefore, we perform extensive analysis of different metrics by deploying several mobile-friendly networks on a mobile device. We identify and analyze architectural and optimization bottlenecks in recent efficient neural networks and provide ways to mitigate these bottlenecks. To this end, we design an efficient backbone MobileOne, with variants achieving an inference time under 1 ms on an iPhone12 with 75.9% top-1 accuracy on ImageNet. We show that MobileOne achieves state-of-the-art performance within the efficient architectures while being many times faster on mobile. Our best model obtains similar performance on ImageNet as MobileFormer while being 38x faster. Our model obtains 2.3% better top-1 accuracy on ImageNet than EfficientNet at similar latency. Furthermore, we show that our model generalizes to multiple tasks - image classification, object detection, and semantic segmentation with significant improvements in latency and accuracy as compared to existing efficient architectures when deployed on a mobile device.

Results and models

ImageNet-1k

Model Params(M) Flops(G) Top-1 (%) Top-5 (%) Config Download
MobileOne-s0* 5.29train) | 2.08 (deploy) 1.09 (train) | 0.28 (deploy) 71.36 89.87 config (train) | config (deploy) model
MobileOne-s1* 4.83 (train) | 4.76 (deploy) 0.86 (train) | 0.84 (deploy) 75.76 92.77 config (train) | config (deploy) model
MobileOne-s2* 7.88 (train) | 7.88 (deploy) 1.34 (train) | 1.31 (deploy) 77.39 93.63 config (train) |config (deploy) model
MobileOne-s3* 10.17 (train) | 10.08 (deploy) 1.95 (train) | 1.91 (deploy) 77.93 93.89 config (train) |config (deploy) model
MobileOne-s4* 14.95 (train) | 14.84 (deploy) 3.05 (train) | 3.00 (deploy) 79.30 94.37 config (train) |config (deploy) model

Models with * are converted from the official repo. The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.

Because the official repo. does not give a strategy for training and testing, the test data pipline of RepVGG is used here, and the result is about 0.1 lower than that in the paper. Refer to this issue.

How to use

The checkpoints provided are all training-time models. Use the reparameterize tool to switch them to more efficient inference-time architecture, which not only has fewer parameters but also less calculations.

Use tool

Use provided tool to reparameterize the given model and save the checkpoint:

python tools/convert_models/reparameterize_model.py ${CFG_PATH} ${SRC_CKPT_PATH} ${TARGET_CKPT_PATH}

${CFG_PATH} is the config file path, ${SRC_CKPT_PATH} is the source chenpoint file path, ${TARGET_CKPT_PATH} is the target deploy weight file path.

For example:

python ./tools/convert_models/reparameterize_model.py ./configs/mobileone/mobileone-s0_8xb128_in1k.py https://download.openmmlab.com/mmclassification/v0/mobileone/mobileone-s0_3rdparty_in1k_20220811-db5ce29b.pth ./mobileone_s0_deploy.pth

To use reparameterized weights, the config file must switch to the deploy config files.

python tools/test.py ${Deploy_CFG} ${Deploy_Checkpoint} --metrics accuracy

For example of using the reparameterized weights above:

python ./tools/test.py ./configs/mobileone/deploy/mobileone-s0_deploy_8xb128_in1k.py  mobileone_s0_deploy.pth --metrics accuracy

In the code

Use the API switch_to_deploy of MobileOne backbone to to switch to the deploy mode. Usually called like backbone.switch_to_deploy() or classificer.backbone.switch_to_deploy().

For Backbones:

from mmcls.models import build_backbone
import torch

x = torch.randn( (1, 3, 224, 224) )
backbone_cfg=dict(type='MobileOne', arch='s0')
backbone = build_backbone(backbone_cfg)
backbone.init_weights()
backbone.eval()
outs_ori = backbone(x)

backbone.switch_to_deploy()
outs_dep = backbone(x)

for out1, out2 in zip(outs_ori, outs_dep):
    assert torch.allclose(out1, out2)

For ImageClassifiers:

from mmcls.models import build_classifier
import torch
import numpy as np

cfg = dict(
    type='ImageClassifier',
    backbone=dict(
        type='MobileOne',
        arch='s0',
        out_indices=(3, ),
    ),
    neck=dict(type='GlobalAveragePooling'),
    head=dict(
        type='LinearClsHead',
        num_classes=1000,
        in_channels=1024,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, 5),
    ))

x = torch.randn( (1, 3, 224, 224) )
classifier = build_classifier(cfg)
classifier.init_weights()
classifier.eval()
y_ori = classifier(x, return_loss=False)

classifier.backbone.switch_to_deploy()
y_dep = classifier(x, return_loss=False)

for y1, y2 in zip(y_ori, y_dep):
    assert np.allclose(y1, y2)

Citation

@article{mobileone2022,
  title={An Improved One millisecond Mobile Backbone},
  author={Vasu, Pavan Kumar Anasosalu and Gabriel, James and Zhu, Jeff and Tuzel, Oncel and Ranjan, Anurag},
  journal={arXiv preprint arXiv:2206.04040},
  year={2022}
}