这是一个PaddlePaddle实现的 MobileNeXt 。
论文: Rethinking Bottleneck Structure for Efficient Mobile Network Design
参考repo: MobileNeXt & rethinking_bottleneck_design
在此非常感谢zhoudaquan
和yitutech-opensource
等人的贡献,提高了本repo复现论文的效率。
ImageNet项目是一个大型视觉数据库,用于视觉目标识别研究任务,该项目已手动标注了 1400 多万张图像。ImageNet-1k 是 ImageNet 数据集的子集,其包含 1000 个类别。训练集包含 1281167 个图像数据,验证集包含 50000 个图像数据。2010 年以来,ImageNet 项目每年举办一次图像分类竞赛,即 ImageNet 大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为 ImageNet-1k。到目前为止,ImageNet-1k 已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的。
数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注 |
---|---|---|---|---|
ImageNet1k | 1.2M | 50k | 1000 |
模型 | epochs | top1 acc (参考精度) | (复现精度) | 权重 | 训练日志 |
---|---|---|---|---|
MobileNeXt-1.0 | 200 | 74.022 | 74.022 | checkpoint-best.pd | log.txt |
权重及训练日志下载地址:百度网盘
硬件和框架版本等环境的要求如下:
- 硬件:4 * 3090
- 框架:
- PaddlePaddle == 2.3.1
- Pillow == 8.4.0
- 安装paddlepaddle
# 安装GPU版本的Paddle
pip install paddlepaddle-gpu==2.3.1
更多安装方法可以参考:Paddle安装指南。
- 下载代码
git clone https://github.com/flytocc/MobileNeXt-paddle.git
cd MobileNeXt-paddle
- 安装requirements
pip install -r requirements.txt
参考 2.1 数据集,从官方下载数据后,按如下格式组织数据,即可在 PaddleClas 中使用 ImageNet1k 数据集进行训练。
imagenet/
|_ train/
| |_ n01440764
| | |_ n01440764_10026.JPEG
| | |_ ...
| |_ ...
| |
| |_ n15075141
| |_ ...
| |_ n15075141_9993.JPEG
|_ val/
| |_ ILSVRC2012_val_00000001.JPEG
| |_ ...
| |_ ILSVRC2012_val_00050000.JPEG
|_ train_list.txt
|_ val_list.txt
- 单机多卡训练
python -m paddle.distributed.launch --gpus=0,1,2,3 \
train.py \
/path/to/imagenet/ \
--config configs/train/mobilenext/MobileNeXt_100.yaml \
# --log_wandb --wandb_project MobileNeXt_100 \
# --cls_label_path_train /path/to/train_list.txt \
# --cls_label_path_val /path/to/val_list.txt \
ps: 如果未指定cls_label_path_train
/cls_label_path_val
,会读取data_dir
下train/val里的图片作为train-set/val-set。
部分训练日志如下所示。
Epoch: [15] [1900/2502] eta: 0:02:56 lr: 0.099087 loss: 3.1850 (3.1407) time: 0.2930 data: 0.0017
Epoch: [15] [1950/2502] eta: 0:02:41 lr: 0.099087 loss: 3.1298 (3.1401) time: 0.2977 data: 0.0017
python eval.py \
/path/to/imagenet/ \
# --cls_label_path_val /path/to/val_list.txt \
--model MobileNeXt_100 \
--batch_size 256 \
--interpolation bicubic \
--resume $TRAINED_MODEL
ps: 如果未指定cls_label_path_val
,会读取data_dir
/val里的图片作为val-set。
python predict.py \
--infer_imgs ./demo/ILSVRC2012_val_00020010.JPEG \
--model MobileNeXt_100 \
--interpolation bicubic \
--resume $TRAINED_MODEL
最终输出结果为
[{'class_ids': [178, 211, 246, 236, 209], 'scores': [0.8502025604248047, 0.01571478880941868, 0.013417884707450867, 0.003637149930000305, 0.003541758982464671], 'file_name': './demo/ILSVRC2012_val_00020010.JPEG', 'label_names': ['Weimaraner', 'vizsla, Hungarian pointer', 'Great Dane', 'Doberman, Doberman pinscher', 'Chesapeake Bay retriever']}]
表示预测的类别为Weimaraner(魏玛猎狗)
,ID是178
,置信度为0.8502025604248047
。
python export_model.py \
--model MobileNeXt_100 \
--output /path/to/save/export_model/ \
--resume $TRAINED_MODEL
python infer.py \
--interpolation bicubic \
--model_file /path/to/save/export_model/model.pdmodel \
--params_file /path/to/save/export_model/model.pdiparams \
--input_file ./demo/ILSVRC2012_val_00020010.JPEG
输出结果为
[{'class_ids': [178, 211, 246, 236, 209], 'scores': [0.8507419228553772, 0.015670042484998703, 0.013438238762319088, 0.0036271170247346163, 0.0035393161233514547], 'file_name': './demo/ILSVRC2012_val_00020010.JPEG', 'label_names': ['Weimaraner', 'vizsla, Hungarian pointer', 'Great Dane', 'Doberman, Doberman pinscher', 'Chesapeake Bay retriever']}]
表示预测的类别为Weimaraner(魏玛猎狗)
,ID是178
,置信度为0.8507419228553772
。与predict.py结果的误差在正常范围内。
This project is released under BSD License.
- Rethinking Bottleneck Structure for Efficient Mobile Network Design: https://arxiv.org/pdf/2007.02269.pdf
- MobileNeXt: https://github.com/yitu-opensource/MobileNeXt
- rethinking_bottleneck_design: https://github.com/zhoudaquan/rethinking_bottleneck_design
@article{zhou2020rethinking,
title={Rethinking Bottleneck Structure for Efficient Mobile Network Design},
author={Zhou, Daquan and Hou, Qibin and Chen, Yunpeng and Feng, Jiashi and Yan, Shuicheng},
journal={ECCV, August},
year={2020}
}