中文 | English
图像分类是计算机视觉的重要领域,它的目标是将图像分类到预定义的标签。近期,许多研究者提出很多不同种类的神经网络,并且极大的提升了分类算法的性能。本页将介绍如何使用PaddlePaddle进行图像分类。
同时推荐用户参考 IPython Notebook demo
在当前目录下运行样例代码需要python 2.7及以上版本,PadddlePaddle Fluid v1.6或以上的版本。如果你的运行环境中的PaddlePaddle低于此版本,请根据 安装文档 中的说明来更新PaddlePaddle。
python >= 2.7 运行训练代码需要安装numpy,cv2
pip install opencv-python
pip install numpy
下面给出了ImageNet分类任务的样例, 在Linux系统下通过如下的方式进行数据的准备:
cd data/ILSVRC2012/
sh download_imagenet2012.sh
在download_imagenet2012.sh
脚本中,通过下面三步来准备数据:
步骤一: 首先在image-net.org
网站上完成注册,用于获得一对Username
和AccessKey
。
步骤二: 从ImageNet官网下载ImageNet-2012的图像数据。训练以及验证数据集会分别被下载到"train" 和 "val" 目录中。注意,ImageNet数据的大小超过140GB,下载非常耗时;已经自行下载ImageNet的用户可以直接将数据组织放置到data/ILSVRC2012
。
步骤三: 下载训练与验证集合对应的标签文件。下面两个文件分别包含了训练集合与验证集合中图像的标签:
- train_list.txt: ImageNet-2012训练集合的标签文件,每一行采用"空格"分隔图像路径与标注,例如:
train/n02483708/n02483708_2436.jpeg 369
- val_list.txt: ImageNet-2012验证集合的标签文件,每一行采用"空格"分隔图像路径与标注,例如:
val/ILSVRC2012_val_00000001.jpeg 65
注意:可能需要根据本地环境调整reader.py中相关路径来正确读取数据。
Windows系统下请用户自行下载ImageNet数据,label下载链接
数据准备完毕后,可以通过如下的方式启动训练:
export CUDA_VISIBLE_DEVICES=0,1,2,3
export FLAGS_fraction_of_gpu_memory_to_use=0.98
python train.py \
--data_dir=./data/ILSVRC2012/ \
--total_images=1281167 \
--class_dim=1000 \
--validate=True \
--model=ResNet50_vd \
--batch_size=256 \
--lr_strategy=cosine_decay \
--lr=0.1 \
--num_epochs=200 \
--model_save_dir=output/ \
--l2_decay=7e-5 \
--use_mixup=True \
--use_label_smoothing=True \
--label_smoothing_epsilon=0.1
注意:
- 当添加如step_epochs这种列表型参数,需要去掉"=",如:--step_epochs 10 20 30
- 如果需要训练自己的数据集,则需要修改根据自己的数据集修改
data_dir
,total_images
,class_dim
参数;如果因为GPU显存不够而需要调整batch_size
,则参数lr
也需要根据batch_size
进行线性调整。 - 如果需要使用其他模型进行训练,则需要修改
model
参数,也可以在scripts/train/
文件夹中根据对应模型的默认运行脚本进行修改并训练。
或通过run.sh 启动训练
bash run.sh train 模型名
多进程模型训练:
如果你有多张GPU卡的话,我们强烈建议你使用多进程模式来训练模型,这会极大的提升训练速度。启动方式如下:
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch train.py \
--model=ResNet50 \
--batch_size=256 \
--total_images=1281167 \
--class_dim=1000 \
--image_shape 3 224 224 \
--model_save_dir=output/ \
--lr_strategy=piecewise_decay \
--reader_thread=4 \
--lr=0.1
或者参考 scripts/train/ResNet50_dist.sh
参数说明:
环境配置部分:
- data_dir: 数据存储路径,默认值: "./data/ILSVRC2012/"
- model_save_dir: 模型存储路径,默认值: "output/"
- pretrained_model: 加载预训练模型路径,默认值: None
- checkpoint: 加载用于继续训练的检查点(指定具体模型存储路径,如"output/ResNet50/100/"),默认值: None
- print_step: 打印训练信息的batch步数,默认值:10
- save_step: 保存模型的epoch步数,默认值:1
模型类型和超参配置:
- model: 模型名称, 默认值: "ResNet50"
- total_images: 图片数,ImageNet2012,默认值: 1281167
- class_dim: 类别数,默认值: 1000
- image_shape: 图片大小,默认值: [3,224,224]
- num_epochs: 训练回合数,默认值: 120
- batch_size: batch size大小(所有设备),默认值: 8
- test_batch_size: 测试batch大小,默认值:16
- lr_strategy: 学习率变化策略,默认值: "piecewise_decay"
- lr: 初始学习率,默认值: 0.1
- l2_decay: l2_decay值,默认值: 1e-4
- momentum_rate: momentum_rate值,默认值: 0.9
- step_epochs: piecewise dacay的decay step,默认值:[30,60,90]
- decay_epochs: exponential decay的间隔epoch数, 默认值: 2.4.
- decay_rate: exponential decay的下降率, 默认值: 0.97.
数据读取器和预处理配置:
- lower_scale: 数据随机裁剪处理时的lower scale值, upper scale值固定为1.0,默认值:0.08
- lower_ratio: 数据随机裁剪处理时的lower ratio值,默认值:3./4.
- upper_ratio: 数据随机裁剪处理时的upper ratio值,默认值:4./3.
- resize_short_size: 指定数据处理时改变图像大小的短边值,默认值: 256
- use_mixup: 是否对数据进行mixup处理,默认值: False
- mixup_alpha: 指定mixup处理时的alpha值,默认值: 0.2
- use_aa: 是否对数据进行auto augment处理. 默认值: False.
- reader_thread: 多线程reader的线程数量,默认值: 8
- reader_buf_size: 多线程reader的buf_size, 默认值: 2048
- interpolation: 插值方法, 默认值:None
- image_mean: 图片均值,默认值:[0.485, 0.456, 0.406]
- image_std: 图片std,默认值:[0.229, 0.224, 0.225]
一些开关:
- validate: 是否在模型训练过程中启动模型测试,默认值: True
- use_gpu: 是否在GPU上运行,默认值: True
- use_label_smoothing: 是否对数据进行label smoothing处理,默认值: False
- label_smoothing_epsilon: label_smoothing的epsilon, 默认值:0.1
- padding_type: efficientNet中卷积操作的padding方式, 默认值: "SAME".
- use_se: efficientNet中是否使用Squeeze-and-Excitation模块, 默认值: True.
- use_ema: 是否在更新模型参数时使用ExponentialMovingAverage. 默认值: False.
- ema_decay: ExponentialMovingAverage的decay rate. 默认值: 0.9999.
性能分析:
- enable_ce: 是否开启CE,默认值: False
- random_seed: 随机数种子,当设置数值后,所有随机化会被固定,默认值: None
- is_profiler: 是否开启性能分析,默认值: 0
- profilier_path: 分析文件保存位置,默认值: 'profiler_path/'
- max_iter: 最大训练batch数,默认值: 0
- same_feed: 是否feed相同数据进入网络,设定具体数值来指定数据数量,默认值:0
数据读取器说明: 数据读取器定义在reader.py
文件中,现在默认基于cv2的数据读取器, 在训练阶段,默认采用的增广方式是随机裁剪与水平翻转, 而在模型评估与模型预测阶段用的默认方式是中心裁剪。当前支持的数据增广方式有:
- 旋转
- 颜色抖动
- 随机裁剪
- 中心裁剪
- 长宽调整
- 水平翻转
- 自动增广
参数微调(Finetune)是指在特定任务上微调已训练模型的参数。可以下载已发布模型及其性能并且设置path_to_pretrain_model
为模型所在路径,微调一个模型可以采用如下的命令:
export CUDA_VISIBLE_DEVICES=0,1,2,3
export FLAGS_fraction_of_gpu_memory_to_use=0.98
python train.py \
--data_dir=./data/ILSVRC2012/ \
--total_images=1281167 \
--class_dim=1000 \
--validate=True \
--model=ResNet50_vd \
--batch_size=256 \
--lr=0.1 \
--num_epochs=200 \
--model_save_dir=output/ \
--l2_decay=7e-5 \
--pretrained_model=${path_to_pretrain_model} \
--finetune_exclude_pretrained_params=fc_0.w_0,fc_0.b_0
注意:
- 在自己的数据集上进行微调时,则需要修改根据自己的数据集修改
data_dir
,total_images
,class_dim
参数。 - 加载的参数是ImageNet1000的预训练模型参数,对于相同模型,最后的类别数或者含义可能不同,因此在加载预训练模型参数时,需要过滤掉最后的FC层,否则可能会因为维度不匹配而报错。
模型评估(Eval)是指对训练完毕的模型评估各类性能指标。可以下载已发布模型及其性能并且设置path_to_pretrain_model
为模型所在路径,json_path
为保存指标的路径。运行如下的命令,可以获得模型top-1/top-5精度。
参数说明
- save_json_path: 是否将eval结果保存到json文件中,默认值:None
model
: 模型名称,与预训练模型需保持一致。batch_size
: 每个minibatch评测的图片个数。data_dir
: 数据路径。注意:该路径下需要同时包括待评估的图片文件以及图片和对应类别标注的映射文本文件,文本文件名称需为val.txt
。
export CUDA_VISIBLE_DEVICES=0,1,2,3
export FLAGS_fraction_of_gpu_memory_to_use=0.98
python eval.py \
--model=ResNet50_vd \
--pretrained_model=${path_to_pretrain_model} \
--data_dir=./data/ILSVRC2012/ \
--save_json_path=${json_path} \
--batch_size=256
注意: 如果你使用指数滑动平均来训练模型(--use_ema=True),并且想要评估指数滑动平均后的模型,需要使用ema_clean.py将训练中保存下来的ema模型名字转换成原始模型参数的名字。
python ema_clean.py \
--ema_model_dir=your_ema_model_dir \
--cleaned_model_dir=your_cleaned_model_dir
python eval.py \
--model=ResNet50_vd \
--pretrained_model=your_cleaned_model_dir
模型预测(Infer)可以获取一个模型的预测分数或者图像的特征,可以下载已发布模型及其性能并且设置path_to_pretrain_model
为模型所在路径,test_res_json_path
为模型预测结果保存的文本路径,image_path
为模型预测的图片路径或者图片列表所在的文件夹路径。
参数说明:
- data_dir: 数据存储位置,默认值:
/data/ILSVRC2012/val/
- save_inference: 是否保存二进制模型,默认值:
False
- topk: 按照置信由高到低排序标签结果,返回的结果数量,默认值:1
- class_map_path: 可读标签文件路径,默认值:
./utils/tools/readable_label.txt
- image_path: 指定单文件进行预测,默认值:
None
- save_json_path: 将预测结果保存到json文件中,默认值:
test_res.json
export CUDA_VISIBLE_DEVICES=0
python infer.py \
--model=ResNet50_vd \
--class_dim=1000 \
--pretrained_model=${path_to_pretrain_model} \
--class_map_path=./utils/tools/readable_label.txt \
--image_path=${image_path} \
--save_json_path=${test_res_json_path}
- 该种情况下,需要指定
data_dir
路径和batch_size
。
export CUDA_VISIBLE_DEVICES=0,1,2,3
python infer.py \
--model=ResNet50_vd \
--class_dim=1000 \
--pretrained_model=${path_to_pretrain_model} \
--class_map_path=./utils/tools/readable_label.txt \
--data_dir=${data_dir} \
--save_json_path=${test_res_json_path} \
--batch_size=${batch_size}
注意:
- 模型名称需要与该模型训练时保持一致。
- 模型预测默认ImageNet1000类类别,预测数值和可读标签的map文件存储在
./utils/tools/readable_label.txt
中,如果使用自定义数据,请指定--class_map_path
参数。
- Fluid提供了高度优化的C++预测库,为了方便使用,Paddle也提供了C++预测库对应的Python接口,更加具体的Python预测API介绍可以参考这里:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_usage/deploy/inference/python_infer_cn.html
- 使用Python预测API进行模型预测的步骤有模型转换和模型预测,详细介绍如下。
- 首先将保存的fluid模型转换为二进制模型,转换方法如下,其中
path_to_pretrain_model
表示预训练模型的路径。
python infer.py \
--model=ResNet50_vd \
--pretrained_model=${path_to_pretrain_model} \
--save_inference=True
注意:
- 预训练模型和模型名称需要保持一致。
- 在转换模型时,使用
save_inference_model
函数进行模型转换,参数feeded_var_names
表示模型预测时所需提供数据的所有变量名称;参数target_vars
表示模型的所有输出变量,通过这些输出变量即可得到模型的预测结果。 - 转换完成后,会在
ResNet50_vd
文件下生成model
和params
文件。
根据转换的模型二进制文件,基于Python API的预测方法如下,其中model_path
表示model文件的路径,params_path
表示params文件的路径,image_path
表示图片文件的路径。
python predict.py \
--model_file=./ResNet50_vd/model \
--params_file=./ResNet50_vd/params \
--image_path=${image_path} \
--gpu_id=0 \
--gpu_mem=1024
注意:
- 这里只提供了预测单张图片的脚本,如果需要预测文件夹内的多张图片,需要自己修改预测文件
predict.py
。 - 参数
gpu_id
指定了当前使用的GPU ID号,参数gpu_mem
指定了初始化的GPU显存。
训练中指定 --use_mixup=True 开启Mixup训练,本模型库中所有后缀为_vd的模型即代表开启Mixup训练
Mixup相关介绍参考mixup: Beyond Empirical Risk Minimization
通过指定--use_fp16=True 启动混合精度训练,在训练过程中会使用float16数据类型,并输出float32的模型参数。您可能需要同时传入--scale_loss来解决fp16训练的精度问题,如传入--scale_loss=128.0。
在配置好数据集路径后(修改scripts/train/ResNet50_fp16.sh文件中DATA_DIR
的值),对ResNet50模型进行混合精度训练可通过运行bash run.sh train ResNet50_fp16
命令完成。
多机多卡ResNet50模型的混合精度训练请参考PaddlePaddle/Fleet。
使用Tesla V100单机8卡、2机器16卡、4机器32卡,对ResNet50模型进行混合精度训练的结果如下(开启DALI):
- BatchSize = 256
节点数*卡数 | 吞吐 | 加速比 | test_acc1 | test_acc5 |
---|---|---|---|---|
1*1 | 1035 ins/s | 1 | 0.75333 | 0.92702 |
1*8 | 7840 ins/s | 7.57 | 0.75603 | 0.92771 |
2*8 | 14277 ins/s | 13.79 | 0.75872 | 0.92793 |
4*8 | 28594 ins/s | 27.63 | 0.75253 | 0.92713 |
- BatchSize = 128
节点数*卡数 | 吞吐 | 加速比 | test_acc1 | test_acc5 |
---|---|---|---|---|
1*1 | 936 ins/s | 1 | 0.75280 | 0.92531 |
1*8 | 7108 ins/s | 7.59 | 0.75832 | 0.92771 |
2*8 | 12343 ins/s | 13.18 | 0.75766 | 0.92723 |
4*8 | 24407 ins/s | 26.07 | 0.75859 | 0.92871 |
注意:本部分主要为内部测试功能。 其中包括启动CE以监测模型运行的稳定性,启动profiler以测试benchmark,启动same_feed来进行快速调试。
启动CE会固定随机初始化,其中包括数据读取器中的shuffle和program的random_seed
python train.py \
--enable_ce=True \
--data_dir=${path_to_a_smaller_dataset}
启动profiler进行性能分析
python train.py \
--is_profiler=True
设置same_feed参数以进行快速调试, 相同的图片(same_feed张图片)将传入网络中
python train.py \
--same_feed=8 \
--batch_size=4 \
--print_step=1
使用Nvidia DALI预处理类库可以加速训练并提高GPU利用率。
DALI预处理目前支持标准ImageNet处理步骤( random crop -> resize -> flip -> normalize),并且支持列表文件或者文件夹方式的数据集格式。
指定--use_dali=True
即可开启DALI预处理,如下面的例子中,使用DALI训练ShuffleNet v2 0.25x,在8卡v100上,图片吞吐可以达到10000张/秒以上,GPU利用率在85%以上。
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export FLAGS_fraction_of_gpu_memory_to_use=0.80
python -m paddle.distributed.launch train.py \
--model=ShuffleNetV2_x0_25 \
--batch_size=2048 \
--lr_strategy=cosine_decay_warmup \
--num_epochs=240 \
--lr=0.5 \
--l2_decay=3e-5 \
--lower_scale=0.64 \
--lower_ratio=0.8 \
--upper_ratio=1.2 \
--use_dali=True
更多DALI相关用例请参考DALI Paddle插件文档。
- 请务必使用GCC5.4以上编译器编译安装的1.6或以上版本paddlepaddle, 另外,请在编译过程中指定-DWITH_DISTRIBUTE=ON 来启动多进程训练模式。注意:官方的paddlepaddle是GCC4.8编译的,请务必检查此项,或参考使用已经编译好的whl包
- Nvidia DALI需要使用#1371以后的git版本。请参考此文档安装nightly版本或从源码安装。
- 因为DALI使用GPU进行图片预处理,需要占用部分显存,请适当调整
FLAGS_fraction_of_gpu_memory_to_use
环境变量(如0.8
)来预留部分显存供DALI使用。
表格中列出了在models目录下目前支持的图像分类模型,并且给出了已完成训练的模型在ImageNet-2012验证集合上的top-1和top-5精度,以及Paddle Fluid和Paddle TensorRT基于动态链接库的预测时间(测试GPU型号为NVIDIA® Tesla® P4)。 可以通过点击相应模型的名称下载对应的预训练模型。
- 特殊参数配置
Model | 输入图像分辨率 | 参数 resize_short_size |
Inception, Xception | 299 | 320 |
DarkNet53 | 256 | 256 |
Fix_ResNeXt101_32x48d_wsl | 320 | 320 |
EfficientNet: 预测时的resize_short_size在其分辨率的长或高的基础上加32 在该系列模型训练和预测的过程中 图片resize参数interpolation的值设置为2(cubic插值方式) 该模型在训练过程中使用了指数滑动平均策略 具体请参考指数滑动平均 |
B0: 224 | 256 |
B1: 240 | 272 | |
B2: 260 | 292 | |
B3: 300 | 332 | |
B4: 380 | 412 | |
B5: 456 | 488 | |
B6: 528 | 560 | |
B7: 600 | 632 | |
其余分类模型 | 224 | 256 |
-
调用动态链接库预测时需要将训练模型转换为二进制模型。
python infer.py \ --model=ResNet50_vd \ --pretrained_model=${path_to_pretrain_model} \ --save_inference=True
-
ResNeXt101_wsl系列的预训练模型转自pytorch模型,详情见ResNeXt wsl。
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
AlexNet | 56.72% | 79.17% | 3.083 | 2.566 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
SqueezeNet1_0 | 59.60% | 81.66% | 2.740 | 1.719 |
SqueezeNet1_1 | 60.08% | 81.85% | 2.751 | 1.282 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
VGG11 | 69.28% | 89.09% | 8.223 | 6.619 |
VGG13 | 70.02% | 89.42% | 9.512 | 7.566 |
VGG16 | 72.00% | 90.69% | 11.315 | 8.985 |
VGG19 | 72.56% | 90.93% | 13.096 | 9.997 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
MobileNetV1_x0_25 | 51.43% | 75.46% | 2.283 | 0.838 |
MobileNetV1_x0_5 | 63.52% | 84.73% | 2.378 | 1.052 |
MobileNetV1_x0_75 | 68.81% | 88.23% | 2.540 | 1.376 |
MobileNetV1 | 70.99% | 89.68% | 2.609 | 1.615 |
MobileNetV2_x0_25 | 53.21% | 76.52% | 4.267 | 2.791 |
MobileNetV2_x0_5 | 65.03% | 85.72% | 4.514 | 3.008 |
MobileNetV2_x0_75 | 69.83% | 89.01% | 4.313 | 3.504 |
MobileNetV2 | 72.15% | 90.65% | 4.546 | 3.874 |
MobileNetV2_x1_5 | 74.12% | 91.67% | 5.235 | 4.771 |
MobileNetV2_x2_0 | 75.23% | 92.58% | 6.680 | 5.649 |
MobileNetV3_small_x1_0 | 67.46% | 87.12% | 6.809 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
ShuffleNetV2 | 68.80% | 88.45% | 6.101 | 3.616 |
ShuffleNetV2_x0_25 | 49.90% | 73.79% | 5.956 | 2.505 |
ShuffleNetV2_x0_33 | 53.73% | 77.05% | 5.896 | 2.519 |
ShuffleNetV2_x0_5 | 60.32% | 82.26% | 6.048 | 2.642 |
ShuffleNetV2_x1_5 | 71.63% | 90.15% | 6.113 | 3.164 |
ShuffleNetV2_x2_0 | 73.15% | 91.20% | 6.430 | 3.954 |
ShuffleNetV2_swish | 70.03% | 89.17% | 6.078 | 4.976 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
DARTS_4M | 75.23% | 92.15% | 13.572 | 6.335 |
DARTS_6M | 76.03% | 92.79% | 16.406 | 6.864 |
- AutoDL基于可微结构搜索思路DARTS改进,引入Local Rademacher Complexity控制过拟合,并通过Resource Constraining灵活调整模型大小。
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
ResNet18 | 70.98% | 89.92% | 3.456 | 2.261 |
ResNet18_vd | 72.26% | 90.80% | 3.847 | 2.404 |
ResNet34 | 74.57% | 92.14% | 5.668 | 3.424 |
ResNet34_vd | 75.98% | 92.98% | 6.089 | 3.544 |
ResNet50 | 76.50% | 93.00% | 8.787 | 5.137 |
ResNet50_vc | 78.35% | 94.03% | 9.013 | 5.285 |
ResNet50_vd | 79.12% | 94.44% | 9.058 | 5.259 |
ResNet50_vd_v21 | 79.84% | 94.93% | 9.058 | 5.259 |
ResNet101 | 77.56% | 93.64% | 15.447 | 8.473 |
ResNet101_vd | 80.17% | 94.97% | 15.685 | 8.574 |
ResNet152 | 78.26% | 93.96% | 21.816 | 11.646 |
ResNet152_vd | 80.59% | 95.30% | 22.041 | 11.858 |
ResNet200_vd | 80.93% | 95.33% | 28.015 | 14.896 |
[1] 该预训练模型是在ResNet50_vd的预训练模型继续蒸馏得到的,用户可以通过ResNet50_vd的结构直接加载该预训练模型。
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
Res2Net50_26w_4s | 79.33% | 94.57% | 10.731 | 8.274 |
Res2Net50_vd_26w_4s | 79.75% | 94.91% | 11.012 | 8.493 |
Res2Net50_14w_8s | 79.46% | 94.70% | 16.937 | 10.205 |
Res2Net101_vd_26w_4s | 80.64% | 95.22% | 19.612 | 14.651 |
Res2Net200_vd_26w_4s | 81.21% | 95.71% | 35.809 | 26.479 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
ResNeXt50_32x4d | 77.75% | 93.82% | 12.863 | 9.241 |
ResNeXt50_vd_32x4d | 79.56% | 94.62% | 13.673 | 9.162 |
ResNeXt50_64x4d | 78.43% | 94.13% | 28.162 | 15.935 |
ResNeXt50_vd_64x4d | 80.12% | 94.86% | 20.888 | 15.938 |
ResNeXt101_32x4d | 78.65% | 94.19% | 24.154 | 17.661 |
ResNeXt101_vd_32x4d | 80.33% | 95.12% | 24.701 | 17.249 |
ResNeXt101_64x4d | 78.35% | 94.52% | 41.073 | 31.288 |
ResNeXt101_vd_64x4d | 80.78% | 95.20% | 42.277 | 32.620 |
ResNeXt152_32x4d | 78.98% | 94.33% | 37.007 | 26.981 |
ResNeXt152_vd_32x4d | 80.72% | 95.20% | 35.783 | 26.081 |
ResNeXt152_64x4d | 79.51% | 94.71% | 58.966 | 47.915 |
ResNeXt152_vd_64x4d | 81.08% | 95.34% | 60.947 | 47.406 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
DenseNet121 | 75.66% | 92.58% | 12.437 | 5.592 |
DenseNet161 | 78.57% | 94.14% | 27.717 | 12.254 |
DenseNet169 | 76.81% | 93.31% | 18.941 | 7.742 |
DenseNet201 | 77.63% | 93.66% | 26.583 | 10.066 |
DenseNet264 | 77.96% | 93.85% | 41.495 | 14.740 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
DPN68 | 76.78% | 93.43% | 18.446 | 6.199 |
DPN92 | 79.85% | 94.80% | 25.748 | 21.029 |
DPN98 | 80.59% | 95.10% | 29.421 | 13.411 |
DPN107 | 80.89% | 95.32% | 41.071 | 18.885 |
DPN131 | 80.70% | 95.14% | 41.179 | 18.246 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
SE_ResNet18_vd | 73.33% | 91.38% | 4.715 | 3.061 |
SE_ResNet34_vd | 76.51% | 93.20% | 7.475 | 4.299 |
SE_ResNet50_vd | 79.52% | 94.75% | 10.345 | 7.631 |
SE_ResNeXt50_32x4d | 78.44% | 93.96% | 14.916 | 12.305 |
SE_ResNeXt50_vd_32x4d | 80.24% | 94.89% | 15.155 | 12.687 |
SE_ResNeXt101_32x4d | 79.12% | 94.20% | 30.085 | 23.218 |
SENet154_vd | 81.40% | 95.48% | 71.892 | 53.131 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
GoogLeNet | 70.70% | 89.66% | 6.528 | 2.919 |
Xception41 | 79.30% | 94.53% | 13.757 | 7.885 |
Xception41_deeplab | 79.55% | 94.38% | 14.268 | 7.257 |
Xception65 | 81.00% | 95.49% | 19.216 | 10.742 |
Xception65_deeplab | 80.32% | 94.49% | 19.536 | 10.713 |
Xception71 | 81.11% | 95.45% | 23.291 | 12.154 |
InceptionV4 | 80.77% | 95.26% | 32.413 | 17.728 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
DarkNet53 | 78.04% | 94.05% | 11.969 | 6.300 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
ResNeXt101_32x8d_wsl | 82.55% | 96.74% | 33.310 | 27.628 |
ResNeXt101_32x16d_wsl | 84.24% | 97.26% | 54.320 | 47.599 |
ResNeXt101_32x32d_wsl | 84.97% | 97.59% | 97.734 | 81.660 |
ResNeXt101_32x48d_wsl | 85.37% | 97.69% | 161.722 | |
Fix_ResNeXt101_32x48d_wsl | 86.26% | 97.97% | 236.091 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
EfficientNetB0 | 77.38% | 93.31% | 10.303 | 4.334 |
EfficientNetB12 | 79.15% | 94.41% | 15.626 | 6.502 |
EfficientNetB22 | 79.85% | 94.74% | 17.847 | 7.558 |
EfficientNetB32 | 81.15% | 95.41% | 25.993 | 10.937 |
EfficientNetB42 | 82.85% | 96.23% | 47.734 | 18.536 |
EfficientNetB52 | 83.62% | 96.72% | 88.578 | 32.102 |
EfficientNetB62 | 84.00% | 96.88% | 138.670 | 51.059 |
EfficientNetB72 | 84.30% | 96.89% | 234.364 | 82.107 |
EfficientNetB0_small3 | 75.80% | 92.58% | 3.342 | 2.729 |
[3] 表示该预训练权重是在EfficientNetB0的基础上去除se模块,并使用通用的卷积训练的,精度稍稍下降,但是速度大幅提升。
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
HRNet_W18_C | 76.92% | 93.39% | 23.013 | 11.601 |
HRNet_W30_C | 78.04% | 94.02% | 25.793 | 14.367 |
HRNet_W32_C | 78.28% | 94.24% | 29.564 | 14.328 |
HRNet_W40_C | 78.77% | 94.47% | 33.880 | 17.616 |
HRNet_W44_C | 79.00% | 94.51% | 36.021 | 18.990 |
HRNet_W48_C | 78.95% | 94.42% | 30.064 | 19.963 |
HRNet_W64_C | 79.30% | 94.61% | 38.921 | 24.742 |
Model | Top-1 | Top-5 | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|---|
ResNet50_ACNet1 | 76.71% | 93.24% | 13.205 | 8.804 |
ResNet50_ACNet2 | 76.71% | 93.24% | 7.418 | 5.950 |
- 注:
1
. 不对训练模型结果进行参数转换,进行评估。2
. 使用sh ./utils/acnet/convert_model.sh
命令对训练模型结果进行参数转换,并设置deploy mode=True
,进行评估。./utils/acnet/convert_model.sh
包含4个参数,分别是模型名称、输入的模型地址、输出的模型地址以及类别数量。
Q: 加载预训练模型报错,Enforce failed. Expected x_dims[1] == labels_dims[1], but received x_dims[1]:1000 != labels_dims[1]:6.
A: 类别数匹配不上,删掉最后一层分类层FC
Q: reader中报错AttributeError: 'NoneType' object has no attribute 'shape'
A: 文件路径load错误
Q: 出现cudaStreamSynchronize an illegal memory access was encountered errno:77 错误
A: 可能是因为显存问题导致,添加如下环境变量:
export FLAGS_fast_eager_deletion_mode=1
export FLAGS_eager_delete_tensor_gb=0.0
export FLAGS_fraction_of_gpu_memory_to_use=0.98
- AlexNet: imagenet-classification-with-deep-convolutional-neural-networks, Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton
- ResNet: Deep Residual Learning for Image Recognitio, Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
- ResNeXt: Aggregated Residual Transformations for Deep Neural Networks, Saining Xie, Ross Girshick, Piotr Dollár, Zhuowen Tu, Kaiming He
- SeResNeXt: Squeeze-and-Excitation NetworksJie Hu, Li Shen, Samuel Albanie
- ShuffleNetV1: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices, Xiangyu Zhang, Xinyu Zhou, Mengxiao Lin, Jian Sun
- ShuffleNetV2: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design, Ningning Ma, Xiangyu Zhang, Hai-Tao Zheng, Jian Sun
- MobileNetV1: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam
- MobileNetV2: MobileNetV2: Inverted Residuals and Linear Bottlenecks, Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, Liang-Chieh Chen
- MobileNetV3: Searching for MobileNetV3, Andrew Howard, Mark Sandler, Grace Chu, Liang-Chieh Chen, Bo Chen, Mingxing Tan, Weijun Wang, Yukun Zhu, Ruoming Pang, Vijay Vasudevan, Quoc V. Le, Hartwig Adam
- VGG: Very Deep Convolutional Networks for Large-scale Image Recognition, Karen Simonyan, Andrew Zisserman
- GoogLeNet: Going Deeper with Convolutions, Christian Szegedy1, Wei Liu2, Yangqing Jia
- Xception: Xception: Deep Learning with Depthwise Separable Convolutions, Franc ̧ois Chollet
- InceptionV4: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi
- DarkNet: YOLOv3: An Incremental Improvement, Joseph Redmon, Ali Farhadi
- DenseNet: Densely Connected Convolutional Networks, Gao Huang, Zhuang Liu, Laurens van der Maaten
- DPN: Dual Path Networks, Yunpeng Chen, Jianan Li, Huaxin Xiao, Xiaojie Jin, Shuicheng Yan, Jiashi Feng
- SqueezeNet: SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE, Forrest N. Iandola, Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, Kurt Keutzer
- ResNeXt101_wsl: Exploring the Limits of Weakly Supervised Pretraining, Dhruv Mahajan, Ross Girshick, Vignesh Ramanathan, Kaiming He, Manohar Paluri, Yixuan Li, Ashwin Bharambe, Laurens van der Maaten
- Fix_ResNeXt101_wsl: Fixing the train-test resolution discrepancy, Hugo Touvron, Andrea Vedaldi, Matthijs Douze, Herve ́ Je ́gou
- EfficientNet: EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks, Mingxing Tan, Quoc V. Le
- Res2Net: Res2Net: A New Multi-scale Backbone Architecture, Shang-Hua Gao, Ming-Ming Cheng, Kai Zhao, Xin-Yu Zhang, Ming-Hsuan Yang, Philip Torr
- HRNet: Deep High-Resolution Representation Learning for Visual Recognition, Jingdong Wang, Ke Sun, Tianheng Cheng, Borui Jiang, Chaorui Deng, Yang Zhao, Dong Liu, Yadong Mu, Mingkui Tan, Xinggang Wang, Wenyu Liu, Bin Xiao
- DARTS: DARTS: Differentiable Architecture Search, Hanxiao Liu, Karen Simonyan, Yiming Yang
- ACNet: ACNet: Strengthening the Kernel Skeletons for Powerful CNN via Asymmetric Convolution Blocks, Xiaohan Ding, Yuchen Guo, Guiguang Ding, Jungong Han
- 2018/12/03 Stage1: 更新AlexNet,ResNet50,ResNet101,MobileNetV1
- 2018/12/23 Stage2: 更新VGG系列,SeResNeXt50_32x4d,SeResNeXt101_32x4d,ResNet152
- 2019/01/31 更新MobileNetV2_x1_0
- 2019/04/01 Stage3: 更新ResNet18,ResNet34,GoogLeNet,ShuffleNetV2
- 2019/06/12 Stage4: 更新ResNet50_vc,ResNet50_vd,ResNet101_vd,ResNet152_vd,ResNet200_vd,SE154_vd InceptionV4,ResNeXt101_64x4d,ResNeXt101_vd_64x4d
- 2019/06/22 更新ResNet50_vd_v2
- 2019/07/02 Stage5: 更新MobileNetV2_x0_5,ResNeXt50_32x4d,ResNeXt50_64x4d,Xception41,ResNet101_vd
- 2019/07/19 Stage6: 更新ShuffleNetV2_x0_25,ShuffleNetV2_x0_33,ShuffleNetV2_x0_5,ShuffleNetV2_x1_0,ShuffleNetV2_x1_5,ShuffleNetV2_x2_0,MobileNetV2_x0_25,MobileNetV2_x1_5,MobileNetV2_x2_0,ResNeXt50_vd_64x4d,ResNeXt101_32x4d,ResNeXt152_32x4d
- 2019/08/01 Stage7: 更新DarkNet53,DenseNet121,Densenet161,DenseNet169,DenseNet201,DenseNet264,SqueezeNet1_0,SqueezeNet1_1,ResNeXt50_vd_32x4d,ResNeXt152_64x4d,ResNeXt101_32x8d_wsl,ResNeXt101_32x16d_wsl,ResNeXt101_32x32d_wsl,ResNeXt101_32x48d_wsl,Fix_ResNeXt101_32x48d_wsl
- 2019/09/11 Stage8: 更新ResNet18_vd,ResNet34_vd,MobileNetV1_x0_25,MobileNetV1_x0_5,MobileNetV1_x0_75,MobileNetV2_x0_75,MobilenNetV3_small_x1_0,DPN68,DPN92,DPN98,DPN107,DPN131,ResNeXt101_vd_32x4d,ResNeXt152_vd_64x4d,Xception65,Xception71,Xception41_deeplab,Xception65_deeplab,SE_ResNet50_vd
- 2019/09/20 更新EfficientNet
- 2019/11/28 Stage9: 更新SE_ResNet18_vd,SE_ResNet34_vd,SE_ResNeXt50_vd_32x4d,ResNeXt152_vd_32x4d,Res2Net50_26w_4s,Res2Net50_14w_8s,Res2Net50_vd_26w_4s,HRNet_W18_C,HRNet_W30_C,HRNet_W32_C,HRNet_W40_C,HRNet_W44_C,HRNet_W48_C,HRNet_W64_C
- 2020/01/07 Stage10: 更新AutoDL Series
- 2020/01/09 Stage11: 更新Res2Net101_vd_26w_4s, Res2Net200_vd_26w_4s
如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。