You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 6.7 kB

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