1
1
# Java 完整示例
2
2
3
- 本章节包含2部分内容:(1) [ Java 示例程序 ] ( java_demo.html#id1 ) ;(2) [ Java 应用开发说明 ] ( java_demo.html#id8 ) 。
3
+ ## 概述
4
4
5
- ## Java 示例程序
5
+ 本教程提供了 Paddle Lite 执行推理的示例程序,通过输入、执行推理、打印推理结果的方式,演示了基于 Java API 接口的推理基本流程,用户能够快速了解 Paddle Lite 执行推理相关 API 的使用。
6
+ 本教程以 Android Studio 工程为案例,介绍 Java API 推理流程,工程文件夹为[ lite/demo/java/android] ( https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/demo/java/android ) 。其中和 Java API 相关的代码在[ lite/demo/java/android/PaddlePredictor/app/src/main/java/com/baidu/paddle/lite/MainActivity.java] ( https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/demo/java/android/PaddlePredictor/app/src/main/java/com/baidu/paddle/lite/MainActivity.java ) 文件中。
6
7
7
- 本章节展示的所有Java 示例代码位于 [ demo/java] ( https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/java ) 。
8
+
9
+ 使用 Paddle Lite 执行推理主要包括以下步骤:
10
+
11
+ - 配置 config 信息:创建 MobileConfig ,用于配置模型路径、运行设备环境等相关信息
12
+
13
+ - 模型加载:通过 ` setModelFromFile ` 接口配置模型路径。
14
+
15
+ - 创建 predictor 对象:通过 ` PaddlePredictor.createPaddlePredictor ` 接口创建 PaddlePredictor 对象,完成模型解析和环境初始化。
16
+
17
+ - 输入数据:推理之前需要向输入 Tensor 中填充数据。即通过 ` predictor.getInput(num) ` 接口获取第 ` num ` 个输入 Tensor ,先做 ` resize ` 处理,给 Tensor 分配相应的空间;然后通过 ` setData ` 接口对 Tensor 进行赋值处理。(如果输入数据是图片,则需要进行预处理,再将预处理后的数据赋值给输入 tensor )
18
+
19
+ - 执行推理:使用 predictor 对象的成员函数 ` run ` 进行模型推理
20
+
21
+ - 输出数据:推理执行结束后,通过 ` predictor.getOutput(num) ` 接口获取第 ` num ` 个输出 Tensor。
22
+
23
+ 其流程图如下:
24
+
25
+
26
+ <p align =center > <img src = " http://bos.bj.bce-internal.sdns.baidu.com/agroup-bos-bj/bj-2e0a5c97eb8068c5d1254f475962a45462335d39 " /></p >
27
+
28
+
29
+ ## Java 应用开发说明
30
+
31
+ Java 代码调用 Paddle-Lite 执行预测仅需五步:
32
+
33
+ (1) 设置 MobileConfig 信息
34
+
35
+ ``` java
36
+ MobileConfig config = new MobileConfig ();
37
+ config. setModelDir(modelPath);
38
+ config. setPowerMode(PowerMode . LITE_POWER_HIGH );
39
+ config. setThreads(1 );
40
+ ```
41
+
42
+ (2) 指定模型文件,创建 PaddlePredictor
43
+
44
+ ``` java
45
+ PaddlePredictor predictor = PaddlePredictor . createPaddlePredictor(config);
46
+ ```
47
+
48
+ (3) 设置模型输入 (下面以第 i 个输入为 i 为例)
49
+
50
+ ``` java
51
+ float [] inputBuffer = new float [10000 ];
52
+ for (int i = 0 ; i < 10000 ; ++ i) {
53
+ inputBuffer[i] = i;
54
+ }
55
+ Tensor input = predictor. getInput(0 );
56
+ input. resize({100 , 100 });
57
+ input. setData(inputBuffer);
58
+ ```
59
+
60
+ 如果模型有多个输入,每一个模型输入都需要准确设置 shape 和 data。
61
+
62
+ (4) 执行预测
63
+
64
+ ``` java
65
+ predictor. run();
66
+ ```
67
+
68
+ (5) 获得预测结果
69
+
70
+ ``` java
71
+ Tensor output = predictor. getOutput(0 );
72
+ ```
73
+ 详细的 Java API 说明文档位于[ Java API] ( ../api_reference/java_api_doc ) 。更多 Java 应用预测开发可以参考位于位于[ Paddle-Lite-Demo] ( https://github.com/PaddlePaddle/Paddle-Lite-Demo ) 的工程示例代码。
74
+
75
+
76
+ ## Android Studio 工程 Java 示例程序
77
+
78
+ 本章节展示的所有 Android Studio 工程代码位于 [ demo/java] ( https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/java ) 。下面将要下载的预测库也已经包含了上述 Android Studio 工程。
8
79
9
80
### 1. 环境准备
10
81
11
- 要编译和运行Android Java 示例程序,你需要准备 :
82
+ 要编译和运行 Android Java 示例程序,你需准备 :
12
83
13
- 1 . 一台armv7或armv8架构的安卓手机
14
- 2 . 一台装有AndroidStudio的开发机
84
+ 1 . 一台 armv7 或 armv8 架构的安卓手机
85
+ 2 . 一台装有 Android Studio 的开发机
15
86
16
87
### 2. 下载预编译的预测库
17
88
21
92
22
93
| Arch | with_extra| arm_stl| with_cv| 下载|
23
94
| :-------:| :-----:| :-----:| :-----:| :-------:|
24
- | armv8| OFF| c++_ static| OFF| [ v2.8 ] ( https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.8 /inference_lite_lib.android.armv8.gcc.c++_static.tar.gz ) |
95
+ | armv8| OFF| c++_ static| OFF| [ v2.9 ] ( https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.9 /inference_lite_lib.android.armv8.gcc.c++_static.tar.gz ) |
25
96
26
97
** 解压后内容结构如下:**
27
98
28
99
``` shell
29
- inference_lite_lib.android.armv8 Paddle-Lite 预测库
100
+ inference_lite_lib.android.armv8.gcc.c++_static Paddle-Lite 预测库
30
101
├── cxx C++ 预测库
31
102
│ ├── include C++ 预测库头文件
32
103
│ └── lib C++ 预测库文件
@@ -47,35 +118,37 @@ inference_lite_lib.android.armv8 Paddle-Lite 预测库
47
118
48
119
#### 自动化脚本方法
49
120
50
- 在Java Andriod Demo文件夹下, 我们准备了一个脚本` prepare_demo.bash ` ,输入手机架构参数例如` arm64-v8a ` ,即可自动打包所有预测部署所需文件 。
121
+ 在下载下来的预测库的 ` demo/java/android ` 文件夹下,为了让您更快上手, 我们准备了一个脚本` prepare_demo.bash ` ,输入手机架构参数例如` arm64-v8a ` ,即可自动准备好所有预测部署所需的文件 。
51
122
52
- ```
53
- cd inference_lite_lib.android.armv8/demo/java/android
123
+ ``` shell
124
+ cd inference_lite_lib.android.armv8.gcc.c++_static /demo/java/android
54
125
bash prepare_demo.bash arm8
55
126
```
56
127
57
- 以上命令自动进行了以下三步操作 :
128
+ 以上命令自动进行以下三步操作 :
58
129
59
- 1 . 拷贝JNI动态链接库 ` libpaddle_lite_jni.so ` 到` PaddlePredictor/app/src/main/jniLibs/arm64-v8a/ `
60
- 2 . 拷贝JAR包 ` PaddlePredictor.jar ` 到 ` PaddlePredictor/app/libs/ `
130
+ 1 . 拷贝 JNI 动态链接库 ` libpaddle_lite_jni.so ` 到` PaddlePredictor/app/src/main/jniLibs/arm64-v8a/ `
131
+ 2 . 拷贝 JAR 包 ` PaddlePredictor.jar ` 到 ` PaddlePredictor/app/libs/ `
61
132
3 . 自动下载并解压所有模型文件,拷贝到` PaddlePredictor/app/src/main/assets/ `
62
133
63
134
** 注意:** 目前脚本输入手机架构参数仅支持 ` arm7 | arm8 | armeabi-v7a | arm64-v8a ` 。
64
135
65
136
#### 手动拷贝方法
66
137
67
- (1) 把Java JNI动态链接库和Java JAR包拷贝进安卓demo程序文件夹下:
138
+ 如果你不想运行上面的脚本,你可以手动进行下面操作。
139
+
140
+ (1) 把 Java JNI 动态链接库和 Java JAR 包拷贝进安卓 demo 程序文件夹下:
68
141
69
142
``` shell
70
- cd inference_lite_lib.android.armv8/demo/java/android
143
+ cd inference_lite_lib.android.armv8.gcc.c++_static /demo/java/android
71
144
# 请替换<架构文件夹>为手机架构名称,例如 arm64-v8a
72
145
cp ../../../java/so/libpaddle_lite_jni.so PaddlePredictor/app/src/main/jniLibs/< 架构文件夹>
73
146
cp ../../../java/jar/PaddlePredictor.jar PaddlePredictor/app/libs/
74
147
```
75
148
76
149
(2) 下载模型文件
77
150
78
- 下载以下5个模型 ,并解压缩到 ` PaddlePredictor/app/src/main/assets ` 文件夹中。解压之后,assets文件夹里要包含解压后的五个以` .nb ` 结尾的模型文件,但不需要保存原压缩` .tar.gz ` 文件。
151
+ 下载以下 5 个模型 ,并解压缩到 ` PaddlePredictor/app/src/main/assets ` 文件夹中。解压之后,assets文件夹里要包含解压后的五个以` .nb ` 结尾的模型文件,但不需要保存原压缩` .tar.gz ` 文件。
79
152
80
153
| 模型| 下载地址|
81
154
| :-- | :-- |
@@ -85,15 +158,15 @@ cp ../../../java/jar/PaddlePredictor.jar PaddlePredictor/app/libs/
85
158
| mobilenet_v2_relu_opt.nb| http://paddle-inference-dist.bj.bcebos.com/mobilenet_v2_relu_opt.nb.tar.gz |
86
159
| resnet50_opt.nb| http://paddle-inference-dist.bj.bcebos.com/resnet50_opt.nb.tar.gz |
87
160
88
- 注意:模型要求为naive buffer格式 ,您可以通过 [ opt工具] ( ../user_guides/model_optimize_tool ) 将Paddle模型转为naive buffer存储格式。
161
+ 注意:模型要求为 naive buffer 格式 ,您可以通过 [ opt工具] ( ../user_guides/model_optimize_tool ) 将 Paddle 模型转为naive buffer存储格式。
89
162
90
163
### 4. 运行预测示例程序
91
164
92
- 1 . 用AndroidStudio打开 ` inference_lite_lib.android.armv8/demo/java/android/PaddlePredictor ` 文件夹(需要联网),打开后工程会自动build完成 。
93
- 2 . 设置手机:手机USB连接电脑 ,打开` 设置 -> 开发者模式 -> USB调试 -> 允许(授权)当前电脑调试手机 ` ,并确认AndroidStudio可以识别接入的手机设备 。
94
- 3 . 按下AndroidStudio的Run按钮,AndroidStudio会自动编译APP并安装到手机。在手机上打开安装成功的APP,大概会等10秒 ,然后看到类似以下输出:
165
+ 1 . 用 Android Studio 打开 ` inference_lite_lib.android.armv8.gcc.c++_static /demo/java/android/PaddlePredictor ` 文件夹(需联网),打开后工程会自动 build 完成 。
166
+ 2 . 设置手机:手机 USB 连接电脑 ,打开` 设置 -> 开发者模式 -> USB调试 -> 允许(授权)当前电脑调试手机 ` ,并确认 Android Studio 可识别接入的手机设备 。
167
+ 3 . 按下 Android Studio 的 Run 按钮,Android Studio 会自动编译 APP 并安装到手机。在手机上打开安装成功的 APP ,大概会等 10 秒 ,然后看到类似以下输出:
95
168
96
- ```
169
+ ``` shell
97
170
lite_naive_model output: 50.213173, -28.872887
98
171
expected: 50.2132, -28.8729
99
172
@@ -110,51 +183,6 @@ mobilenet_v2 test:true
110
183
time: xxx ms
111
184
```
112
185
113
- 该 demo 程序跑我们的 5 个模型,第一个模型结果将真正的头两个数字输出,并在第二行附上期望的正确值。你应该要看到他们的误差小于0.001。后面四个模型如果你看到 ` test:true ` 字样,说明模型输出通过了我们在 demo 程序里对其输出的测试。time 代表该测试花费的时间。
114
-
115
- ** 注意:** 在这一步中,如果遇到Andriod Studio编译/安装失败等问题,请参考[ Andriod示例] ( ../demo_guides/android_app_demo.html#android-demo ) 中部署方法章节的详细步骤和注意事项。
116
-
117
- ## Java 应用开发说明
118
-
119
- Java代码调用Paddle-Lite执行预测库仅需以下五步:
120
-
121
- (1) 设置config信息
122
-
123
- ``` java
124
- MobileConfig config = new MobileConfig ();
125
- config. setModelDir(modelPath);
126
- config. setPowerMode(PowerMode . LITE_POWER_HIGH );
127
- config. setThreads(1 );
128
- ```
129
-
130
- (2) 创建predictor
131
-
132
- ``` java
133
- PaddlePredictor predictor = PaddlePredictor . createPaddlePredictor(config);
134
- ```
135
-
136
- (3) 设置模型输入 (下面以全一输入为例)
137
-
138
- ``` java
139
- float [] inputBuffer = new float [10000 ];
140
- for (int i = 0 ; i < 10000 ; ++ i) {
141
- inputBuffer[i] = i;
142
- }
143
- Tensor input = predictor. getInput(0 );
144
- input. resize({100 , 100 });
145
- input. setData(inputBuffer);
146
- ```
147
-
148
- (4) 执行预测
149
-
150
- ``` java
151
- predictor. run();
152
- ```
153
-
154
- (5) 获得预测结果
155
-
156
- ``` java
157
- Tensor output = predictor. getOutput(0 );
158
- ```
186
+ 该 demo 程序跑 5 个模型,第一个模型结果将真正的头两个数字输出,并在第二行附上期望的正确值。你应该要看到他们的误差小于 0.001 。后面四个模型如果你看到 ` test:true ` 字样,说明模型输出通过了我们在 demo 程序里对其输出的测试。time 代表该测试花费的时间。
159
187
160
- 详细的Java API说明文档位于 [ Java API ] ( ../api_reference/java_api_doc ) 。更多Java应用预测开发可以参考位于位于 [ Paddle-Lite-Demo ] ( https://github.com/PaddlePaddle/Paddle-Lite-Demo ) 的工程示例代码 。
188
+ ** 注意: ** 在这一步中,如果遇到 Andriod Studio 编译/安装失败等问题,请参考 [ Andriod示例 ] ( ../demo_guides/android_app_demo.html#android-demo ) 中部署方法章节的详细步骤和注意事项 。
0 commit comments