图像分类是计算机视觉的重要领域,它的目标是将图像分类到预定义的标签。近期,许多研究者提出很多不同种类的神经网络,并且极大的提升了分类算法的性能。本页将介绍如何使用PaddlePaddle进行图像分类。
在当前目录下运行样例代码需要python 2.7及以上版本,PadddlePaddle Fluid v1.5或以上的版本。如果你的运行环境中的PaddlePaddle低于此版本,请根据 installation document 中的说明来更新PaddlePaddle。
下面给出了ImageNet分类任务的样例,首先,通过如下的方式进行数据的准备:
cd data/ILSVRC2012/
sh download_imagenet2012.sh
在download_imagenet2012.sh
脚本中,通过下面三步来准备数据:
步骤一: 首先在image-net.org
网站上完成注册,用于获得一对Username
和AccessKey
。
步骤二: 从ImageNet官网下载ImageNet-2012的图像数据。训练以及验证数据集会分别被下载到"train" 和 "val" 目录中。请注意,ImaegNet数据的大小超过40GB,下载非常耗时;已经自行下载ImageNet的用户可以直接将数据组织放置到data/ILSVRC2012
。
步骤三: 下载训练与验证集合对应的标签文件。下面两个文件分别包含了训练集合与验证集合中图像的标签:
train/n02483708/n02483708_2436.jpeg 369
val/ILSVRC2012_val_00000001.jpeg 65
注意:可能需要根据本地环境调整reader.py相关路径来正确读取数据。
数据准备完毕后,可以通过如下的方式启动训练:
python train.py \
--model=SE_ResNeXt50_32x4d \
--batch_size=32 \
--total_images=1281167 \
--class_dim=1000 \
--image_shape=3,224,224 \
--model_save_dir=output/ \
--with_mem_opt=False \
--with_inplace=True \
--lr_strategy=piecewise_decay \
--lr=0.1
参数说明:
在run.sh
中有用于训练的脚本.
数据读取器说明: 数据读取器定义在PIL:reader.py
和CV2:reader_cv2.py
文件中,现在默认基于cv2的数据读取器, 在训练阶段, 默认采用的增广方式是随机裁剪与水平翻转, 而在模型评估与模型预测阶段用的默认方式是中心裁剪。当前支持的数据增广方式有:
参数微调是指在特定任务上微调已训练模型的参数。可以下载已有模型及其性能并且设置path_to_pretrain_model
为模型所在路径,微调一个模型可以采用如下的命令:
python train.py \
--pretrained_model=${path_to_pretrain_model}
注意:根据具体模型和任务添加并调整其他参数
模型评估是指对训练完毕的模型评估各类性能指标。可以下载已有模型及其性能并且设置path_to_pretrain_model
为模型所在路径。运行如下的命令,可以获得模型top-1/top-5精度:
python eval.py \
--pretrained_model=${path_to_pretrain_model}
注意:根据具体模型和任务添加并调整其他参数
模型预测可以获取一个模型的预测分数或者图像的特征,可以下载已有模型及其性能并且设置path_to_pretrain_model
为模型所在路径。运行如下的命令获得预测分数,:
python infer.py \
--pretrained_model=${path_to_pretrain_model}
注意:根据具体模型和任务添加并调整其他参数
可以通过开启--fp16=True
启动混合精度训练,这样训练过程会使用float16数据,并输出float32的模型参数("master"参数)。您可能需要同时传入--scale_loss
来解决fp16训练的精度问题,通常传入--scale_loss=8.0
即可。
注意,目前混合精度训练不能和内存优化功能同时使用,所以需要传--with_mem_opt=False
这个参数来禁用内存优化功能。
注意:CE相关代码仅用于内部测试,enable_ce默认设置False。
表格中列出了在models目录下目前支持的图像分类模型,并且给出了已完成训练的模型在ImageNet-2012验证集合上的top-1/top-5精度,以及Paddle Fluid和Paddle TensorRT基于动态链接库的预测时间(测 试GPU型号为Tesla P4)。由于Paddle TensorRT对ShuffleNetV2_swish使用的激活函数swish,MobileNetV2使用的激活函数relu6不支持,因此预测加速不明显。可以通过点击相应模型的名称下载对应的预训练模型。
注意
3:调用动态链接库预测时需要将训练模型转换为二进制模型
python infer.py --save_inference=True
4: ResNeXt101_wsl系列的预训练模型转自pytorch模型,详情请移步RESNEXT WSL。
model | top-1/top-5 accuracy(CV2) | Paddle Fluid inference time(ms) | Paddle TensorRT inference time(ms) |
---|---|---|---|
ResNet18 | 70.98%/89.92% | 3.456 | 2.484 |
ResNet34 | 74.57%/92.14% | 5.668 | 3.767 |
ResNet50 | 76.50%/93.00% | 8.787 | 5.434 |
ResNet50_vc | 78.35%/94.03% | 9.013 | 5.463 |
ResNet50_vd | 79.12%/94.44% | 9.058 | 5.510 |
ResNet50_vd_v2 | 79.84%/94.93% | 9.058 | 5.510 |
ResNet101 | 77.56%/93.64% | 15.447 | 8.779 |
ResNet101_vd | 80.17%/94.97% | 15.685 | 8.878 |
ResNet152 | 78.26%/93.96% | 21.816 | 12.148 |
ResNet152_vd | 80.59%/95.30% | 22.041 | 12.259 |
ResNet200_vd | 80.93%/95.33% | 28.015 | 15.278 |
Q: 加载预训练模型报错,Enforce failed. Expected x_dims1 == labels_dims1, but received x_dims1:1000 != labels_dims1:6.
A: 维度对不上,删掉预训练参数中的FC
如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。