• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 目录
2
3<!-- TOC -->
4
5- [目录](#目录)
6- [概述](#概述)
7- [数据集](#数据集)
8- [环境要求](#环境要求)
9- [快速入门](#快速入门)
10- [脚本详述](#脚本详述)
11    - [模型准备](#模型准备)
12    - [模型训练](#模型训练)
13- [工程目录](#工程目录)
14
15<!-- /TOC -->
16
17# 概述
18
19本文主要讲解如何在端侧基于[efficientNet](https://arxiv.org/abs/1905.11946)模型迁移学习训练。首先在服务器或个人笔记本上进行模型转换;然后在安卓设备上训练模型。示例代码中使用efficientNet预训练模型,除最后全连接层外均冻结。这种训练模式能有效降低计算能耗,适用于端侧训练。
20
21# 数据集
22
23[Places dataset](http://places2.csail.mit.edu/)数据集包含不同分辨率的图片,总大小约100GB。本例使用大小仅有500MB的验证集 [validation data of small images](http://places2.csail.mit.edu/download.html)24
25- 数据集大小:501M,36, 500, 224*224 images 共365类
26- 数据格式:jpeg
27
28> 注意
29>
30> - 当前发布版本中,数据通过dataset.cc中自定义的`DataSet`类加载。我们使用[ImageMagick convert tool](https://imagemagick.org/)进行数据预处理,包括图像裁剪、转换为BMP格式。
31> - 本例将使用10分类而不是365类。
32> - 训练、验证和测试数据集的比例分别是3:1:1。
33
34- 验证集数据目录结构如下:
35
36```text
37places
38├── val_256
39│   ├── Places365_val_00000001.jpg
40│   ├── Places365_val_00000002.jpg
41│   ├── ...
42│   ├── Places365_val_00036499.jpg
43│   └── Places365_val_00036500.jpg
44```
45
46# 环境要求
47
48- 服务端
49    - [MindSpore Framework](https://www.mindspore.cn/install/en) - 建议使用安装docker环境
50    - [MindSpore ToD Download](https://www.mindspore.cn/lite/docs/zh-CN/r1.5/use/downloads.html)
51    - [MindSpore ToD Build](https://www.mindspore.cn/lite/docs/zh-CN/r1.5/use/build.html)
52    - [Android NDK r20b](https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip)
53    - [Android SDK](https://developer.android.com/studio?hl=zh-cn#cmdline-tools)
54    - [ImageMagick convert tool](https://imagemagick.org/)
55- Android设备端
56
57# 快速入门
58
59安装完毕,在`./mindspore/mindspore/lite/examples/transfer_learning`目录下执行脚本,命令如下:
60
61```bash
62sh ./prepare_and_run.sh -D DATASET_PATH [-d MINDSPORE_DOCKER] [-r RELEASE.tar.gz] [-t arm64|x86]
63```
64
65其中,`DATASET_PATH`是数据集路径;`MINDSPORE_DOCKER`是运行MindSpore的docker镜像,如果没有使用docker环境,则使用本地运行;`REALEASE.tar.gz`为端侧运行时训练工具压缩包绝对路径;`-t`选项为设备处理器架构,默认为`arm64`,如果输入`x86`则本地运行。注意:若在不同平台执行训练,需在先执行脚本前运行`make clean`指令。
66
67# 脚本详述
68
69`prepare_and_run.sh`脚本的功能如下:
70
71- 将Python模型文件转换为`.ms`文件。
72- 编译训练源码并将相关文件传输到设备端
73- 设备端执行训练
74
75运行命令参见[快速入门](#快速入门)
76
77## 模型准备
78
79脚本`prepare_model.sh`会基于MIndSpore架构将Python模型转换为`lenet_tod.mindir`模型;然后,使用MindSpore ToD 模型转换工具将`lenet_tod.mindir`文件转换为`lenet_tod.ms`文件。如果没有docker环境,则本地执行转换。
80
81## 模型训练
82
83首先编译`/src`文件夹中训练代码源码,生成的二进制文件在`./bin`目录下;然后将`transfer_learning_tod.ms`模型文件、训练脚本、MindSpore ToD库文件、编译生成的`/bin`目录和预处理后的`Places`数据集拷贝到`package`文件夹;最后使用`adb`工具将`package`文件夹传输至设备端并执行训练。
84
85# 工程目录
86
87```text
88transfer_learning/
89├── Makefile                          # Makefile of src code
90├── model
91│   ├── effnet.py                     # Python implementation of efficientNet
92│   ├── transfer_learning_export.py   # Python script that exports the LeNet model to .mindir
93│   ├── prepare_model.sh              # script that export model (using docker) then converts it
94│   └── train_utils.py                # utility function used during the export
95├── prepare_and_run.sh                # main script that creates model, compiles it and send to device for running
96├── prepare_dataset.sh                # prepares the Places dataset (crop/convert/organizing folders)
97├── README.md                         # this manual
98├── scripts
99│   ├── eval.sh                       # script that load the train model and evaluates its accuracy
100│   ├── eval_untrained.sh             # script that load the untrained model and evaluates its accuracy
101│   ├── places365_val.txt             # association of images to classes withiin the Places 365 dataset
102│   └── train.sh                      # script that load the initial model and trains it
103├── src
104│   ├── dataset.cc        # dataset handler
105│   ├── dataset.h         # dataset class header
106│   ├── net_runner.cc     # program that runs training/evaluation of models
107│   └── net_runner.h      # net_runner header
108```
109
110在脚本`prepare_and_run.sh`运行前,必须确保以下目录结构正确,这些文件将被传入设备用于训练。
111
112```text
113package-arm64/
114├── bin
115│   └── net_runner                     # the executable that performs the training/evaluation
116├── dataset
117│   ├── 0                              # folder containing images 0-99 belonging to 0'th class
118│   │   ├── 0.bmp
119│   │   ├── 1.bmp
120│   │   ├── ....
121│   │   ├── 98.bmp
122│   │   └── 99.bmp
123│   ├── ...                            # folders containing images 0-99 belonging to 1'st-8'th classes
124│   ├── 9                              # folder containing images 0-99 belonging to 9'th class
125│   │   ├── 0.bmp
126│   │   ├── 1.bmp
127│   │   ├── ....
128│   │   ├── 98.bmp
129│   │   └── 99.bmp
130├── lib
131│   ├── libjpeg.so.62
132│   ├── libminddata-lite.a
133│   ├── libminddata-lite.so
134│   ├── libmindspore-lite.a
135│   ├── libmindspore-lite-jni.so
136│   ├── libmindspore-lite.so
137│   ├── libmindspore-lite-train.a
138│   ├── libmindspore-lite-train-jni.so
139│   ├── libmindspore-lite-train.so
140│   ├── libturbojpeg.so.0
141│   └── mindspore-lite-java.jar
142├── model
143│   └── transfer_learning_tod.ms       # model to train
144├── eval.sh                            # script that load the train model and evaluates its accuracy
145├── eval_untrained.sh                  # script that load the untrain model and evaluates its accuracy
146└── train.sh                           # script that load the initial model and train it
147```
148