Skip to content

Commit efc800a

Browse files
authored
[Doc] Update Android SDK usage docs (PaddlePaddle#657)
* [Bug Fix] fix android app detail page errors * [Android] fix realtime camera mode and shutter * [Bug Fix] fix AllocateSegmentationResultFromJava error * [Bug Fix] fix camera preview size setting problem * [Model] use uint8 buffer instead of fp32 in ppseg postprocess * [Model] revert changes in ppseg * [Model] revert postprocess changes in ppseg * [Android] add fastdeploy android sdk download task * [Bug Fix] fix yolov5face scale error in small image * [Doc] Update Android SDK docs * [Doc] Update Android SDK usage docs
1 parent c4d43bd commit efc800a

File tree

5 files changed

+208
-33
lines changed

5 files changed

+208
-33
lines changed

docs/cn/build_and_install/android.md

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ FastDeploy当前在Android仅支持Paddle-Lite后端推理,支持armeabi-v7a
77
|ENABLE_LITE_BACKEND|OFF|编译Android库时需要设置为ON| - |
88
|WITH_OPENCV_STATIC|OFF|是否使用OpenCV静态库| - |
99
|WITH_LITE_STATIC|OFF|是否使用Lite静态库| 暂不支持使用Lite静态库 |
10-
|WITH_LITE_FULL_API|ON|是否使用Lite Full API库| 目前必须为ON |
11-
|WITH_LITE_FP16|OFF|是否使用带FP16支持的Lite库| 目前仅支持 arm64-v8a 架构|
1210

1311
更多编译选项请参考[FastDeploy编译选项说明](./README.md)
1412

@@ -47,12 +45,6 @@ FASDEPLOY_INSTALL_DIR="${BUILD_DIR}/install"
4745
mkdir build && mkdir ${BUILD_ROOT} && mkdir ${BUILD_DIR}
4846
cd ${BUILD_DIR}
4947

50-
# Check fp16 support (only support arm64-v8a now)
51-
WITH_LITE_FP16=ON
52-
if [ "$ANDROID_ABI" = "armeabi-v7a" ]; then
53-
WITH_LITE_FP16=OFF
54-
fi
55-
5648
# CMake configuration with Android toolchain
5749
cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
5850
-DCMAKE_BUILD_TYPE=MinSizeRel \
@@ -63,7 +55,6 @@ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
6355
-DANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN} \
6456
-DENABLE_LITE_BACKEND=ON \
6557
-DENABLE_VISION=ON \
66-
-DWITH_LITE_FP16=${WITH_LITE_FP16} \
6758
-DCMAKE_INSTALL_PREFIX=${FASDEPLOY_INSTALL_DIR} \
6859
-Wno-dev ../../..
6960

