未验证 提交 70940bf4 编写于 作者: Q Qi Li 提交者: GitHub

[DOC] add quick start, test=develop, test=document_fix (#4235)

上级 4a6499a6
......@@ -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)
您可以参考示例中的说明快速了解使用方法,并集成到您自己的项目中去。
......
# 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<PaddlePredictor> predictor =
CreatePaddlePredictor<MobileConfig>(config);
```
(3) 设置模型输入 (下面以全一输入为例)
```c++
std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
input_tensor->Resize({1, 3, 224, 224});
auto* data = input_tensor->mutable_data<float>();
for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) {
data[i] = 1;
}
```
(4) 执行预测
```c++
predictor->Run();
```
(5) 获得预测结果
```c++
std::unique_ptr<const Tensor> output_tensor(
std::move(predictor->GetOutput(0)));
// 转化为数据
auto output_data=output_tensor->data<float>();
```
详细的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)的工程示例代码。
# 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)的工程示例代码。
# 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)的工程示例代码。
# 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<PaddlePredictor> predictor =
CreatePaddlePredictor<MobileConfig>(config);
```
(3)设置模型输入 (下面以全一输入为例)
```c++
std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
input_tensor->Resize({1, 3, 224, 224});
auto* data = input_tensor->mutable_data<float>();
for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) {
data[i] = 1;
}
```
(4)执行预测
```c++
predictor->Run();
```
(5)获得预测结果
```c++
std::unique_ptr<const Tensor> output_tensor(
std::move(predictor->GetOutput(0)));
// 转化为数据
auto output_data=output_tensor->data<float>();
```
## 其他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
```
# 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 代表该测试花费的时间。
# 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
```
......@@ -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
......
# 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)
```
# 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)中部署方法章节的详细步骤和注意事项。
# 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]
```
# 预编译库下载
# Lite预编译库下载
## 编译版本介绍
......
# 使用流程
# 使用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节`模型优化`
## 五. 测试工具
......
......@@ -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
......
......@@ -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)
......@@ -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)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册