图像分类是计算机视觉的重要领域,它的目标是将图像分类到预定义的标签。近期,许多研究者提出很多不同种类的神经网络,并且极大的提升了分类算法的性能。本页将介绍如何使用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) |
---|---|---|---|
VGG11 | 69.28%/89.09% | 8.223 | 6.821 |
VGG13 | 70.02%/89.42% | 9.512 | 7.783 |
VGG16 | 72.00%/90.69% | 11.315 | 9.067 |
VGG19 | 72.56%/90.93% | 13.096 | 10.388 |
Q: 加载预训练模型报错,Enforce failed. Expected x_dims1 == labels_dims1, but received x_dims1:1000 != labels_dims1:6.
A: 维度对不上,删掉预训练参数中的FC
如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。