@@ -83,6 +74,7 @@ make install
8374
└── third_libs # 第三方依赖库
8475
└── install
8576
├── opencv
77+
├── flycv
8678
└── paddlelite
8779
```
8880
在examples/vision目录下可查看Android C++ SDK 使用案例:

docs/cn/build_and_install/download_prebuilt_libraries.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pip install fastdeploy-python==0.0.0 -f https://www.paddlepaddle.org.cn/whl/fast
7575

7676
## C++ SDK安装
7777

78-
Release版本(当前最新0.7.0,Android为0.4.0 pre-release)
78+
Release版本(当前最新0.7.0,Android为0.8.0 pre-release)
7979

8080
| 平台 | 文件 | 说明 |
8181
| :--- | :--- | :---- |
@@ -84,7 +84,15 @@ Release版本(当前最新0.7.0,Android为0.4.0 pre-release)
8484
| Mac OSX x64 | [fastdeploy-osx-x86_64-0.7.0.tgz](https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-osx-x86_64-0.7.0.tgz) | clang++ 10.0.0编译产出|
8585
| Mac OSX arm64 | [fastdeploy-osx-arm64-0.7.0.tgz](https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-osx-arm64-0.7.0.tgz) | clang++ 13.0.0编译产出 |
8686
| Linux aarch64 | - | 自行编译,可集成ONNX Runtime、Paddle Lite后端 |
87-
| Android armv7&v8 | [fastdeploy-android-0.4.0-shared.tgz](https://bj.bcebos.com/fastdeploy/release/android/fastdeploy-android-0.4.0-shared.tgz) | NDK 25及clang++编译产出, 支持arm64-v8a及armeabi-v7a |
87+
| Android armv7&v8 | [fastdeploy-android-0.8.0-shared.tgz](https://bj.bcebos.com/fastdeploy/release/android/fastdeploy-android-0.8.0-shared.tgz) | NDK 25及clang++编译产出, 支持arm64-v8a及armeabi-v7a |
88+
89+
## Java SDK安装
90+
91+
Release版本(Java SDK 目前仅支持Android,版本为0.8.0 pre-release)
92+
93+
| 平台 | 文件 | 说明 |
94+
| :--- | :--- | :---- |
95+
| Android Java SDK | [fastdeploy-android-sdk-0.8.0.aar](https://bj.bcebos.com/fastdeploy/release/android/fastdeploy-android-sdk-0.8.0.aar) | NDK 20 编译产出, minSdkVersion 15,targetSdkVersion 28 |
8896

8997
Develop版本(Nightly build)
9098

java/android/README.md

Lines changed: 163 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ FastDeploy Android SDK 目前支持图像分类、目标检测、OCR文字识别
44
- 调用`predict`接口
55
- 可视化验证(可选)
66

7-
## 目录
7+
|图像分类|目标检测|OCR文字识别|人像分割|人脸检测|
8+
|:---:|:---:|:---:|:---:|:---:|
9+
|![classify](https://user-images.githubusercontent.com/31974251/203261658-600bcb09-282b-4cd3-a2f2-2c733a223b03.gif)|![detection](https://user-images.githubusercontent.com/31974251/203261763-a7513df7-e0ab-42e5-ad50-79ed7e8c8cd2.gif)|![ocr](https://user-images.githubusercontent.com/31974251/203261817-92cc4fcd-463e-4052-910c-040d586ff4e7.gif)|![seg](https://user-images.githubusercontent.com/31974251/203267867-7c51b695-65e6-402e-9826-5d6d5864da87.gif)|![face](https://user-images.githubusercontent.com/31974251/203261714-c74631dd-ec5b-4738-81a3-8dfc496f7547.gif)|
810

11+
## 内容目录
12+
13+
- [下载及配置SDK](#SDK)
914
- [图像分类API](#Classification)
1015
- [目标检测API](#Detection)
1116
- [语义分割API](#Segmentation)
@@ -15,8 +20,41 @@ FastDeploy Android SDK 目前支持图像分类、目标检测、OCR文字识别
1520
- [RuntimeOption说明](#RuntimeOption)
1621
- [可视化接口API](#Visualize)
1722
- [模型使用示例](#Demo)
23+
- [App示例工程使用方式](#App)
24+
25+
## 下载及配置SDK
26+
<div id="SDK"></div>
27+
28+
### 下载 FastDeploy Android SDK
29+
Release版本(Java SDK 目前仅支持Android,当前版本为0.8.0 pre-release)
30+
31+
| 平台 | 文件 | 说明 |
32+
| :--- | :--- | :---- |
33+
| Android Java SDK | [fastdeploy-android-sdk-0.8.0.aar](https://bj.bcebos.com/fastdeploy/release/android/fastdeploy-android-sdk-0.8.0.aar) | NDK 20 编译产出, minSdkVersion 15,targetSdkVersion 28 |
34+
35+
更多预编译库信息,请参考: [download_prebuilt_libraries.md](../../docs/cn/build_and_install/download_prebuilt_libraries.md)
36+
37+
### 配置 FastDeploy Android SDK
38+
39+
首先,将fastdeploy-android-sdk-xxx.aar拷贝到您Android工程的libs目录下,其中`xxx`表示您所下载的SDK的版本号。
40+
```shell
41+
├── build.gradle
42+
├── libs
43+
│   └── fastdeploy-android-sdk-xxx.aar
44+
├── proguard-rules.pro
45+
└── src
46+
```
1847

19-
## 图像分类
48+
然后,在您的Android工程中的build.gradble引入FastDeploy SDK,如下:
49+
```java
50+
dependencies {
51+
implementation fileTree(include: ['*.aar'], dir: 'libs')
52+
implementation 'com.android.support:appcompat-v7:28.0.0'
53+
// ...
54+
}
55+
```
56+
57+
## 图像分类API
2058

2159
<div id="Classification"></div>
2260

@@ -54,7 +92,7 @@ public boolean release(); // 释放native资源
5492
public boolean initialized(); // 检查是否初始化成功
5593
```
5694

