diff --git a/docs/deploy/paddlelite/android.md b/docs/deploy/paddlelite/android.md index f932e7c8a3e5c9d2527f347636430b204f85b4aa..3f6ce154c2b225433624d48a8665fcd63aa08e08 100644 --- a/docs/deploy/paddlelite/android.md +++ b/docs/deploy/paddlelite/android.md @@ -5,20 +5,21 @@ PaddleX的安卓端部署由PaddleLite实现,部署的流程如下,首先将 > PaddleX --> Inference Model --> PaddleLite Opt --> PaddleLite Inference 文章简介: -- step1: 介绍如何将PaddleX导出为inference model -- step2: 使用PaddleLite的OPT模块对模型进行优化 -- step3: 介绍了基于MobileNetv2的安卓demo,以及PaddleX Android SDK +- 1.介绍如何将PaddleX导出为inference model +- 2.使用PaddleLite的OPT模块对模型进行优化 +- 3.介绍基于PaddleX Android SDK的安卓demo,以及如何快速部署训练好的模型 +- 4.介绍PaddleX Android SDK和二次开发 -## step 1. 将PaddleX模型导出为inference模型 +## 1. 将PaddleX模型导出为inference模型 参考[导出inference模型](../export_model.md)将模型导出为inference格式模型。 -## step 2. 将inference模型优化为PaddleLite模型 +## 2. 将inference模型优化为PaddleLite模型 目前提供了两种方法将Paddle模型优化为PaddleLite模型: - 1.python脚本优化模型,简单上手,目前支持最新的PaddleLite 2.6.1版本 -- 2.bin文件优化模型(linux),支持develop版本(Commit Id:11cbd50e),适用于部署`DeepLab模型`的用户。 +- 2.bin文件优化模型(linux),支持develop版本(Commit Id:11cbd50e),适用于部署`DeepLab模型`和`Unet模型`的用户。 ### 2.1 使用python脚本优化模型 @@ -45,9 +46,19 @@ python export_lite.py --model_dir /path/to/inference_model --save_file /path/to/ --optimize_out_type=naive_buffer \ --optimize_out=model_output_name ``` + +| 参数 | 说明 | +| ---- | ---- | +| --model_file | 导出inference模型中包含的网络结构文件:`__model__`所在的路径| +| --param_file | 导出inference模型中包含的参数文件:`__params__`所在的路径| +| --valid_targets |指定模型可执行的backend,这里请指定为`arm`| +| --optimize_out_type | 输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化,这里请指定为`naive_buffer`| + 详细的使用方法和参数含义请参考: [使用opt转化模型](https://paddle-lite.readthedocs.io/zh/latest/user_guides/opt/opt_bin.html) -## step 3. 移动端(Android)预测 +## 3. 移动端(Android)Demo + +PaddleX提供了一个基于Mobilenetv2模型和PaddleX Android SDK的安卓demo,可供用户体验,该demo位于`/PaddleX/deploy/lite/android/demo`,可直接导入Android Studio后运行,并支持用户替换其他PaddleX导出的检测或分割模型进行预测。 ### 3.1 要求 @@ -56,21 +67,25 @@ python export_lite.py --model_dir /path/to/inference_model --save_file /path/to/ ### 3.2 分类Demo -#### 3.2.1 导入工程 +#### 3.2.1 导入工程并运行 - 打开Android Studio,在"Welcome to Android Studio"窗口点击"Open an existing Android Studio project",在弹出的路径选择窗口中进入`/PaddleX/deploy/lite/android/demo`目录,然后点击右下角的"Open"按钮,导入工程; - 通过USB连接Android手机或开发板; - 载入工程后,点击菜单栏的Run->Run 'App'按钮,在弹出的"Select Deployment Target"窗口选择已经连接的Android设备,然后点击"OK"按钮; +- 运行成功后,Android设备将加载一个名为PaddleX Demo的App,默认会加载一个测试图片,同时还支持拍照和从图库选择照片进行预测; + +**注意**:在工程构建的过程中会远程下载Mobilenetv2模型、yml配置文件、测试的图片,以及PaddleX Android SDK。 -#### 3.2.2 自定义模型 +### 3.3 部署自定义模型 -首先根据step1~step2描述,准备好Lite模型(.nb文件)和yml配置文件(注意:导出Lite模型时需指定--place=arm),然后在Android Studio的project视图中: +该demo还支持用户自定义模型来进行预测,可帮助用户快速验证自己训练好的模型,首先我们已经根据step1~step2描述,准备好了Lite模型(.nb文件)和yml配置文件(注意:导出Lite模型时需指定--place=arm),然后在Android Studio的project视图中: -- 将paddlex.nb文件拷贝到`/src/main/assets/model/`目录下。 -- 将model.yml文件拷贝到`/src/main/assets/config/`目录下。 -- 根据需要,修改文件`/src/main/res/values/strings.xml`中的`MODEL_PATH_DEFAULT`和`YAML_PATH_DEFAULT`指定的路径。 +- 将.nb文件拷贝到`/src/main/assets/model/`目录下, 根据.nb文件的名字,修改文件`/src/main/res/values/strings.xml`中的`MODEL_PATH_DEFAULT`; +- 将.yml文件拷贝到`/src/main/assets/config/`目录下,根据.yml文件的名字,修改文件`/src/main/res/values/strings.xml`中的`YAML_PATH_DEFAULT`; +- 可根据需要替换测试图片,将图片拷贝到`/src/main/assets/images/`目录下,根据图片文件的名字,修改文件`/src/main/res/values/strings.xml`中的`IMAGE_PATH_DEFAULT`; +- 点击菜单栏的Run->Run 'App'按钮,在弹出的"Select Deployment Target"窗口选择已经连接的Android设备,然后点击"OK"按钮; -### 3.3 PaddleX Android SDK介绍 +## 4. PaddleX Android SDK和二次开发 PaddleX Android SDK是PaddleX基于Paddle-Lite开发的安卓端AI推理工具,以PaddleX导出的Yaml配置文件为接口,针对不同的模型实现图片的预处理,后处理,并进行可视化,开发者可集成到业务中。 该SDK自底向上主要包括:Paddle-Lite推理引擎层,Paddle-Lite接口层以及PaddleX业务层。 @@ -81,7 +96,7 @@ PaddleX Android SDK是PaddleX基于Paddle-Lite开发的安卓端AI推理工具 ![架构](../images/paddlex_android_sdk_framework.jpg) -#### 3.3.1 SDK安装 +### 4.1 SDK安装 首先下载并解压[PaddleX Android SDK](https://bj.bcebos.com/paddlex/deploy/lite/paddlex_lite_11cbd50e.tar.gz),得到paddlex.aar文件,将拷贝到android工程目录app/libs/下面,然后为app的build.gradle添加依赖: @@ -92,7 +107,7 @@ dependencies { ``` -#### 3.3.2 SDK使用用例 +### 4.2 SDK使用用例 ``` import com.baidu.paddlex.Predictor; import com.baidu.paddlex.config.ConfigParser; @@ -132,7 +147,7 @@ if (configParser.getModelType().equalsIgnoreCase("segmenter")) { ClsResult clsResult = predictor.getClsResult(); } ``` -#### 3.3.3 Result成员变量 +### 4.3 Result成员变量 **注意**:Result所有的成员变量以java bean的方式获取。 @@ -179,12 +194,12 @@ com.baidu.paddlex.postprocess.SegResult com.baidu.paddlex.postprocess.SegResult.Mask ``` ##### Fields -> * **scoreData** (float[]): 模型预测在各个类别的置信度,长度为numClass$\times\$H$\times\$W +> * **scoreData** (float[]): 模型预测在各个类别的置信度,长度为: 1 * numClass * H * W > * **scoreShape** (long[4]): scoreData的shape信息,[1,numClass,H,W] -> * **labelData** (long[]): 模型预测置信度最高的label,长度为`H$\times\$W$\times\$1 +> * **labelData** (long[]): 模型预测置信度最高的label,长度为: 1 * H * W * 1 > * **labelShape** (long[4]): labelData的shape信息,[1,H,W,1] -#### 3.3.4 SDK二次开发 +### 4.4 SDK二次开发 - 打开Android Studio新建项目(或加载已有项目)。点击菜单File->New->Import Module,导入工程`/PaddleX/deploy/lite/android/sdk`, Project视图会新增名为sdk的module - 在app的build.grade里面添加依赖: