From 70940bf42f1055db1dd20ecb27fb43cab6b7acda Mon Sep 17 00:00:00 2001 From: Qi Li Date: Wed, 2 Sep 2020 10:38:25 +0800 Subject: [PATCH] [DOC] add quick start, test=develop, test=document_fix (#4235) --- README.md | 8 +- docs/app_develop/cpp_app_develop.md | 50 ++++ docs/app_develop/java_app_develop.md | 44 +++ docs/app_develop/python_app_develop.md | 47 +++ docs/demo_guides/cpp_demo.md | 278 ------------------ docs/demo_guides/java_demo.md | 99 ------- docs/demo_guides/python_demo.md | 120 -------- docs/index.rst | 25 +- docs/quick_start/cpp_demo.md | 241 +++++++++++++++ docs/quick_start/java_demo.md | 111 +++++++ docs/quick_start/python_demo.md | 75 +++++ .../release_lib.md | 2 +- docs/{user_guides => quick_start}/tutorial.md | 4 +- docs/user_guides/model_quantization.md | 2 +- docs/user_guides/post_quant_no_data.md | 2 +- docs/user_guides/post_quant_with_data.md | 2 +- 16 files changed, 598 insertions(+), 512 deletions(-) create mode 100644 docs/app_develop/cpp_app_develop.md create mode 100644 docs/app_develop/java_app_develop.md create mode 100644 docs/app_develop/python_app_develop.md delete mode 100644 docs/demo_guides/cpp_demo.md delete mode 100644 docs/demo_guides/java_demo.md delete mode 100644 docs/demo_guides/python_demo.md create mode 100644 docs/quick_start/cpp_demo.md create mode 100644 docs/quick_start/java_demo.md create mode 100644 docs/quick_start/python_demo.md rename docs/{user_guides => quick_start}/release_lib.md (99%) rename docs/{user_guides => quick_start}/tutorial.md (89%) diff --git a/README.md b/README.md index 0d00747c2b..d9463e5851 100644 --- a/README.md +++ b/README.md @@ -24,16 +24,16 @@ Paddle Lite框架拥有优秀的加速、优化策略及实现,包含量化、 **三. 下载或编译** -Paddle Lite提供了Android/iOS/X86平台的官方Release预测库下载,我们优先推荐您直接下载 [Paddle Lite预编译库](https://paddle-lite.readthedocs.io/zh/latest/user_guides/release_lib.html)。 +Paddle Lite提供了Android/iOS/X86平台的官方Release预测库下载,我们优先推荐您直接下载 [Paddle Lite预编译库](https://paddle-lite.readthedocs.io/zh/latest/quick_start/release_lib.html)。 您也可以根据目标平台选择对应的[源码编译方法](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html)。Paddle Lite 提供了源码编译脚本,位于 `lite/tools/`文件夹下,只需要 [准备环境](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id2) 和 [调用编译脚本](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#paddlelite) 两个步骤即可一键编译得到目标平台的Paddle Lite预测库。 **四. 预测示例** Paddle Lite提供了C++、Java、Python三种API,并且提供了相应API的完整使用示例: -- [C++完整示例](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/cpp_demo.html) -- [Java完整示例](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/java_demo.html) -- [Python完整示例](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/python_demo.html) +- [C++完整示例](https://paddle-lite.readthedocs.io/zh/latest/quick_start/cpp_demo.html) +- [Java完整示例](https://paddle-lite.readthedocs.io/zh/latest/quick_start/java_demo.html) +- [Python完整示例](https://paddle-lite.readthedocs.io/zh/latest/quick_start/python_demo.html) 您可以参考示例中的说明快速了解使用方法,并集成到您自己的项目中去。 diff --git a/docs/app_develop/cpp_app_develop.md b/docs/app_develop/cpp_app_develop.md new file mode 100644 index 0000000000..e144843f31 --- /dev/null +++ b/docs/app_develop/cpp_app_develop.md @@ -0,0 +1,50 @@ +# C++ 应用开发 + +C++代码调用Paddle-Lite执行预测库仅需以下五步: + +(1) 引用头文件和命名空间 + +```c++ +#include "paddle_api.h" +using namespace paddle::lite_api; +``` + +(2) 指定模型文件,创建Predictor + +```C++ +// 1. Set MobileConfig, model_file_path is +// the path to model model file. +MobileConfig config; +config.set_model_from_file(model_file_path); +// 2. Create PaddlePredictor by MobileConfig +std::shared_ptr predictor = + CreatePaddlePredictor(config); +``` + +(3) 设置模型输入 (下面以全一输入为例) + +```c++ +std::unique_ptr input_tensor(std::move(predictor->GetInput(0))); +input_tensor->Resize({1, 3, 224, 224}); +auto* data = input_tensor->mutable_data(); +for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) { + data[i] = 1; +} +``` + +(4) 执行预测 + +```c++ +predictor->Run(); +``` + +(5) 获得预测结果 + +```c++ +std::unique_ptr output_tensor( + std::move(predictor->GetOutput(0))); +// 转化为数据 +auto output_data=output_tensor->data(); +``` + +详细的C++ API说明文档位于[C++ API](../api_reference/cxx_api_doc)。更多C++应用预测开发可以参考位于 [demo/c++](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx) 下的示例代码,或者位于[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo)的工程示例代码。 diff --git a/docs/app_develop/java_app_develop.md b/docs/app_develop/java_app_develop.md new file mode 100644 index 0000000000..a7690c65eb --- /dev/null +++ b/docs/app_develop/java_app_develop.md @@ -0,0 +1,44 @@ +# Java 应用开发 + +Java代码调用Paddle-Lite执行预测库仅需以下五步: + +(1) 设置config信息 + +```java +MobileConfig config = new MobileConfig(); +config.setModelDir(modelPath); +config.setPowerMode(PowerMode.LITE_POWER_HIGH); +config.setThreads(1); +``` + +(2) 创建predictor + +```java +PaddlePredictor predictor = PaddlePredictor.createPaddlePredictor(config); +``` + +(3) 设置模型输入 (下面以全一输入为例) + +```java +float[] inputBuffer = new float[10000]; +for (int i = 0; i < 10000; ++i) { + inputBuffer[i] = i; +} +Tensor input = predictor.getInput(0); +input.resize({100, 100}); +input.setData(inputBuffer); +``` + +(4) 执行预测 + +```java +predictor.run(); +``` + +(5) 获得预测结果 + +```java +Tensor output = predictor.getOutput(0); +``` + +详细的Java API说明文档位于[Java API](../api_reference/java_api_doc)。更多Java应用预测开发可以参考位于 [demo/java](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/java) 下的示例代码,或者位于[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo)的工程示例代码。 diff --git a/docs/app_develop/python_app_develop.md b/docs/app_develop/python_app_develop.md new file mode 100644 index 0000000000..1e5aab0c12 --- /dev/null +++ b/docs/app_develop/python_app_develop.md @@ -0,0 +1,47 @@ +# Python 应用开发 + +Python代码调用Paddle-Lite执行预测库仅需以下六步: + +(1) 设置config信息 +```python +from paddlelite.lite import * + +config = MobileConfig() +config.set_model_from_file(/YOU_MODEL_PATH/mobilenet_v1_opt.nb) +``` + +(2) 创建predictor + +```python +predictor = create_paddle_predictor(config) +``` + +(3) 从图片读入数据 + +```python +image = Image.open('./example.jpg') +resized_image = image.resize((224, 224), Image.BILINEAR) +image_data = np.array(resized_image).flatten().tolist() +``` + +(4) 设置输入数据 + +```python +input_tensor = predictor.get_input(0) +input_tensor.resize([1, 3, 224, 224]) +input_tensor.set_float_data(image_data) +``` + +(5) 执行预测 +```python +predictor.run() +``` + +(6) 得到输出数据 +```python +output_tensor = predictor.get_output(0) +print(output_tensor.shape()) +print(output_tensor.float_data()[:10]) +``` + +详细的Python API说明文档位于[Python API](../api_reference/python_api_doc)。更多Python应用预测开发可以参考位于 [demo/python](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/python) 下的示例代码,或者位于[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo)的工程示例代码。 diff --git a/docs/demo_guides/cpp_demo.md b/docs/demo_guides/cpp_demo.md deleted file mode 100644 index 7ce61244f9..0000000000 --- a/docs/demo_guides/cpp_demo.md +++ /dev/null @@ -1,278 +0,0 @@ -# C++ Demo - -## 1. 下载最新版本预测库 - -预测库下载界面位于[Paddle-Lite官方预编译库](../user_guides/release_lib),可根据需求选择合适版本。 - -以**Android-ARMv8架构**为例,可以下载以下版本: - - -|ARM Version|build_extra|arm_stl|target|下载| -|:-------:|:-----:|:-----:|:-----:|:-------:| -|armv8|OFF|c++_static|tiny_publish|[release/v2.3](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.3.0/inference_lite_lib.android.armv8.gcc.c++_static.tiny_publish.tar.gz)| - -**解压后内容如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/1inference_lib.png) - -## 2. 转化模型 - -PaddlePaddle的原生模型需要经过[opt]()工具转化为Paddle-Lite可以支持的naive_buffer格式。 - -以`mobilenet_v1`模型为例: - -(1)下载[mobilenet_v1模型](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)后解压: - -```shell -wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz -tar zxf mobilenet_v1.tar.gz -``` - -**如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/3inference_model.png) - -(2)模型转换 - - - - v2.6.0版本之前 - - 下载[opt工具](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.3.0/opt)。放入同一文件夹,终端输入命令转化模型 - - ```shell - wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.3.0/opt - chmod +x opt - ./opt --model_dir=./mobilenet_v1 --optimize_out_type=naive_buffer --optimize_out=./mobilenet_v1_opt - ``` - - v2.6.0版本以及后续版本 - - 安装paddlelite,终端输入命令转化模型 - - ```shell - python -m pip install paddlelite - paddle_lite_opt --model_dir=./mobilenet_v1 --optimize_out_type=naive_buffer --optimize_out=./mobilenet_v1_opt - ``` -**结果如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/2opt_model.png) - - - -## 3. 编写预测程序 - -准备好预测库和模型,我们便可以编写程序来执行预测。我们提供涵盖图像分类、目标检测等多种应用场景的C++示例demo可供参考,位于`inference_lite_lib.android.armv8/demo/cxx`。 - -以mobile net_v1预测为例:`mobile_light`为mobilenet_v1预测示例,可以直接调用。 - -**示例如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/4light_demo.png) - - - -## 4. 编译 - -预测程序需要编译为Android可执行文件。 - -以mobilenet_v1模型为例,C++示例位于`inference_lite_lib.android.armv8/demo/mobile_light` - -```shell -cd inference_lite_lib.android.armv8/demo/mobile_light -``` - -编译demo - -```shell -make -``` - -**结果如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/5compile_demo.png) - -## 5. 执行预测 - -通过adb工具将可执行文件推送到手机上执行预测 - -(1)保证电脑已经安装adb工具,手机以"USB调试"、"文件传输模式"连接到电脑。 - -``` shell -adb deveices #查看adb设备是否已被识别 -``` - -**连接如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/6adb_devices.png) - -(2)准备预测库、模型和预测文件 - -1、将模型、动态库和预测文件放入同一文件夹: - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/7files.png) - -**注意**:动态预测库文件位于: `inference_lite_lib.android.armv8/cxx/liblibpaddle_light_api_shared.so` - -2、文件推送到手机: - -``` shell -chmod +x mobilenetv1_light_api -adb push mobilenet_v1_opt.nb /data/local/tmp -adb push libpaddle_light_api_shared.so /data/local/tmp -adb push mobilenetv1_light_api /data/local/tmp -``` -**效果如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/8push_file.png) - -(3)执行预测 - -```shell -adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && mobilenetv1_light_api ./mobilenet_v1_opt.nb' -``` -**结果如下图所示:** - -![image](https://paddlelite-data.bj.bcebos.com/doc_images/cxx_demo/9result.png) - -上图的`Output`为mobilenet_v1模型在全1输入时,得到的预测输出。至此,Paddle-Lite的C++ demo执行完毕。 - - - - - -## 注:如何在代码中使用 API - -C++代码调用Paddle-Lite执行预测库仅需以下五步: - -(1)引用头文件和命名空间 - -```c++ -#include "paddle_api.h" -using namespace paddle::lite_api; -``` - -(2)指定模型文件,创建Predictor - -```C++ -// 1. Set MobileConfig, model_file_path is -// the path to model model file. -MobileConfig config; -config.set_model_from_file(model_file_path); -// 2. Create PaddlePredictor by MobileConfig -std::shared_ptr predictor = - CreatePaddlePredictor(config); -``` - -(3)设置模型输入 (下面以全一输入为例) - -```c++ -std::unique_ptr input_tensor(std::move(predictor->GetInput(0))); -input_tensor->Resize({1, 3, 224, 224}); -auto* data = input_tensor->mutable_data(); -for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) { - data[i] = 1; -} -``` - -(4)执行预测 - -```c++ -predictor->Run(); -``` - -(5)获得预测结果 - -```c++ -std::unique_ptr output_tensor( - std::move(predictor->GetOutput(0))); -// 转化为数据 -auto output_data=output_tensor->data(); -``` - - - - - -## 其他cxx_demo的编译与预期结果 - -### Light API Demo - -```shell -cd ../mobile_light -make -adb push mobilenetv1_light_api /data/local/tmp/ -adb shell chmod +x /data/local/tmp/mobilenetv1_light_api -adb shell "/data/local/tmp/mobilenetv1_light_api --model_dir=/data/local/tmp/mobilenet_v1.opt " -``` - - -### 图像分类 Demo - -```shell -cd ../mobile_classify -wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz -tar zxvf mobilenet_v1.tar.gz -make -adb push mobile_classify /data/local/tmp/ -adb push test.jpg /data/local/tmp/ -adb push labels.txt /data/local/tmp/ -adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ -adb shell chmod +x /data/local/tmp/mobile_classify -adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1.opt /data/local/tmp/test.jpg /data/local/tmp/labels.txt" -``` - -### 目标检测 Demo - -```shell -cd ../mobile_detection -wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-ssd.tar.gz -tar zxvf mobilenetv1-ssd.tar.gz -make -adb push mobile_detection /data/local/tmp/ -adb push test.jpg /data/local/tmp/ -adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ -adb shell chmod +x /data/local/tmp/mobile_detection -adb shell "export LD_LIBRARY_PATH=/data/local/tmp/:$LD_LIBRARY_PATH && /data/local/tmp/mobile_detection /data/local/tmp/mobilenetv1-ssd /data/local/tmp/test.jpg" -adb pull /data/local/tmp/test_detection_result.jpg ./ -``` - -### light API Demo 运行结果 - -运行成功后 ,将在控制台输出预测结果的前10个类别的预测概率: - -```shell -Output dim: 1000 -Output[0]: 0.000191 -Output[100]: 0.000160 -Output[200]: 0.000264 -Output[300]: 0.000211 -Output[400]: 0.001032 -Output[500]: 0.000110 -Output[600]: 0.004829 -Output[700]: 0.001845 -Output[800]: 0.000202 -Output[900]: 0.000586 -``` - -### 图像分类 Demo 运行结果 - -运行成功后 ,将在控制台输出预测结果的前5个类别的类型索引、名字和预测概率: - -```shell -parameter: model_dir, image_path and label_file are necessary -parameter: topk, input_width, input_height, are optional -i: 0, index: 285, name: Egyptian cat, score: 0.482870 -i: 1, index: 281, name: tabby, tabby cat, score: 0.471593 -i: 2, index: 282, name: tiger cat, score: 0.039779 -i: 3, index: 287, name: lynx, catamount, score: 0.002430 -i: 4, index: 722, name: ping-pong ball, score: 0.000508 -``` - -### 目标检测 Demo 运行结果 - -运行成功后 ,将在控制台输出检测目标的类型、预测概率和坐标: - -```shell -running result: -detection image size: 935, 1241, detect object: person, score: 0.996098, location: x=187, y=43, width=540, height=592 -detection image size: 935, 1241, detect object: person, score: 0.935293, location: x=123, y=639, width=579, height=597 -``` diff --git a/docs/demo_guides/java_demo.md b/docs/demo_guides/java_demo.md deleted file mode 100644 index ad37e7b95d..0000000000 --- a/docs/demo_guides/java_demo.md +++ /dev/null @@ -1,99 +0,0 @@ -# Java Demo - -本节中,Java demo 完整代码位于 [demo/java](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/java) 。 - -要编译和跑起Android demo 程序 PaddlePredictor,你需要准备: - -1. 一台能运行安卓程序的安卓手机 -2. 一台带有AndroidStudio的开发机 - -## 编译 - -首先在PaddleLite的开发 [Docker镜像](../user_guides/source_compile) 中,拉取最新PaddleLite代码,编译对应你手机架构的预测库, -下面我们以arm8 架构举例。进入paddlelite 目录,运行以下命令: - -```shell -./lite/tools/build.sh \ - --arm_os=android \ - --arm_abi=armv8 \ - --arm_lang=gcc \ - --android_stl=c++_static \ - tiny_publish -``` - -命令完成后查看要存在 - -``` -./build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/java/so/libpaddle_lite_jni.so -./build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/java/jar/PaddlePredictor.jar -./build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/demo/java/android -``` - -libpaddle_lite_jni.so为 PaddleLite c++ 动态链接库,PaddlePredictor.jar为 Java jar 包,两者包含 PaddleLite Java API,接下来 Android Java 代码会使用这些api。android文件夹中则是Android demo。 - -## 准备 demo 需要的其他文件 - -Demo 除了代码,还需要准备在Android工程目录下配置好JNI .so 库(上节提到的`libpaddle_lite_jni.so`),Java .jar 包(上文提到的`PaddlePredictor.jar` ),和模型文件。我们提供了自动化的脚本和手动拷贝两种方法,用户可以根据自己需要选择: - -### 脚本方法 - -进入 `build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/demo/java/android`,我们准备了一个脚本`prepare_demo.bash`,脚本输入一个参数,为你要拷贝的.so 对应的架构文件夹名。 - -例如运行 - -``` -bash prepare_demo.bash arm8 -``` - -该脚本自动下载并解压缩模型文件,拷贝了 .jar 包进demo,还有生成的.so包进`PaddlePredictor/app/src/main/jinLibs/架构文件夹下`, -在我们这个例子里,armv8 就是架构文件夹。备注:这种方式构建的 demo 在 armv8 手机运行正常。如果要demo 程序在别的手机架构(如 armv7)上也运行正常,需要添加别的架构。 - -### 手动拷贝方法 - -接下来我们介绍手动拷贝,如果使用了脚本,那么可以跳过以下手动方法的介绍。 - -### 把 .so 动态库和 .jar 拷贝进安卓demo程序: - -1. 将PaddlePredictor 载入到AndroidStudio。 -2. 将`libpaddle_lite_jni.so`拷贝进 `PaddlePredictor/app/src/main/jinLibs/架构文件夹下` ,比如文件夹arm8里要包含该 .so文件。 -3. 将 `PaddlePredictor.jar` 拷贝进 `PaddlePredictor/app/libs` 下 - -### 把demo使用到的模型文件拷贝进安卓程序: - -下载我们的5个模型文件,并解压缩到 `PaddlePredictor/app/src/main/assets` 这个文件夹中 -需要拷贝的模型文件和下载地址: - -``` -inception_v4_simple_opt.nb http://paddle-inference-dist.bj.bcebos.com/inception_v4_simple_opt.nb.tar.gz -lite_naive_model_opt.nb http://paddle-inference-dist.bj.bcebos.com/lite_naive_model_opt.nb.tar.gz -mobilenet_v1_opt.nb http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1_opt.nb.tar.gz -mobilenet_v2_relu_opt.nb http://paddle-inference-dist.bj.bcebos.com/mobilenet_v2_relu_opt.nb.tar.gz -resnet50_opt.nb http://paddle-inference-dist.bj.bcebos.com/resnet50_opt.nb.tar.gz -``` - -下载完后,assets文件夹里要包含解压后的上面五个模型文件夹,但demo里不需要保存原压缩.tar.gz 文件。 - -注意:输入的模型要求为naive buffer存储格式,您可以通过 [**Model Optimize Tool**](../user_guides/model_optimize_tool) 将fluid模型转为naive buffer存储格式。 - -## 运行 Android 程序结果 - -以上准备工作完成,就可以开始Build 、安装、和运行安卓demo程序。当你运行PaddlePredictor 程序时,大概会等10秒,然后看到类似以下字样: - -``` -lite_naive_model output: 50.213173, -28.872887 -expected: 50.2132, -28.8729 - -inception_v4_simple test:true -time: xxx ms - -resnet50 test:true -time: xxx ms - -mobilenet_v1 test:true -time: xxx ms - -mobilenet_v2 test:true -time: xxx ms -``` - -该 demo 程序跑我们的 5 个模型,第一个模型结果将真正的头两个数字输出,并在第二行附上期望的正确值。你应该要看到他们的误差小于0.001。后面四个模型如果你看到 `test:true` 字样,说明模型输出通过了我们在 demo 程序里对其输出的测试。time 代表该测试花费的时间。 diff --git a/docs/demo_guides/python_demo.md b/docs/demo_guides/python_demo.md deleted file mode 100644 index 59f81783c0..0000000000 --- a/docs/demo_guides/python_demo.md +++ /dev/null @@ -1,120 +0,0 @@ -# Python Demo - -## 1. 下载最新版本python预测库 - -```shell -python -m pip install paddlelite -``` - -## 2. 转化模型 - -PaddlePaddle的原生模型需要经过[opt]()工具转化为Paddle-Lite可以支持的naive_buffer格式。 - -以`mobilenet_v1`模型为例: - -(1)下载[mobilenet_v1模型](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)后解压: - -```shell -wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz -tar zxf mobilenet_v1.tar.gz -``` - -(2)使用opt工具: - - 从磁盘加载模型时,根据模型和参数文件存储方式不同,加载模型和参数的路径有两种形式。 - -- Linux环境 - - 非combined形式:模型文件夹model_dir下存在一个模型文件和多个参数文件时,传入模型文件夹路径,模型文件名默认为__model__。 - - ```shell - paddle_lite_opt --model_dir=./mobilenet_v1 \ - --optimize_out=mobilenet_v1_opt \ - --optimize_out_type=naive_buffer \ - --valid_targets=x86 - ``` - - combined形式:模型文件夹model_dir下只有一个模型文件__model__和一个参数文件__params__时,传入模型文件和参数文件路径 - - ```shell - paddle_lite_opt --model_file=./mobilenet_v1/__model__ \ - --param_file=./mobilenet_v1/__params__ \ - --optimize_out=mobilenet_v1_opt \ - --optimize_out_type=naive_buffer \ - --valid_targets=x86 - ``` - -- windows环境 - -windows 暂不支持命令行方式直接运行模型转换器,需要编写python脚本 - -```python -import paddlelite.lite as lite - -a=lite.Opt() -# 非combined形式 -a.set_model_dir("D:\\YOU_MODEL_PATH\\mobilenet_v1") - -# conmbined形式 -# a.set_model_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__model__") -# a.set_param_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__params__") - -a.set_optimize_out("mobilenet_v1_opt") -a.set_valid_places("x86") - -a.run() -``` - -- MAC 环境 - -Opt工具使用方式同Linux(MAC环境暂不支持python端预测,下个版本会修复该问题) - -## 3. 编写预测程序 - -准备好预测库和模型,我们便可以编写程序来执行预测。我们提供涵盖图像分类、目标检测等多种应用场景的C++示例demo可供参考,创建文件mobilenetV1_light_api.py, -python demo 完整代码位于 [demo/python](https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/demo/python/mobilenetv1_light_api.py) 。 - -(1) 设置config信息 -```python -from paddlelite.lite import * - -config = MobileConfig() -config.set_model_from_file(/YOU_MODEL_PATH/mobilenet_v1_opt.nb) -``` - -(2) 创建predictor - -```python -predictor = create_paddle_predictor(config) -``` - -(3) 从图片读入数据 - -```python -image = Image.open('./example.jpg') -resized_image = image.resize((224, 224), Image.BILINEAR) -image_data = np.array(resized_image).flatten().tolist() -``` - -(4) 设置输入数据 - -```python -input_tensor = predictor.get_input(0) -input_tensor.resize([1, 3, 224, 224]) -input_tensor.set_float_data(image_data) -``` - -(5) 执行预测 -```python -predictor.run() -``` - -(6) 得到输出数据 -```python -output_tensor = predictor.get_output(0) -print(output_tensor.shape()) -print(output_tensor.float_data()[:10]) -``` - -## 4. 运行文件 -```shell -python mobilenetV1_light_api.py -``` diff --git a/docs/index.rst b/docs/index.rst index a4a5e7e190..11cdf908cd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -17,6 +17,26 @@ Welcome to Paddle-Lite's documentation! introduction/support_operation_list introduction/support_model_list +.. toctree:: + :maxdepth: 1 + :caption: 快速开始 + :name: sec-quick-start + + quick_start/tutorial + quick_start/release_lib + quick_start/cpp_demo + quick_start/java_demo + quick_start/python_demo + +.. toctree:: + :maxdepth: 1 + :caption: 应用开发 + :name: sec-app-develop + + app_develop/cpp_app_develop + app_develop/java_app_develop + app_develop/python_app_develop + .. toctree:: :maxdepth: 1 :caption: Benchmark @@ -30,8 +50,6 @@ Welcome to Paddle-Lite's documentation! :caption: 使用方法 :name: sec-user-guides - user_guides/tutorial - user_guides/release_lib user_guides/source_compile user_guides/x2paddle user_guides/model_optimize_tool @@ -46,9 +64,6 @@ Welcome to Paddle-Lite's documentation! :caption: 部署示例 :name: sec-demo_guides - demo_guides/cpp_demo - demo_guides/java_demo - demo_guides/python_demo demo_guides/android_app_demo demo_guides/ios_app_demo demo_guides/linux_arm_demo diff --git a/docs/quick_start/cpp_demo.md b/docs/quick_start/cpp_demo.md new file mode 100644 index 0000000000..a6c43fece9 --- /dev/null +++ b/docs/quick_start/cpp_demo.md @@ -0,0 +1,241 @@ +# C++ 完整示例 + +本章节展示的所有C++ 示例代码位于 [demo/c++](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx) 。 + +## 1. 环境准备 + +要编译和运行Android C++ 示例程序,你需要准备: + +1. 一台armv7或armv8架构的安卓手机 +2. 一台可以编译PaddleLite的电脑 + +## 2. 下载预编译的预测库 + +预测库下载界面位于[Paddle-Lite官方预编译库](release_lib),可根据您的手机型号选择合适版本。 + +以**Android-ARMv8架构**为例,可以下载以下版本: + +| Arch |with_extra|arm_stl|with_cv|下载| +|:-------:|:-----:|:-----:|:-----:|:-------:| +|armv8|OFF|c++_static|OFF|[release/v2.6.1](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.CV_OFF.tar.gz)| + +**解压后内容结构如下:** + +```shell +inference_lite_lib.android.armv8 # Paddle-Lite 预测库 +├── cxx # C++ 预测库 +│   ├── include # C++ 预测库头文件 +│   └── lib # C++ 预测库文件 +│   ├── libpaddle_api_light_bundled.a # 静态预测库 +│   └── libpaddle_light_api_shared.so # 动态预测库 +├── demo # 示例 Demo +│   ├── cxx # C++ 示例 Demo +│   └── java # Java 示例 Demo +└── java # Java 预测库 +``` + +## 3. 准备预测部署模型 + +(1) 模型下载:下载[mobilenet_v1](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)模型后解压,得到Paddle非combined形式的模型,位于文件夹 `mobilenet_v1` 下。可通过模型可视化工具[Netron](https://lutzroeder.github.io/netron/)打开文件夹下的`__model__`文件,查看模型结构。 + +```shell +wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz +tar zxf mobilenet_v1.tar.gz +``` + +(2) 模型转换:Paddle的原生模型需要经过[opt](../user_guides/model_optimize_tool)工具转化为Paddle-Lite可以支持的naive_buffer格式。 + +方式一: 下载[opt工具](../user_guides/model_optimize_tool),放入与`mobilenet_v1`文件夹同级目录,终端输入以下命令转化模型 + +```shell +# Linux +wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.1/opt +chmod +x opt +./opt --model_dir=./mobilenet_v1 \ + --optimize_out_type=naive_buffer \ + --optimize_out=./mobilenet_v1_opt + +# Mac +wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.1/opt_mac +chmod +x opt_mac +./opt_mac --model_dir=./mobilenet_v1 \ + --optimize_out_type=naive_buffer \ + --optimize_out=./mobilenet_v1_opt +``` + +方式二: 通过pip安装paddlelite,终端输入命令转化模型 + +```shell +python -m pip install paddlelite +paddle_lite_opt --model_dir=./mobilenet_v1 \ + --optimize_out_type=naive_buffer \ + --optimize_out=./mobilenet_v1_opt +``` + +以上命令执行成功之后将在同级目录生成名为`mobilenet_v1_opt.nb`的优化后模型文件。 + + + +## 4. 编译预测示例程序 + +准备好预测库和模型,就可以直接编译随着预测库一起发布的 C++ Demo,位于在第二步中下载的预测库文件目录下`inference_lite_lib.android.armv8/demo/cxx`。以mobilenet_v1为例,目录下的`mobile_light`为mobilenet_v1预测示例,预测程序需要编译为Android可执行文件。 + +```shell +cd inference_lite_lib.android.armv8/demo/mobile_light +make +``` + +会在同级目录下生成名为`mobilenetv1_light_api`的可执行文件。 + +## 5. 预测部署和执行 + +(1) 设置手机:手机USB连接电脑,打开`设置 -> 开发者模式 -> USB调试 -> 允许(授权)当前电脑调试手机`。保证当前电脑已经安装[adb工具](https://developer.android.com/studio/command-line/adb),运行以下命令,确认当前手机设备已被识别: + +``` shell +adb devices +# 如果手机设备已经被正确识别,将输出如下信息 +List of devices attached +017QXM19C1000664 device +``` + +(2) 预测部署:第二步中的C++动态预测库文件`libpaddle_light_api_shared.so`,将第三步中生成的优化后模型文件`mobilenet_v1_opt.nb`和第四步中编译得到的预测示例程序`mobilenetv1_light_api`放入同一文件夹,并将这三个文件推送到手机: + +``` shell +chmod +x mobilenetv1_light_api +adb push mobilenet_v1_opt.nb /data/local/tmp +adb push libpaddle_light_api_shared.so /data/local/tmp +adb push mobilenetv1_light_api /data/local/tmp + +# 如果推送成功,将显示如下信息 +adb shell 'ls -l /data/local/tmp' +total 24168 +-rwxrwxrwx 1 root root 1624280 2020-09-01 13:47 libpaddle_light_api_shared.so +-rw-rw-rw- 1 root root 17018243 2020-09-01 12:28 mobilenet_v1_opt.nb +-rwxrwxrwx 1 root root 6076144 2020-09-01 13:47 mobilenetv1_light_api +``` + +(3) 执行预测,以下输出为mobilenet_v1模型在全1输入时,得到的预测结果。 + +```shell +adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && ./mobilenetv1_light_api mobilenet_v1_opt.nb' + +# 如果正确运行,将输出如下信息 +run_idx:1 / 10: 33.821 ms +run_idx:2 / 10: 33.8 ms +run_idx:3 / 10: 33.867 ms +run_idx:4 / 10: 34.009 ms +run_idx:5 / 10: 33.699 ms +run_idx:6 / 10: 33.644 ms +run_idx:7 / 10: 33.611 ms +run_idx:8 / 10: 33.783 ms +run_idx:9 / 10: 33.731 ms +run_idx:10 / 10: 33.423 ms + +======= benchmark summary ======= +input_shape(NCHW):1 3 224 224 +model_dir:mobilenet_v1_opt.nb +warmup:10 +repeats:10 +max_duration:34.009 +min_duration:33.423 +avg_duration:33.7388 + +====== output summary ====== +output tensor num:1 + +--- output tensor 0 --- +output shape(NCHW):1 1000 +output tensor 0 elem num:1000 +output tensor 0 standard deviation:0.00219646 +output tensor 0 mean value:0.001 +``` + +## 更多C++示例 + +### 图像分类示例 + +```shell +cd inference_lite_lib.android.armv8/demo/cxx/mobile_classify + +# 下载模型 +wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz +tar zxvf mobilenet_v1.tar.gz +# 转化模型 +paddle_lite_opt --model_dir=./mobilenet_v1 \ + --optimize_out_type=naive_buffer \ + --optimize_out=./mobilenet_v1_opt +# 编译预测程序 +make +# 预测部署 +adb push mobile_classify /data/local/tmp/ +adb push mobilenet_v1_opt.nb /data/local/tmp/ +adb push mobilenet_v1/test.jpg /data/local/tmp/ +adb push mobilenet_v1/labels.txt /data/local/tmp/ +adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ +adb shell 'chmod +x /data/local/tmp/mobile_classify' +# 执行预测 +adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && ./mobile_classify mobilenet_v1_opt.nb test.jpg labels.txt' + +# 运行成功后 ,将在控制台输出预测结果的前5个类别的类型索引、名字和预测概率 +parameter: model_file, image_path and label_file are necessary +parameter: topk, input_width, input_height, are optional +i: 0, index: 287, name: lynx, catamount, score: 0.317595 +i: 1, index: 285, name: Egyptian cat, score: 0.308135 +i: 2, index: 281, name: tabby, tabby cat, score: 0.161924 +i: 3, index: 282, name: tiger cat, score: 0.093659 +i: 4, index: 283, name: Persian cat, score: 0.060198 +``` + +### 目标检测示例 + +```shell +cd inference_lite_lib.android.armv8/demo/cxx/ssd_detection + +# 下载模型 +wget https://paddlelite-data.bj.bcebos.com/doc_models/ssd_mobilenet_v1.tar.gz +tar zxvf ssd_mobilenet_v1.tar.gz +# 转化模型 +paddle_lite_opt --model_dir=./ssd_mobilenet_v1 \ + --optimize_out_type=naive_buffer \ + --optimize_out=./ssd_mobilenet_v1_opt +# 编译预测程序 +make +# 预测部署 +adb push ssd_detection /data/local/tmp/ +adb push ssd_mobilenet_v1_opt.nb /data/local/tmp/ +adb push test.jpg /data/local/tmp/ +adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/ +adb shell 'chmod +x /data/local/tmp/ssd_detection' +# 执行预测 +adb shell 'cd /data/local/tmp && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp && ./ssd_detection ssd_mobilenet_v1_opt.nb test.jpg' + +# 运行成功后 ,将在控制台输出检测目标的类型、预测概率和坐标 +detection, image size: 935, 1241, detect object: person, score: 0.995543, location: x=187, y=43, width=540, height=591 +detection, image size: 935, 1241, detect object: person, score: 0.929626, location: x=125, y=639, width=577, height=597 + +# 获得目标检测结果图片,并查看 +adb pull /data/local/tmp/test_ssd_detection_result.jpg ./ +``` + +### 口罩检测示例 + +```shell +cd inference_lite_lib.android.armv8/demo/cxx/mask_detection + +# 准备预测部署文件 +bash prepare.sh + +# 执行预测 +cd mask_demo && bash run.sh + +# 运行成功后,将在控制台输出如下内容,可以打开test_img_result.jpg图片查看预测结果 +../mask_demo/: 9 files pushed, 0 skipped. 141.6 MB/s (28652282 bytes in 0.193s) +Load detecion model succeed. +Detecting face succeed. +Load classification model succeed. +detect face, location: x=237, y=107, width=194, height=255, wear mask: 1, prob: 0.987625 +detect face, location: x=61, y=238, width=166, height=213, wear mask: 1, prob: 0.925679 +detect face, location: x=566, y=176, width=245, height=294, wear mask: 1, prob: 0.550348 +write result to file: test_img_result.jpg, success. +/data/local/tmp/mask_demo/test_img_result.jpg: 1 file pulled, 0 skipped. 13.7 MB/s (87742 bytes in 0.006s) +``` diff --git a/docs/quick_start/java_demo.md b/docs/quick_start/java_demo.md new file mode 100644 index 0000000000..4bae5cf455 --- /dev/null +++ b/docs/quick_start/java_demo.md @@ -0,0 +1,111 @@ +# Java 完整示例 + +本章节展示的所有Java 示例代码位于 [demo/java](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/java) 。 + +## 1. 环境准备 + +要编译和运行Android Java 示例程序,你需要准备: + +1. 一台armv7或armv8架构的安卓手机 +2. 一台装有AndroidStudio的开发机 + +## 2. 下载预编译的预测库 + +预测库下载界面位于[Paddle-Lite官方预编译库](release_lib),可根据您的手机型号选择合适版本。 + +以**Android-ARMv8架构**为例,可以下载以下版本: + +| Arch |with_extra|arm_stl|with_cv|下载| +|:-------:|:-----:|:-----:|:-----:|:-------:| +|armv8|OFF|c++_static|OFF|[release/v2.6.1](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.CV_OFF.tar.gz)| + +**解压后内容结构如下:** + +```shell +inference_lite_lib.android.armv8 # Paddle-Lite 预测库 +├── cxx # C++ 预测库 +│   ├── include # C++ 预测库头文件 +│   └── lib # C++ 预测库文件 +├── demo # 示例 Demo +│   ├── cxx # C++ 示例 Demo +│   └── java # Java 示例 Demo +│   ├── README.md # Demo Readme 文件 +│   └── android # Java Andriod Demo +└── java # Java 预测库 +    ├── jar +    │   └── PaddlePredictor.jar # Java JAR 包 +    ├── so +    │   └── libpaddle_lite_jni.so # Java JNI 动态链接库 +    └── src +``` + +## 3. 准备预测部署模型 + +### 自动化脚本方法 + +在Java Andriod Demo文件夹下,我们准备了一个脚本`prepare_demo.bash`,输入手机架构参数例如`arm64-v8a`,即可自动打包所有预测部署所需文件。 + +``` +cd inference_lite_lib.android.armv8/demo/java/android +bash prepare_demo.bash arm8 +``` + +以上命令自动进行了以下三步操作: + +1. 拷贝JNI动态链接库`libpaddle_lite_jni.so`到`PaddlePredictor/app/src/main/jniLibs/arm64-v8a/` +2. 拷贝JAR包`PaddlePredictor.jar` 到 `PaddlePredictor/app/libs/` +3. 自动下载并解压所有模型文件,拷贝到`PaddlePredictor/app/src/main/assets/` + +**注意:** 目前脚本输入手机架构参数仅支持 `arm7 | arm8 | armeabi-v7a | arm64-v8a`。 + +### 手动拷贝方法 + +(1) 把Java JNI动态链接库和Java JAR包拷贝进安卓demo程序文件夹下: + +```shell +cd inference_lite_lib.android.armv8/demo/java/android +# 请替换<架构文件夹>为手机架构名称,例如 arm64-v8a +cp ../../../java/so/libpaddle_lite_jni.so PaddlePredictor/app/src/main/jniLibs/<架构文件夹> +cp ../../../java/jar/PaddlePredictor.jar PaddlePredictor/app/libs/ +``` + +(2) 下载模型文件 + +下载以下5个模型,并解压缩到 `PaddlePredictor/app/src/main/assets` 文件夹中。解压之后,assets文件夹里要包含解压后的五个以`.nb`结尾的模型文件,但不需要保存原压缩`.tar.gz`文件。 + +| 模型| 下载地址| +| :-- | :-- | +| inception_v4_simple_opt.nb| http://paddle-inference-dist.bj.bcebos.com/inception_v4_simple_opt.nb.tar.gz | +| lite_naive_model_opt.nb | http://paddle-inference-dist.bj.bcebos.com/lite_naive_model_opt.nb.tar.gz | +| mobilenet_v1_opt.nb | http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1_opt.nb.tar.gz | +| mobilenet_v2_relu_opt.nb| http://paddle-inference-dist.bj.bcebos.com/mobilenet_v2_relu_opt.nb.tar.gz | +| resnet50_opt.nb| http://paddle-inference-dist.bj.bcebos.com/resnet50_opt.nb.tar.gz | + +注意:模型要求为naive buffer格式,您可以通过 [opt工具](../user_guides/model_optimize_tool) 将Paddle模型转为naive buffer存储格式。 + +## 4. 运行预测示例程序 + +1. 用AndroidStudio打开`inference_lite_lib.android.armv8/demo/java/android/PaddlePredictor`文件夹(需要联网),打开后工程会自动build完成。 +2. 设置手机:手机USB连接电脑,打开`设置 -> 开发者模式 -> USB调试 -> 允许(授权)当前电脑调试手机`,并确认AndroidStudio可以识别接入的手机设备。 +3. 按下AndroidStudio的Run按钮,AndroidStudio会自动编译APP并安装到手机。在手机上打开安装成功的APP,大概会等10秒,然后看到类似以下输出: + +``` +lite_naive_model output: 50.213173, -28.872887 +expected: 50.2132, -28.8729 + +inception_v4_simple test:true +time: xxx ms + +resnet50 test:true +time: xxx ms + +mobilenet_v1 test:true +time: xxx ms + +mobilenet_v2 test:true +time: xxx ms +``` + +该 demo 程序跑我们的 5 个模型,第一个模型结果将真正的头两个数字输出,并在第二行附上期望的正确值。你应该要看到他们的误差小于0.001。后面四个模型如果你看到 `test:true` 字样,说明模型输出通过了我们在 demo 程序里对其输出的测试。time 代表该测试花费的时间。 + +**注意:** 在这一步中,如果遇到Andriod Studio编译/安装失败等问题,请参考[Andriod示例](../demo_guides/android_app_demo.html#id6)中部署方法章节的详细步骤和注意事项。 diff --git a/docs/quick_start/python_demo.md b/docs/quick_start/python_demo.md new file mode 100644 index 0000000000..3e3c0acd83 --- /dev/null +++ b/docs/quick_start/python_demo.md @@ -0,0 +1,75 @@ +# Python 完整示例 + +本章节展示的所有Python 示例代码位于 [demo/python](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/python) 。Python预测仅支持服务器端预测,目前支持 Windows / Mac / Linux (x86 | ARM)。 + +## 1. 环境准备 + +要编译和运行Android Python 示例程序,你需要准备一台可以编译运行PaddleLite的电脑。 + +## 2. 安装python预测库 + +```shell +python -m pip install paddlelite +``` + +**注意:** PyPI源目前仅提供Windows / Mac / Linux (x86) 三个平台pip安装包,如果您需要使用AMRLinux平台的Python预测功能,请参考[编译Linux预测库](../user_guides/Compile/Linux)。 + +## 3. 准备预测部署模型 + +(1) 模型下载:下载[mobilenet_v1](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)模型后解压,得到Paddle非combined形式的模型,位于文件夹 `mobilenet_v1` 下。可通过模型可视化工具[Netron](https://lutzroeder.github.io/netron/)打开文件夹下的`__model__`文件,查看模型结构。 + + +```shell +wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz +tar zxf mobilenet_v1.tar.gz +``` + +(2) 模型转换:Paddle的原生模型需要经过[opt](../user_guides/model_optimize_tool)工具转化为Paddle-Lite可以支持的naive_buffer格式。 + +- Linux环境:通过pip安装paddlelite,即可获得paddle_lite_opt命令工具 + + ```shell + paddle_lite_opt --model_dir=./mobilenet_v1 \ + --optimize_out=mobilenet_v1_opt \ + --optimize_out_type=naive_buffer \ + --valid_targets=x86 + ``` + +- windows环境:windows 暂不支持命令行方式直接运行模型转换器,需要编写python脚本 + + ```python + import paddlelite.lite as lite + + a=lite.Opt() + # 非combined形式 + a.set_model_dir("D:\\YOU_MODEL_PATH\\mobilenet_v1") + + # conmbined形式 + # a.set_model_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__model__") + # a.set_param_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__params__") + + a.set_optimize_out("mobilenet_v1_opt") + a.set_valid_places("x86") + + a.run() + ``` + +- MAC环境: paddle_lite_opt工具使用方式同Linux。 + +以上命令执行成功之后将在同级目录生成名为`mobilenet_v1_opt.nb`的优化后模型文件。 + +## 4. 下载和运行预测示例程序 + +从[demo/python](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/python)下载预测示例文件`mobilenetv1_light_api.py`和`mobilenetv1_full_api.py`,并运行Python预测程序。 + +```shell +# light api的输入为优化后模型文件mobilenet_v1_opt.nb +python mobilenetv1_light_api.py --model_dir=mobilenet_v1_opt.nb + +# full api的输入为优化千的模型文件夹mobilenet_v1 +python mobilenetv1_full_api.py --model_dir=./mobilenet_v1 + +# 运行成功后,将在控制台输出如下内容 +[1L, 1000L] +[0.00019130950386170298, 0.0005920541007071733, 0.00011230241216253489, 6.27333574811928e-05, 0.0001275067188544199, 0.0013214796781539917, 3.138116153422743e-05, 6.52207963867113e-05, 4.780858944286592e-05, 0.0002588215284049511] +``` diff --git a/docs/user_guides/release_lib.md b/docs/quick_start/release_lib.md similarity index 99% rename from docs/user_guides/release_lib.md rename to docs/quick_start/release_lib.md index 6de7bf9fa6..29afa95f71 100644 --- a/docs/user_guides/release_lib.md +++ b/docs/quick_start/release_lib.md @@ -1,5 +1,5 @@ -# 预编译库下载 +# Lite预编译库下载 ## 编译版本介绍 diff --git a/docs/user_guides/tutorial.md b/docs/quick_start/tutorial.md similarity index 89% rename from docs/user_guides/tutorial.md rename to docs/quick_start/tutorial.md index ee156038a6..b042ca9194 100644 --- a/docs/user_guides/tutorial.md +++ b/docs/quick_start/tutorial.md @@ -1,4 +1,4 @@ -# 使用流程 +# 使用Lite预测流程 Lite是一种轻量级、灵活性强、易于扩展的高性能的深度学习预测框架,它可以支持诸如ARM、OpenCL、NPU等等多种终端,同时拥有强大的图优化及预测加速能力。如果您希望将Lite框架集成到自己的项目中,那么只需要如下几步简单操作即可。 @@ -45,7 +45,7 @@ $ ./opt \ ## 四. Lite API -为了方便您的使用,我们提供了C++、Java、Python三种API,并且提供了相应的api的完整使用示例:[C++完整示例](../demo_guides/cpp_demo)、[Java完整示例](../demo_guides/java_demo)、[Python完整示例](../demo_guides/cuda),您可以参考示例中的说明快速了解C++/Java/Python的API使用方法,并集成到您自己的项目中去。需要说明的是,为了减少第三方库的依赖、提高Lite预测框架的通用性,在移动端使用Lite API您需要准备Naive Buffer存储格式的模型,具体方法可参考第2节`模型优化`。 +为了方便您的使用,我们提供了C++、Java、Python三种API,并且提供了相应的api的完整使用示例:[C++完整示例](cpp_demo)、[Java完整示例](java_demo)、[Python完整示例](python_demo),您可以参考示例中的说明快速了解C++/Java/Python的API使用方法,并集成到您自己的项目中去。需要说明的是,为了减少第三方库的依赖、提高Lite预测框架的通用性,在移动端使用Lite API您需要准备Naive Buffer存储格式的模型,具体方法可参考第2节`模型优化`。 ## 五. 测试工具 diff --git a/docs/user_guides/model_quantization.md b/docs/user_guides/model_quantization.md index cb1e4a4337..e3df358361 100644 --- a/docs/user_guides/model_quantization.md +++ b/docs/user_guides/model_quantization.md @@ -52,7 +52,7 @@ ### 3.2 量化模型预测 -和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../demo_guides/cpp_demo)、[Java Demo](../demo_guides/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 +和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../quick_start/cpp_demo)、[Java Demo](../quick_start/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 ## FAQ diff --git a/docs/user_guides/post_quant_no_data.md b/docs/user_guides/post_quant_no_data.md index fa9b42ad9b..95a58427c3 100644 --- a/docs/user_guides/post_quant_no_data.md +++ b/docs/user_guides/post_quant_no_data.md @@ -110,4 +110,4 @@ WeightQuantization.quantize_weight_to_int(self, ### 3.2 量化模型预测 -和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../demo_guides/cpp_demo)、[Java Demo](../demo_guides/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 +和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../quick_start/cpp_demo)、[Java Demo](../quick_start/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 diff --git a/docs/user_guides/post_quant_with_data.md b/docs/user_guides/post_quant_with_data.md index f49faa97ae..53880efe0e 100644 --- a/docs/user_guides/post_quant_with_data.md +++ b/docs/user_guides/post_quant_with_data.md @@ -102,4 +102,4 @@ Demo请参考[文档](https://github.com/PaddlePaddle/PaddleSlim/tree/release/1. ### 3.2 量化模型预测 -和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../demo_guides/cpp_demo)、[Java Demo](../demo_guides/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 +和FP32模型一样,转换后的量化模型可以在Android/IOS APP中加载预测,建议参考[C++ Demo](../quick_start/cpp_demo)、[Java Demo](../quick_start/java_demo)、[Android/IOS Demo](../demo_guides/android_app_demo)。 -- GitLab