# Contents - [WarpCTC Description](#warpctc-description) - [Model Architecture](#model-architecture) - [Dataset](#dataset) - [Environment Requirements](#environment-requirements) - [Quick Start](#quick-start) - [Script Description](#script-description) - [Script and Sample Code](#script-and-sample-code) - [Script Parameters](#script-parameters) - [Training Script Parameters](#training-script-parameters) - [Parameters Configuration](#parameters-configuration) - [Dataset Preparation](#dataset-preparation) - [Training Process](#training-process) - [Training](#training) - [Distributed Training](#distributed-training) - [Evaluation Process](#evaluation-process) - [Evaluation](#evaluation) - [Model Description](#model-description) - [Performance](#performance) - [Training Performance](#training-performance) - [Evaluation Performance](#evaluation-performance) - [Description of Random Situation](#description-of-random-situation) - [ModelZoo Homepage](#modelzoo-homepage) ## [WarpCTC Description](#contents) This is an example of training WarpCTC with self-generated captcha image dataset in MindSpore. ## [Model Architecture](#content) WarpCTC is a two-layer stacked LSTM appending with one-layer FC neural network. See src/warpctc.py for details. ## [Dataset](#content) The dataset is self-generated using a third-party library called [captcha](https://github.com/lepture/captcha), which can randomly generate digits from 0 to 9 in image. In this network, we set the length of digits varying from 1 to 4. ## [Environment Requirements](#contents) - Hardware(Ascend/GPU) - Prepare hardware environment with Ascend or GPU processor. - Framework - [MindSpore](https://gitee.com/mindspore/mindspore) - For more information, please check the resources below: - [MindSpore Tutorials](https://www.mindspore.cn/tutorial/training/en/master/index.html) - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/en/master/index.html) ## [Quick Start](#contents) - Generate dataset. Run the script `scripts/run_process_data.sh` to generate a dataset. By default, the shell script will generate 10000 test images and 50000 train images separately. ```bash $ cd scripts $ sh run_process_data.sh # after execution, you will find the dataset like the follows: . └─warpctc └─data ├─ train # train dataset └─ test # evaluate dataset ``` - After the dataset is prepared, you may start running the training or the evaluation scripts as follows: - Running on Ascend ```bash # distribute training example in Ascend $ bash run_distribute_train.sh rank_table.json ../data/train # evaluation example in Ascend $ bash run_eval.sh ../data/test warpctc-30-97.ckpt Ascend # standalone training example in Ascend $ bash run_standalone_train.sh ../data/train Ascend ``` For distributed training, a hccl configuration file with JSON format needs to be created in advance. Please follow the instructions in the link below: . - Running on GPU ```bash # distribute training example in GPU $ bash run_distribute_train_for_gpu.sh 8 ../data/train # standalone training example in GPU $ bash run_standalone_train.sh ../data/train GPU # evaluation example in GPU $ bash run_eval.sh ../data/test warpctc-30-97.ckpt GPU ``` ## [Script Description](#contents) ### [Script and Sample Code](#contents) ```shell . └──warpctc ├── README.md ├── script ├── run_distribute_train.sh # launch distributed training in Ascend(8 pcs) ├── run_distribute_train_for_gpu.sh # launch distributed training in GPU ├── run_eval.sh # launch evaluation ├── run_process_data.sh # launch dataset generation └── run_standalone_train.sh # launch standalone training(1 pcs) ├── src ├── config.py # parameter configuration ├── dataset.py # data preprocessing ├── loss.py # ctcloss definition ├── lr_generator.py # generate learning rate for each step ├── metric.py # accuracy metric for warpctc network ├── warpctc.py # warpctc network definition └── warpctc_for_train.py # warpctc network with grad, loss and gradient clip ├── mindspore_hub_conf.py # mindspore hub interface ├── eval.py # eval net ├── process_data.py # dataset generation script └── train.py # train net ``` ### [Script Parameters](#contents) #### Training Script Parameters ```bash # distributed training in Ascend Usage: bash run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] # distributed training in GPU Usage: bash run_distribute_train_for_gpu.sh [RANK_SIZE] [DATASET_PATH] # standalone training Usage: bash run_standalone_train.sh [DATASET_PATH] [PLATFORM] ``` #### Parameters Configuration Parameters for both training and evaluation can be set in config.py. ```bash "max_captcha_digits": 4, # max number of digits in each "captcha_width": 160, # width of captcha images "captcha_height": 64, # height of capthca images "batch_size": 64, # batch size of input tensor "epoch_size": 30, # only valid for taining, which is always 1 for inference "hidden_size": 512, # hidden size in LSTM layers "learning_rate": 0.01, # initial learning rate "momentum": 0.9 # momentum of SGD optimizer "save_checkpoint": True, # whether save checkpoint or not "save_checkpoint_steps": 97, # the step interval between two checkpoints. By default, the last checkpoint will be saved after the last step "keep_checkpoint_max": 30, # only keep the last keep_checkpoint_max checkpoint "save_checkpoint_path": "./checkpoint", # path to save checkpoint ``` ## [Dataset Preparation](#contents) - You may refer to "Generate dataset" in [Quick Start](#quick-start) to automatically generate a dataset, or you may choose to generate a captcha dataset by yourself. ### [Training Process](#contents) - Set options in `config.py`, including learning rate and other network hyperparameters. Click [MindSpore dataset preparation tutorial](https://www.mindspore.cn/tutorial/training/zh-CN/master/use/data_preparation.html) for more information about dataset. #### [Training](#contents) - Run `run_standalone_train.sh` for non-distributed training of WarpCTC model, either on Ascend or on GPU. ``` bash bash run_standalone_train.sh [DATASET_PATH] [PLATFORM] ``` ##### [Distributed Training](#contents) - Run `run_distribute_train.sh` for distributed training of WarpCTC model on Ascend. ``` bash bash run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] ``` - Run `run_distribute_train_gpu.sh` for distributed training of WarpCTC model on GPU. ``` bash bash run_distribute_train_gpu.sh [RANK_SIZE] [DATASET_PATH] ``` ### [Evaluation Process](#contents) #### [Evaluation](#contents) - Run `run_eval.sh` for evaluation. ``` bash bash run_eval.sh [DATASET_PATH] [CHECKPOINT_PATH] [PLATFORM] ``` ## [Model Description](#contents) ### [Performance](#contents) #### [Training Performance](#contents) | Parameters | Ascend 910 | GPU | | -------------------------- | --------------------------------------------- |---------------------------------- | | Model Version | v1.0 | v1.0 | | Resource | Ascend 910,CPU 2.60GHz 192cores,Memory 755G | GPU(Tesla V100 SXM2),CPU 2.1GHz 24cores,Memory 128G / | uploaded Date | 07/01/2020 (month/day/year) | 08/01/2020 (month/day/year) | | MindSpore Version | 0.5.0-alpha | 0.6.0-alpha | | Dataset | Captcha | Captcha | | Training Parameters | epoch=30, steps per epoch=98, batch_size = 64 | epoch=30, steps per epoch=98, batch_size = 64 | | Optimizer | SGD | SGD | | Loss Function | CTCLoss | CTCLoss | | outputs | probability | probability | | Loss | 0.0000157 | 0.0000246 | | Speed | 980ms/step(8pcs) | 150ms/step(8pcs)| | Total time | 30 mins | 5 mins| | Parameters (M) | 2.75 | 2.75 | | Checkpoint for Fine tuning | 20.3M (.ckpt file) | 20.3M (.ckpt file) | | Scripts | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/warpctc) | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/warpctc) | #### [Evaluation Performance](#contents) | Parameters | WarpCTC | | ------------------- | --------------------------- | | Model Version | V1.0 | | Resource | Ascend 910 | | Uploaded Date | 08/01/2020 (month/day/year) | | MindSpore Version | 0.6.0-alpha | | Dataset | Captcha | | batch_size | 64 | | outputs | ACC | | Accuracy | 99.0% | | Model for inference | 20.3M (.ckpt file) | ## [Description of Random Situation](#contents) In dataset.py, we set the seed inside “create_dataset" function. We also use random seed in train.py for weight initialization. ## [ModelZoo Homepage](#contents) Please check the official [homepage](https://gitee.com/mindspore/mindspore/tree/master/model_zoo).