57-
## 目标检测
95+
## 目标检测API
5896

5997
<div id="Detection"></div>
6098

@@ -91,7 +129,7 @@ public boolean release(); // 释放native资源
91129
public boolean initialized(); // 检查是否初始化成功
92130
```
93131

94-
## OCR文字识别
132+
## OCR文字识别API
95133

96134
<div id="OCR"></div>
97135

@@ -133,7 +171,7 @@ public boolean release(); // 释放native资源
133171
public boolean initialized(); // 检查是否初始化成功
134172
```
135173

136-
## 语义分割
174+
## 语义分割API
137175

138176
<div id="Segmentation"></div>
139177

@@ -166,7 +204,7 @@ public boolean release(); // 释放native资源
166204
public boolean initialized(); // 检查是否初始化成功
167205
```
168206

169-
## 人脸检测
207+
## 人脸检测API
170208

171209
<div id="FaceDetection"></div>
172210

@@ -388,3 +426,122 @@ option.enableLiteFp16();
388426
model.init(modelFile, paramFile, configFile, option);
389427
// Bitmap读取、模型预测、资源释放 同上 ...
390428
```
429+
430+
## App示例工程使用方式
431+
<div id="App"></div>
432+
433+
FastDeploy在java/android/app目录下提供了一些示例工程,以下将介绍示例工程的使用方式。由于java/android目录下同时还包含JNI工程,因此想要使用示例工程的用户还需要配置NDK,如果您只关心Java API的使用,并且不想配置NDK,可以直接跳转到以下详细的案例链接。
434+
435+
- [图像分类App示例工程](../../examples/vision/classification/paddleclas/android)
436+
- [目标检测App示例工程](../../examples/vision/detection/paddledetection/android)
437+
- [OCR文字识别App示例工程](../../examples/vision/ocr/PP-OCRv2/android)
438+
- [人像分割App示例工程](../../examples/vision/segmentation/paddleseg/android)
439+
- [人脸检测App示例工程](../../examples/vision/facedet/scrfd/android)
440+
441+
### 环境准备
442+
443+
1. 在本地环境安装好 Android Studio 工具,详细安装方法请见[Android Stuido 官网](https://developer.android.com/studio)
444+
2. 准备一部 Android 手机,并开启 USB 调试模式。开启方法: `手机设置 -> 查找开发者选项 -> 打开开发者选项和 USB 调试模式`
445+
446+
**注意**:如果您的 Android Studio 尚未配置 NDK ,请根据 Android Studio 用户指南中的[安装及配置 NDK 和 CMake ](https://developer.android.com/studio/projects/install-ndk)内容,预先配置好 NDK 。您可以选择最新的 NDK 版本,或者使用 FastDeploy Android 预测库版本一样的 NDK
447+
448+
### 部署步骤
449+
450+
1. App示例工程位于 `fastdeploy/java/android/app` 目录
451+
2. 用 Android Studio 打开 `fastdeploy/java/android` 工程,注意是`java/android`目录
452+
3. 手机连接电脑,打开 USB 调试和文件传输模式,并在 Android Studio 上连接自己的手机设备(手机需要开启允许从 USB 安装软件权限)
453+
454+
<p align="center">
455+
<img width="1440" alt="image" src="https://user-images.githubusercontent.com/31974251/203257262-71b908ab-bb2b-47d3-9efb-67631687b774.png">
456+
</p>
457+
458+
> **注意:**
459+
>> 如果您在导入项目、编译或者运行过程中遇到 NDK 配置错误的提示,请打开 ` File > Project Structure > SDK Location`,修改 `Andriod NDK location` 为您本机配置的 NDK 所在路径。本工程默认使用的NDK版本为20.
460+
>> 如果您是通过 Andriod Studio 的 SDK Tools 下载的 NDK (见本章节"环境准备"),可以直接点击下拉框选择默认路径。
461+
>> 还有一种 NDK 配置方法,你可以在 `java/android/local.properties` 文件中手动完成 NDK 路径配置,如下图所示
462+
>> 如果以上步骤仍旧无法解决 NDK 配置错误,请尝试根据 Andriod Studio 官方文档中的[更新 Android Gradle 插件](https://developer.android.com/studio/releases/gradle-plugin?hl=zh-cn#updating-plugin)章节,尝试更新Android Gradle plugin版本。
463+
464+
4. 点击 Run 按钮,自动编译 APP 并安装到手机。(该过程会自动下载预编译的 FastDeploy Android 库 以及 模型文件,需要联网)
465+
成功后效果如下,图一:APP 安装到手机;图二: APP 打开后的效果,会自动识别图片中的物体并标记;图三:APP设置选项,点击右上角的设置图片,可以设置不同选项进行体验。
466+
467+
| APP 图标 | APP 效果 | APP设置项
468+
| --- | --- | --- |
469+
| ![app_pic](https://user-images.githubusercontent.com/31974251/203268599-c94018d8-3683-490a-a5c7-a8136a4fa284.jpg) | ![app_res](https://user-images.githubusercontent.com/31974251/197169609-bb214af3-d6e7-4433-bb96-1225cddd441c.jpg) | ![app_setup](https://user-images.githubusercontent.com/31974251/197332983-afbfa6d5-4a3b-4c54-a528-4a3e58441be1.jpg) |
470+
471+
### 切换不同的场景
472+
App示例工程只需要在AndroidManifest.xml中切换不同的Activity即可编译不同场景的App进行体验。
473+
474+
<p align="center">
475+
<img width="788" alt="image" src="https://user-images.githubusercontent.com/31974251/203258255-b422d3e2-6004-465f-86b6-9fa61a27c6c2.png">
476+
</p>
477+
478+
- 图像分类场景
479+
```xml
480+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
481+
package="com.baidu.paddle.fastdeploy.app.examples">
482+
<!-- ... -->
483+
<activity android:name=".classification.ClassificationMainActivity">
484+
<!-- -->
485+
</activity>
486+
<activity
487+
android:name=".classification.ClassificationSettingsActivity"
488+
</activity>
489+
</application>
490+
</manifest>
491+
```
492+
- 目标检测
493+
```xml
494+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
495+
package="com.baidu.paddle.fastdeploy.app.examples">
496+
<!-- ... -->
497+
<activity android:name=".detection.DetectionMainActivity">
498+
<!-- -->
499+
</activity>
500+
<activity
501+
android:name=".detection.DetectionSettingsActivity"
502+
</activity>
503+
</application>
504+
</manifest>
505+
```
506+
- OCR文字识别
507+
```xml
508+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
509+
package="com.baidu.paddle.fastdeploy.app.examples">
510+
<!-- ... -->
511+
<activity android:name=".ocr.OcrMainActivity">
512+
<!-- -->
513+
</activity>
514+
<activity
515+
android:name=".ocr.OcrSettingsActivity"
516+
</activity>
517+
</application>
518+
</manifest>
519+
```
520+
- 人像分割
521+
```xml
522+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
523+
package="com.baidu.paddle.fastdeploy.app.examples">
524+
<!-- ... -->
525+
<activity android:name=".segmentation.SegmentationMainActivity">
526+
<!-- -->
527+
</activity>
528+
<activity
529+
android:name=".segmentation.SegmentationSettingsActivity"
530+
</activity>
531+
</application>
532+
</manifest>
533+
```
534+
- 人脸检测
535+
```xml
536+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
537+
package="com.baidu.paddle.fastdeploy.app.examples">
538+
<!-- ... -->
539+
<activity android:name=".facedet.FaceDetMainActivity">
540+
<!-- -->
541+
</activity>
542+
<activity
543+
android:name=".facedet.FaceDetSettingsActivity"
544+
</activity>
545+
</application>
546+
</manifest>
547+
```

java/android/app/build.gradle

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,31 @@ def FD_MODEL = [
4444
'dest': 'src/main/assets/models'
4545
],
4646
[
47-
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/picodet_l_320_coco_lcnet.tgz',
47+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/MobileNetV1_x0_25_infer.tgz',
48+
'dest': 'src/main/assets/models'
49+
],
50+
[
51+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_PP-OCRv2_det_infer.tgz',
52+
'dest': 'src/main/assets/models'
53+
],
54+
[
55+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_ppocr_mobile_v2.0_cls_infer.tgz',
56+
'dest': 'src/main/assets/models'
57+
],
58+
[
59+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_PP-OCRv2_rec_infer.tgz',
60+
'dest': 'src/main/assets/models'
61+
],
62+
[
63+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/yolov5face-n-0.5-320x320_pd.tgz',
64+
'dest': 'src/main/assets/models'
65+
],
66+
[
67+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape320x320_pd.tgz',
68+
'dest': 'src/main/assets/models'
69+
],
70+
[
71+
'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/portrait_pp_humansegv2_lite_256x144_inference_model.tgz',
4872
'dest': 'src/main/assets/models'
4973
]
5074
]
@@ -61,28 +85,26 @@ task downloadAndExtractModels(type: DefaultTask) {
6185
println "Downloading and extracting fastdeploy models ..."
6286
}
6387
doLast {
64-
// Prepare cache folder for archives
6588
String cachePath = "cache"
6689
if (!file("${cachePath}").exists()) {
6790
mkdir "${cachePath}"
6891
}
6992
FD_MODEL.eachWithIndex { model, index ->
7093
MessageDigest messageDigest = MessageDigest.getInstance('MD5')
7194
messageDigest.update(model.src.bytes)
72-
String cacheName = new BigInteger(1, messageDigest.digest()).toString(32)
73-
// Download the target archive if not exists
95+
String[] modelPaths = model.src.split("/")
96+
String modelName = modelPaths[modelPaths.length - 1]
97+
// Download the target model if not exists
7498
boolean copyFiles = !file("${model.dest}").exists()
75-
if (!file("${cachePath}/${cacheName}.tgz").exists()) {
76-
println "Downloading ${model.src} -> ${cachePath}/${cacheName}.tgz"
77-
ant.get(src: model.src, dest: file("${cachePath}/${cacheName}.tgz"))
99+
if (!file("${cachePath}/${modelName}").exists()) {
100+
println "Downloading ${model.src} -> ${cachePath}/${modelName}"
101+
ant.get(src: model.src, dest: file("${cachePath}/${modelName}"))
78102
copyFiles = true
79-
// force to copy files from the latest archive files
80103
}
81-
// Extract the target archive if its dest path does not exists
82104
if (copyFiles) {
83-
println "Coping ${cachePath}/${cacheName}.aar -> ${model.dest}"
105+
println "Coping ${cachePath}/${modelName} -> ${model.dest}"
84106
copy {
85-
from tarTree("${cachePath}/${cacheName}.tgz")
107+
from tarTree("${cachePath}/${modelName}")
86108
into "${model.dest}"
87109
}
88110
}
@@ -95,24 +117,20 @@ task downloadAndExtractSDKs(type: DefaultTask) {
95117
println "Downloading and extracting fastdeploy android java sdk ..."
96118
}
97119
doLast {
98-
// Prepare cache folder for archives
99120
String cachePath = "cache"
100121
if (!file("${cachePath}").exists()) {
101122
mkdir "${cachePath}"
102123
}
103124
FD_JAVA_SDK.eachWithIndex { sdk, index ->
104125
String[] sdkPaths = sdk.src.split("/")
105-
// e.g fastdeploy-android-sdk-latest-dev.aar
106126
String sdkName = sdkPaths[sdkPaths.length - 1]
107127
// Download the target SDK if not exists
108128
boolean copyFiles = !file("${sdk.dest}/${sdkName}").exists()
109129
if (!file("${cachePath}/${sdkName}").exists()) {
110130
println "Downloading ${sdk.src} -> ${cachePath}/${sdkName}"
111131
ant.get(src: sdk.src, dest: file("${cachePath}/${sdkName}"))
112132
copyFiles = true
113-
// force to copy files from the latest downloaded sdk
114133
}
115-
// Copy the target archive if its dest path does not exists
116134
if (copyFiles) {
117135
println "Coping ${cachePath}/${sdkName} -> ${sdk.dest}/${sdkName}"
118136
copy {

java/android/app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<!-- facedet values ... -->
3636
<string name="FACEDET_MODEL_DIR_DEFAULT">models/scrfd_500m_bnkps_shape320x320_pd</string>
3737
<!-- segmentation values ... -->
38-
<string name="SEGMENTATION_MODEL_DIR_DEFAULT">models/human_pp_humansegv1_lite_192x192_inference_model</string>
38+
<string name="SEGMENTATION_MODEL_DIR_DEFAULT">models/portrait_pp_humansegv2_lite_256x144_inference_model</string>
3939
<!-- Other resources values-->
4040
<string name="action_bar_take_photo">拍照识别</string>
4141
<string name="action_bar_realtime">实时识别</string>

0 commit comments

Comments
 (0)