From 843a00f7bb542d2a3ad69601f4b661d3e795bd8b Mon Sep 17 00:00:00 2001 From: Chris Yann Date: Fri, 15 Jun 2018 09:31:07 +0800 Subject: [PATCH] Image classification Networks Updating (#979) * Add more model configure, such as AlexNet, VGG, GoogleNet, DPN, ResNet etc. * Add download_imagenet2012.sh * Update doc. * Add Chinese doc. --- fluid/image_classification/README.md | 209 ++++++-- fluid/image_classification/README_cn.md | 209 ++++++++ fluid/image_classification/__init__.py | 0 .../data/ILSVRC2012/download_imagenet2012.sh | 40 ++ .../data/ILSVRC2012/unzip.sh | 9 - fluid/image_classification/eval.py | 138 ++++-- fluid/image_classification/images/curve.jpg | Bin 0 -> 74187 bytes fluid/image_classification/inception_v4.py | 467 ------------------ fluid/image_classification/infer.py | 97 ++-- fluid/image_classification/mobilenet.py | 155 ------ fluid/image_classification/models/__init__.py | 8 + fluid/image_classification/models/alexnet.py | 147 ++++++ fluid/image_classification/models/dpn.py | 281 +++++++++++ .../image_classification/models/googlenet.py | 164 ++++++ .../models/inception_v4.py | 204 ++++++++ .../models/learning_rate.py | 19 + .../image_classification/models/mobilenet.py | 164 ++++++ fluid/image_classification/models/resnet.py | 120 +++++ .../image_classification/models/se_resnext.py | 195 ++++++++ fluid/image_classification/models/vgg.py | 107 ++++ fluid/image_classification/reader.py | 20 +- fluid/image_classification/se_resnext.py | 138 ------ fluid/image_classification/train.py | 414 +++++----------- 23 files changed, 2109 insertions(+), 1196 deletions(-) create mode 100644 fluid/image_classification/README_cn.md create mode 100644 fluid/image_classification/__init__.py create mode 100644 fluid/image_classification/data/ILSVRC2012/download_imagenet2012.sh delete mode 100644 fluid/image_classification/data/ILSVRC2012/unzip.sh create mode 100644 fluid/image_classification/images/curve.jpg delete mode 100644 fluid/image_classification/inception_v4.py delete mode 100644 fluid/image_classification/mobilenet.py create mode 100644 fluid/image_classification/models/__init__.py create mode 100644 fluid/image_classification/models/alexnet.py create mode 100644 fluid/image_classification/models/dpn.py create mode 100644 fluid/image_classification/models/googlenet.py create mode 100644 fluid/image_classification/models/inception_v4.py create mode 100644 fluid/image_classification/models/learning_rate.py create mode 100644 fluid/image_classification/models/mobilenet.py create mode 100644 fluid/image_classification/models/resnet.py create mode 100644 fluid/image_classification/models/se_resnext.py create mode 100644 fluid/image_classification/models/vgg.py delete mode 100644 fluid/image_classification/se_resnext.py diff --git a/fluid/image_classification/README.md b/fluid/image_classification/README.md index 1000717c87..b8cd82a68a 100644 --- a/fluid/image_classification/README.md +++ b/fluid/image_classification/README.md @@ -1,38 +1,37 @@ -The minimum PaddlePaddle version needed for the code sample in this directory is the lastest develop branch. If you are on a version of PaddlePaddle earlier than this, [please update your installation](http://www.paddlepaddle.org/docs/develop/documentation/en/build_and_install/pip_install_en.html). +# Image Classification and Model Zoo +Image classification, which is an important field of computer vision, is to classify an image into pre-defined labels. Recently, many researchers developed different kinds of neural networks and highly improve the classification performance. This page introduces how to do image classification with PaddlePaddle Fluid, including [data preparation](#data-preparation), [training](#training-a-model), [finetuning](#finetuning), [evaluation](#evaluation) and [inference](#inference). --- +## Table of Contents +- [Installation](#installation) +- [Data preparation](#data-preparation) +- [Training a model with flexible parameters](#training-a-model) +- [Finetuning](#finetuning) +- [Evaluation](#evaluation) +- [Inference](#inference) +- [Supported models and performances](#supported-models) -# SE-ResNeXt for image classification +## Installation -This model built with paddle fluid is still under active development and is not -the final version. We welcome feedbacks. +Running sample code in this directory requires PaddelPaddle Fluid v0.13.0 and later. If the PaddlePaddle on your device is lower than this version, please follow the instructions in [installation document](http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/pip_install_cn.html) and make an update. -## Introduction +## Data preparation -The current code support the training of [SE-ResNeXt](https://arxiv.org/abs/1709.01507) (50/152 layers). +An example for ImageNet classification is as follows. First of all, preparation of imagenet data can be done as: +``` +cd data/ILSVRC2012/ +sh download_imagenet2012.sh +``` -## Data Preparation +In the shell script ```download_imagenet2012.sh```, there are three steps to prepare data: -1. Download ImageNet-2012 dataset -``` -cd data/ -mkdir -p ILSVRC2012/ -cd ILSVRC2012/ -# get training set -wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar -# get validation set -wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar -# prepare directory -tar xf ILSVRC2012_img_train.tar -tar xf ILSVRC2012_img_val.tar +**step-1:** Register at ```image-net.org``` first in order to get a pair of ```Username``` and ```AccessKey```, which are used to download ImageNet data. -# unzip all classes data using unzip.sh -sh unzip.sh -``` +**step-2:** Download ImageNet-2012 dataset from website. The training and validation data will be downloaded into folder "train" and "val" respectively. Please note that the size of data is more than 40 GB, it will take much time to download. Users who have downloaded the ImageNet data can organize it into ```data/ILSVRC2012``` directly. -2. Download training and validation label files from [ImageNet2012 url](https://pan.baidu.com/s/1Y6BCo0nmxsm_FsEqmx2hKQ)(password:```wx99```). Untar it into workspace ```ILSVRC2012/```. The files include +**step-3:** Download training and validation label files. There are two label files which contain train and validation image labels respectively: -**train_list.txt**: training list of imagenet 2012 classification task, with each line seperated by SPACE. +* *train_list.txt*: label file of imagenet-2012 training set, with each line seperated by ```SPACE```, like: ``` train/n02483708/n02483708_2436.jpeg 369 train/n03998194/n03998194_7015.jpeg 741 @@ -41,7 +40,7 @@ train/n04596742/n04596742_3032.jpeg 909 train/n03208938/n03208938_7065.jpeg 535 ... ``` -**val_list.txt**: validation list of imagenet 2012 classification task, with each line seperated by SPACE. +* *val_list.txt*: label file of imagenet-2012 validation set, with each line seperated by ```SPACE```, like. ``` val/ILSVRC2012_val_00000001.jpeg 65 val/ILSVRC2012_val_00000002.jpeg 970 @@ -50,38 +49,160 @@ val/ILSVRC2012_val_00000004.jpeg 809 val/ILSVRC2012_val_00000005.jpeg 516 ... ``` -**synset_words.txt**: the semantic label of each class. -## Training a model +## Training a model with flexible parameters -To start a training task, one can use command line as: +After data preparation, one can start the training step by: ``` -python train.py --num_layers=50 --batch_size=8 --with_mem_opt=True --parallel_exe=False +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 \ + --lr_strategy=piecewise_decay \ + --lr=0.1 ``` -## Finetune a model +**parameter introduction:** +* **model**: name model to use. Default: "SE_ResNeXt50_32x4d". +* **num_epochs**: the number of epochs. Default: 120. +* **batch_size**: the size of each mini-batch. Default: 256. +* **use_gpu**: whether to use GPU or not. Default: True. +* **total_images**: total number of images in the training set. Default: 1281167. +* **class_dim**: the class number of the classification task. Default: 1000. +* **image_shape**: input size of the network. Default: "3,224,224". +* **model_save_dir**: the directory to save trained model. Default: "output". +* **with_mem_opt**: whether to use memory optimization or not. Default: False. +* **lr_strategy**: learning rate changing strategy. Default: "piecewise_decay". +* **lr**: initialized learning rate. Default: 0.1. +* **pretrained_model**: model path for pretraining. Default: None. +* **checkpoint**: the checkpoint path to resume. Default: None. + +**data reader introduction:** Data reader is defined in ```reader.py```. In [training stage](#training-a-model), random crop and flipping are used, while center crop is used in [evaluation](#inference) and [inference](#inference) stages. Supported data augmentation includes: +* rotation +* color jitter +* random crop +* center crop +* resize +* flipping + +**training curve:** The training curve can be drawn based on training log. For example, the log from training AlexNet is like: ``` -python train.py --num_layers=50 --batch_size=8 --with_mem_opt=True --parallel_exe=False --pretrained_model="pretrain/96/" +End pass 1, train_loss 6.23153877258, train_acc1 0.0150696625933, train_acc5 0.0552518665791, test_loss 5.41981744766, test_acc1 0.0519132651389, test_acc5 0.156150355935 +End pass 2, train_loss 5.15442800522, train_acc1 0.0784279331565, train_acc5 0.211050540209, test_loss 4.45795249939, test_acc1 0.140469551086, test_acc5 0.333163291216 +End pass 3, train_loss 4.51505613327, train_acc1 0.145300447941, train_acc5 0.331567406654, test_loss 3.86548018456, test_acc1 0.219443559647, test_acc5 0.446448504925 +End pass 4, train_loss 4.12735557556, train_acc1 0.19437250495, train_acc5 0.405713528395, test_loss 3.56990146637, test_acc1 0.264536827803, test_acc5 0.507190704346 +End pass 5, train_loss 3.87505435944, train_acc1 0.229518383741, train_acc5 0.453582793474, test_loss 3.35345435143, test_acc1 0.297349333763, test_acc5 0.54753267765 +End pass 6, train_loss 3.6929500103, train_acc1 0.255628824234, train_acc5 0.487188398838, test_loss 3.17112898827, test_acc1 0.326953113079, test_acc5 0.581780135632 +End pass 7, train_loss 3.55882954597, train_acc1 0.275381118059, train_acc5 0.511990904808, test_loss 3.03736782074, test_acc1 0.349035382271, test_acc5 0.606293857098 +End pass 8, train_loss 3.45595097542, train_acc1 0.291462600231, train_acc5 0.530815005302, test_loss 2.96034455299, test_acc1 0.362228929996, test_acc5 0.617390751839 +End pass 9, train_loss 3.3745200634, train_acc1 0.303871691227, train_acc5 0.545210540295, test_loss 2.93932366371, test_acc1 0.37129303813, test_acc5 0.623573005199 +... ``` -TBD -## Inference + +The error rate curves of AlexNet, ResNet50 and SE-ResNeXt-50 are shown in the figure below. +

+
+Training and validation Curves +

+ +## Finetuning + +Finetuning is to finetune model weights in a specific task by loading pretrained weights. After initializing ```path_to_pretrain_model```, one can finetune a model as: ``` -python infer.py --num_layers=50 --batch_size=8 --model='model/90' --test_list='' +python train.py + --model=SE_ResNeXt50_32x4d \ + --pretrained_model=${path_to_pretrain_model} \ + --batch_size=32 \ + --total_images=1281167 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --model_save_dir=output/ \ + --with_mem_opt=True \ + --lr_strategy=piecewise_decay \ + --lr=0.1 ``` -TBD -## Results +## Evaluation +Evaluation is to evaluate the performance of a trained model. One can download [pretrained models](#supported-models) and set its path to ```path_to_pretrain_model```. Then top1/top5 accuracy can be obtained by running the following command: +``` +python eval.py \ + --model=SE_ResNeXt50_32x4d \ + --batch_size=32 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --with_mem_opt=True \ + --pretrained_model=${path_to_pretrain_model} +``` -The SE-ResNeXt-50 model is trained by starting with learning rate ```0.1``` and decaying it by ```0.1``` after each ```10``` epoches. Top-1/Top-5 Validation Accuracy on ImageNet 2012 is listed in table. +According to the congfiguration of evaluation, the output log is like: +``` +Testbatch 0,loss 2.1786134243, acc1 0.625,acc5 0.8125,time 0.48 sec +Testbatch 10,loss 0.898496925831, acc1 0.75,acc5 0.9375,time 0.51 sec +Testbatch 20,loss 1.32524681091, acc1 0.6875,acc5 0.9375,time 0.37 sec +Testbatch 30,loss 1.46830511093, acc1 0.5,acc5 0.9375,time 0.51 sec +Testbatch 40,loss 1.12802267075, acc1 0.625,acc5 0.9375,time 0.35 sec +Testbatch 50,loss 0.881597697735, acc1 0.8125,acc5 1.0,time 0.32 sec +Testbatch 60,loss 0.300163716078, acc1 0.875,acc5 1.0,time 0.48 sec +Testbatch 70,loss 0.692037761211, acc1 0.875,acc5 1.0,time 0.35 sec +Testbatch 80,loss 0.0969972759485, acc1 1.0,acc5 1.0,time 0.41 sec +... +``` -|model | [original paper(Fig.5)](https://arxiv.org/abs/1709.01507) | Pytorch | Paddle fluid -|- | :-: |:-: | -: -|SE-ResNeXt-50 | 77.6%/- | 77.71%/93.63% | 77.42%/93.50% +## Inference +Inference is used to get prediction score or image features based on trained models. +``` +python infer.py \ + --model=SE_ResNeXt50_32x4d \ + --batch_size=32 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --with_mem_opt=True \ + --pretrained_model=${path_to_pretrain_model} +``` +The output contains predication results, including maximum score (before softmax) and corresponding predicted label. +``` +Test-0-score: [13.168352], class [491] +Test-1-score: [7.913302], class [975] +Test-2-score: [16.959702], class [21] +Test-3-score: [14.197695], class [383] +Test-4-score: [12.607652], class [878] +Test-5-score: [17.725458], class [15] +Test-6-score: [12.678599], class [118] +Test-7-score: [12.353498], class [505] +Test-8-score: [20.828007], class [747] +Test-9-score: [15.135801], class [315] +Test-10-score: [14.585114], class [920] +Test-11-score: [13.739927], class [679] +Test-12-score: [15.040644], class [386] +... +``` +## Supported models and performances +Models are trained by starting with learning rate ```0.1``` and decaying it by ```0.1``` after each pre-defined epoches, if not special introduced. Available top-1/top-5 validation accuracy on ImageNet 2012 are listed in table. Pretrained models can be downloaded by clicking related model names. -## Released models -|model | Baidu Cloud +|model | top-1/top-5 accuracy |- | -: -|SE-ResNeXt-50 | [url]() -TBD +|[AlexNet](http://paddle-imagenet-models.bj.bcebos.com/alexnet_model.tar) | 57.21%/79.72% +|VGG11 | - +|VGG13 | - +|VGG16 | - +|VGG19 | - +|GoogleNet | - +|InceptionV4 | - +|MobileNet | - +|[ResNet50](http://paddle-imagenet-models.bj.bcebos.com/resnet_50_model.tar) | 76.63%/93.10% +|ResNet101 | - +|ResNet152 | - +|[SE_ResNeXt50_32x4d](http://paddle-imagenet-models.bj.bcebos.com/se_resnext_50_model.tar) | 78.33%/93.96% +|SE_ResNeXt101_32x4d | - +|SE_ResNeXt152_32x4d | - +|DPN68 | - +|DPN92 | - +|DPN98 | - +|DPN107 | - +|DPN131 | - diff --git a/fluid/image_classification/README_cn.md b/fluid/image_classification/README_cn.md new file mode 100644 index 0000000000..937dd148c7 --- /dev/null +++ b/fluid/image_classification/README_cn.md @@ -0,0 +1,209 @@ + +# 图像分类以及模型库 +图像分类是计算机视觉的重要领域,它的目标是将图像分类到预定义的标签。近期,需要研究者提出很多不同种类的神经网络,并且极大的提升了分类算法的性能。本页将介绍如何使用PaddlePaddle进行图像分类,包括[数据准备](#data-preparation)、 [训练](#training-a-model)、[参数微调](#finetuning)、[模型评估](#evaluation)以及[模型推断](#inference)。 + +--- +## 内容 +- [安装](#installation) +- [数据准备](#data-preparation) +- [模型训练](#training-a-model) +- [参数微调](#finetuning) +- [模型评估](#evaluation) +- [模型推断](#inference) +- [已有模型及其性能](#supported-models) + +## 安装 + +在当前目录下运行样例代码需要PadddlePaddle Fluid的v0.13.0或以上的版本。如果你的运行环境中的PaddlePaddle低于此版本,请根据[安装文档](http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/pip_install_cn.html)中的说明来更新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_list.txt*: ImageNet-2012训练集合的标签文件,每一行采用"空格"分隔图像路径与标注,例如: +``` +train/n02483708/n02483708_2436.jpeg 369 +train/n03998194/n03998194_7015.jpeg 741 +train/n04523525/n04523525_38118.jpeg 884 +train/n04596742/n04596742_3032.jpeg 909 +train/n03208938/n03208938_7065.jpeg 535 +... +``` +* *val_list.txt*: ImageNet-2012验证集合的标签文件,每一行采用"空格"分隔图像路径与标注,例如: +``` +val/ILSVRC2012_val_00000001.jpeg 65 +val/ILSVRC2012_val_00000002.jpeg 970 +val/ILSVRC2012_val_00000003.jpeg 230 +val/ILSVRC2012_val_00000004.jpeg 809 +val/ILSVRC2012_val_00000005.jpeg 516 +... +``` + +## 模型训练 + +数据准备完毕后,可以通过如下的方式启动训练: +``` +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 \ + --lr_strategy=piecewise_decay \ + --lr=0.1 +``` +**参数说明:** +* **model**: name model to use. Default: "SE_ResNeXt50_32x4d". +* **num_epochs**: the number of epochs. Default: 120. +* **batch_size**: the size of each mini-batch. Default: 256. +* **use_gpu**: whether to use GPU or not. Default: True. +* **total_images**: total number of images in the training set. Default: 1281167. +* **class_dim**: the class number of the classification task. Default: 1000. +* **image_shape**: input size of the network. Default: "3,224,224". +* **model_save_dir**: the directory to save trained model. Default: "output". +* **with_mem_opt**: whether to use memory optimization or not. Default: False. +* **lr_strategy**: learning rate changing strategy. Default: "piecewise_decay". +* **lr**: initialized learning rate. Default: 0.1. +* **pretrained_model**: model path for pretraining. Default: None. +* **checkpoint**: the checkpoint path to resume. Default: None. + +**数据读取器说明:** 数据读取器定义在```reader.py```中。在[训练阶段](#training-a-model), 默认采用的增广方式是随机裁剪与水平翻转, 而在[评估](#inference)与[推断](#inference)阶段用的默认方式是中心裁剪。当前支持的数据增广方式有: +* 旋转 +* 颜色抖动 +* 随机裁剪 +* 中心裁剪 +* 长宽调整 +* 水平翻转 + +**训练曲线:** 通过训练过程中的日志可以画出训练曲线。举个例子,训练AlexNet出来的日志如下所示: +``` +End pass 1, train_loss 6.23153877258, train_acc1 0.0150696625933, train_acc5 0.0552518665791, test_loss 5.41981744766, test_acc1 0.0519132651389, test_acc5 0.156150355935 +End pass 2, train_loss 5.15442800522, train_acc1 0.0784279331565, train_acc5 0.211050540209, test_loss 4.45795249939, test_acc1 0.140469551086, test_acc5 0.333163291216 +End pass 3, train_loss 4.51505613327, train_acc1 0.145300447941, train_acc5 0.331567406654, test_loss 3.86548018456, test_acc1 0.219443559647, test_acc5 0.446448504925 +End pass 4, train_loss 4.12735557556, train_acc1 0.19437250495, train_acc5 0.405713528395, test_loss 3.56990146637, test_acc1 0.264536827803, test_acc5 0.507190704346 +End pass 5, train_loss 3.87505435944, train_acc1 0.229518383741, train_acc5 0.453582793474, test_loss 3.35345435143, test_acc1 0.297349333763, test_acc5 0.54753267765 +End pass 6, train_loss 3.6929500103, train_acc1 0.255628824234, train_acc5 0.487188398838, test_loss 3.17112898827, test_acc1 0.326953113079, test_acc5 0.581780135632 +End pass 7, train_loss 3.55882954597, train_acc1 0.275381118059, train_acc5 0.511990904808, test_loss 3.03736782074, test_acc1 0.349035382271, test_acc5 0.606293857098 +End pass 8, train_loss 3.45595097542, train_acc1 0.291462600231, train_acc5 0.530815005302, test_loss 2.96034455299, test_acc1 0.362228929996, test_acc5 0.617390751839 +End pass 9, train_loss 3.3745200634, train_acc1 0.303871691227, train_acc5 0.545210540295, test_loss 2.93932366371, test_acc1 0.37129303813, test_acc5 0.623573005199 +... +``` + +下图给出了AlexNet、ResNet50以及SE-ResNeXt-50网络的错误率曲线: +

+
+训练集合与验证集合上的错误率曲线 +

+ + +## 参数微调 + +参数微调是指在特定任务上微调已训练模型的参数。通过初始化```path_to_pretrain_model```,微调一个模型可以采用如下的命令: +``` +python train.py + --model=SE_ResNeXt50_32x4d \ + --pretrained_model=${path_to_pretrain_model} \ + --batch_size=32 \ + --total_images=1281167 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --model_save_dir=output/ \ + --with_mem_opt=True \ + --lr_strategy=piecewise_decay \ + --lr=0.1 +``` + +## 模型评估 +模型评估是指对训练完毕的模型评估各类性能指标。用户可以下载[预训练模型](#supported-models)并且设置```path_to_pretrain_model```为模型所在路径。运行如下的命令,可以获得一个模型top-1/top-5精度: +``` +python eval.py \ + --model=SE_ResNeXt50_32x4d \ + --batch_size=32 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --with_mem_opt=True \ + --pretrained_model=${path_to_pretrain_model} +``` + +根据这个评估程序的配置,输出日志形式如下: +``` +Testbatch 0,loss 2.1786134243, acc1 0.625,acc5 0.8125,time 0.48 sec +Testbatch 10,loss 0.898496925831, acc1 0.75,acc5 0.9375,time 0.51 sec +Testbatch 20,loss 1.32524681091, acc1 0.6875,acc5 0.9375,time 0.37 sec +Testbatch 30,loss 1.46830511093, acc1 0.5,acc5 0.9375,time 0.51 sec +Testbatch 40,loss 1.12802267075, acc1 0.625,acc5 0.9375,time 0.35 sec +Testbatch 50,loss 0.881597697735, acc1 0.8125,acc5 1.0,time 0.32 sec +Testbatch 60,loss 0.300163716078, acc1 0.875,acc5 1.0,time 0.48 sec +Testbatch 70,loss 0.692037761211, acc1 0.875,acc5 1.0,time 0.35 sec +Testbatch 80,loss 0.0969972759485, acc1 1.0,acc5 1.0,time 0.41 sec +... +``` + + +## 模型推断 +模型推断可以获取一个模型的预测分数或者图像的特征: +``` +python infer.py \ + --model=SE_ResNeXt50_32x4d \ + --batch_size=32 \ + --class_dim=1000 \ + --image_shape=3,224,224 \ + --with_mem_opt=True \ + --pretrained_model=${path_to_pretrain_model} +``` +输出的预测结果包括最高分数(未经过softmax处理)以及相应的预测标签。 +``` +Test-0-score: [13.168352], class [491] +Test-1-score: [7.913302], class [975] +Test-2-score: [16.959702], class [21] +Test-3-score: [14.197695], class [383] +Test-4-score: [12.607652], class [878] +Test-5-score: [17.725458], class [15] +Test-6-score: [12.678599], class [118] +Test-7-score: [12.353498], class [505] +Test-8-score: [20.828007], class [747] +Test-9-score: [15.135801], class [315] +Test-10-score: [14.585114], class [920] +Test-11-score: [13.739927], class [679] +Test-12-score: [15.040644], class [386] +... +``` + +## 已有模型及其性能 + +表格中列出了在"models"目录下支持的神经网络种类,并且给出了已完成训练的模型在ImageNet-2012验证集合上的top-1/top-5精度;如无特征说明,训练模型的初始学习率为```0.1```,每隔预定的epochs会下降```0.1```。预训练模型可以通过点击相应模型的名称进行下载。 + +|model | top-1/top-5 accuracy +|- | -: +|[AlexNet](http://paddle-imagenet-models.bj.bcebos.com/alexnet_model.tar) | 57.21%/79.72% +|VGG11 | - +|VGG13 | - +|VGG16 | - +|VGG19 | - +|GoogleNet | - +|InceptionV4 | - +|MobileNet | - +|[ResNet50](http://paddle-imagenet-models.bj.bcebos.com/resnet_50_model.tar) | 76.63%/93.10% +|ResNet101 | - +|ResNet152 | - +|[SE_ResNeXt50_32x4d](http://paddle-imagenet-models.bj.bcebos.com/se_resnext_50_model.tar) | 78.33%/93.96% +|SE_ResNeXt101_32x4d | - +|SE_ResNeXt152_32x4d | - +|DPN68 | - +|DPN92 | - +|DPN98 | - +|DPN107 | - +|DPN131 | - diff --git a/fluid/image_classification/__init__.py b/fluid/image_classification/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fluid/image_classification/data/ILSVRC2012/download_imagenet2012.sh b/fluid/image_classification/data/ILSVRC2012/download_imagenet2012.sh new file mode 100644 index 0000000000..947b8900bd --- /dev/null +++ b/fluid/image_classification/data/ILSVRC2012/download_imagenet2012.sh @@ -0,0 +1,40 @@ +set -e +if [ "x${IMAGENET_USERNAME}" == x -o "x${IMAGENET_ACCESS_KEY}" == x ];then + echo "Please create an account on image-net.org." + echo "It will provide you a pair of username and accesskey to download imagenet data." + read -p "Username: " IMAGENET_USERNAME + read -p "Accesskey: " IMAGENET_ACCESS_KEY +fi + +root_url=http://www.image-net.org/challenges/LSVRC/2012/nnoupb +valid_tar=ILSVRC2012_img_val.tar +train_tar=ILSVRC2012_img_train.tar +train_folder=train/ +valid_folder=val/ + +echo "Download imagenet training data..." +mkdir -p ${train_folder} +wget -nd -c ${root_url}/${train_tar} +tar xf ${train_tar} -C ${train_folder} + +cd ${train_folder} +for x in `ls *.tar` +do + filename=`basename $x .tar` + mkdir -p $filename + tar -xf $x -C $filename + rm -rf $x +done +cd - + +echo "Download imagenet validation data..." +mkdir -p ${valid_folder} +wget -nd -c ${root_url}/${valid_tar} +tar xf ${valid_tar} -C ${valid_folder} + +echo "Download imagenet label file: val_list.txt & train_list.txt" +label_file=ImageNet_label.tgz +label_url=http://imagenet-data.bj.bcebos.com/${label_file} +wget -nd -c ${label_url} +tar zxf ${label_file} + diff --git a/fluid/image_classification/data/ILSVRC2012/unzip.sh b/fluid/image_classification/data/ILSVRC2012/unzip.sh deleted file mode 100644 index 704a0e5577..0000000000 --- a/fluid/image_classification/data/ILSVRC2012/unzip.sh +++ /dev/null @@ -1,9 +0,0 @@ -cd train - -dir=./ -for x in `ls *.tar` -do -filename=`basename $x .tar` -mkdir $filename -tar -xvf $x -C ./$filename -done diff --git a/fluid/image_classification/eval.py b/fluid/image_classification/eval.py index dd1c2cc1d0..e0c96d0f13 100644 --- a/fluid/image_classification/eval.py +++ b/fluid/image_classification/eval.py @@ -1,83 +1,127 @@ import os -import sys import numpy as np -import argparse -import functools - +import time +import sys import paddle import paddle.fluid as fluid -from utility import add_arguments, print_arguments -from se_resnext import SE_ResNeXt +import models import reader +import argparse +import functools +from models.learning_rate import cosine_decay +from utility import add_arguments, print_arguments +import math parser = argparse.ArgumentParser(description=__doc__) add_arg = functools.partial(add_arguments, argparser=parser) # yapf: disable -add_arg('batch_size', int, 32, "Minibatch size.") -add_arg('use_gpu', bool, True, "Whether to use GPU or not.") -add_arg('test_list', str, '', "The testing data lists.") -add_arg('num_layers', int, 50, "How many layers for SE-ResNeXt model.") -add_arg('model_dir', str, '', "The model path.") +add_arg('batch_size', int, 256, "Minibatch size.") +add_arg('use_gpu', bool, True, "Whether to use GPU or not.") +add_arg('class_dim', int, 1000, "Class number.") +add_arg('image_shape', str, "3,224,224", "Input image size") +add_arg('with_mem_opt', bool, True, "Whether to use memory optimization or not.") +add_arg('pretrained_model', str, None, "Whether to use pretrained model.") +add_arg('model', str, "SE_ResNeXt50_32x4d", "Set the network to use.") # yapf: enable +model_list = [m for m in dir(models) if "__" not in m] + def eval(args): - class_dim = 1000 - image_shape = [3, 224, 224] + # parameters from arguments + class_dim = args.class_dim + model_name = args.model + pretrained_model = args.pretrained_model + with_memory_optimization = args.with_mem_opt + image_shape = [int(m) for m in args.image_shape.split(",")] + + assert model_name in model_list, "{} is not in lists: {}".format(args.model, + model_list) + image = fluid.layers.data(name='image', shape=image_shape, dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int64') - out = SE_ResNeXt(input=image, class_dim=class_dim, layers=args.num_layers) - cost = fluid.layers.cross_entropy(input=out, label=label) - acc_top1 = fluid.layers.accuracy(input=out, label=label, k=1) - acc_top5 = fluid.layers.accuracy(input=out, label=label, k=5) - avg_cost = fluid.layers.mean(x=cost) - inference_program = fluid.default_main_program().clone(for_test=True) + # model definition + model = models.__dict__[model_name]() + + if model_name is "GoogleNet": + out0, out1, out2 = model.net(input=image, class_dim=class_dim) + cost0 = fluid.layers.cross_entropy(input=out0, label=label) + cost1 = fluid.layers.cross_entropy(input=out1, label=label) + cost2 = fluid.layers.cross_entropy(input=out2, label=label) + avg_cost0 = fluid.layers.mean(x=cost0) + avg_cost1 = fluid.layers.mean(x=cost1) + avg_cost2 = fluid.layers.mean(x=cost2) + + avg_cost = avg_cost0 + 0.3 * avg_cost1 + 0.3 * avg_cost2 + acc_top1 = fluid.layers.accuracy(input=out0, label=label, k=1) + acc_top5 = fluid.layers.accuracy(input=out0, label=label, k=5) + else: + out = model.net(input=image, class_dim=class_dim) + cost = fluid.layers.cross_entropy(input=out, label=label) + + avg_cost = fluid.layers.mean(x=cost) + acc_top1 = fluid.layers.accuracy(input=out, label=label, k=1) + acc_top5 = fluid.layers.accuracy(input=out, label=label, k=5) + + test_program = fluid.default_main_program().clone(for_test=True) + + if with_memory_optimization: + fluid.memory_optimize(fluid.default_main_program()) place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace() exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) - if not os.path.exists(args.model_dir): - raise ValueError("The model path [%s] does not exist." % - (args.model_dir)) - if not os.path.exists(args.test_list): - raise ValueError("The test lists [%s] does not exist." % - (args.test_list)) + if pretrained_model: - def if_exist(var): - return os.path.exists(os.path.join(args.model_dir, var.name)) + def if_exist(var): + return os.path.exists(os.path.join(pretrained_model, var.name)) - fluid.io.load_vars(exe, args.model_dir, predicate=if_exist) + fluid.io.load_vars(exe, pretrained_model, predicate=if_exist) - test_reader = paddle.batch( - reader.test(args.test_list), batch_size=args.batch_size) + val_reader = paddle.batch(reader.val(), batch_size=args.batch_size) feeder = fluid.DataFeeder(place=place, feed_list=[image, label]) - fetch_list = [avg_cost, acc_top1, acc_top5] + fetch_list = [avg_cost.name, acc_top1.name, acc_top5.name] test_info = [[], [], []] - for batch_id, data in enumerate(test_reader()): - loss, acc1, acc5 = exe.run(inference_program, - feed=feeder.feed(data), - fetch_list=fetch_list) - test_info[0].append(loss[0]) - test_info[1].append(acc1[0]) - test_info[2].append(acc5[0]) - if batch_id % 1 == 0: - print("Test {0}, loss {1}, acc1 {2}, acc5 {3}" - .format(batch_id, loss[0], acc1[0], acc5[0])) + cnt = 0 + for batch_id, data in enumerate(val_reader()): + t1 = time.time() + loss, acc1, acc5 = exe.run(test_program, + fetch_list=fetch_list, + feed=feeder.feed(data)) + t2 = time.time() + period = t2 - t1 + loss = np.mean(loss) + acc1 = np.mean(acc1) + acc5 = np.mean(acc5) + test_info[0].append(loss * len(data)) + test_info[1].append(acc1 * len(data)) + test_info[2].append(acc5 * len(data)) + cnt += len(data) + if batch_id % 10 == 0: + print("Testbatch {0},loss {1}, " + "acc1 {2},acc5 {3},time {4}".format(batch_id, \ + loss, acc1, acc5, \ + "%2.2f sec" % period)) sys.stdout.flush() - test_loss = np.array(test_info[0]).mean() - test_acc1 = np.array(test_info[1]).mean() - test_acc5 = np.array(test_info[2]).mean() + test_loss = np.sum(test_info[0]) / cnt + test_acc1 = np.sum(test_info[1]) / cnt + test_acc5 = np.sum(test_info[2]) / cnt - print("Test loss {0}, acc1 {1}, acc5 {2}".format(test_loss, test_acc1, - test_acc5)) + print("Test_loss {0}, test_acc1 {1}, test_acc5 {2}".format( + test_loss, test_acc1, test_acc5)) sys.stdout.flush() -if __name__ == '__main__': +def main(): args = parser.parse_args() print_arguments(args) eval(args) + + +if __name__ == '__main__': + main() diff --git a/fluid/image_classification/images/curve.jpg b/fluid/image_classification/images/curve.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15694c2962ae3a4a93cbb6f0f8b07c39e4db79ae GIT binary patch literal 74187 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