使用Paddle-Lite在 Android 上运行PicoDet模型(fp16)
- 1. 环境准备
- 2. 部署步骤
- 2.1 下载Paddle-Lite-Demo
- 2.2 打开 picodet_detection_demo项目
- 2.2.1 修改build.gradle,配置国内镜像仓库
- 2.2.2 NDK 配置错误问题
- 2.2.3 gradle.properties文件配置
- 2.2.4 NDK版本选择
- 2.3 更新预测库支持 FP16
- 2.3.1 下载预测库
- 2.3.2 替换java 库
- 2.3.3 替换c++库
- 2.4 部署模型到移动端
- 2.5 注意事项
- 2.5.1 算法前后处理
- 2.5.2 后处理写入模型结构
1. 环境准备
参考前一篇在 Android 上使用Paddle-Lite实现实时的目标检测功能
2. 部署步骤
参考目标检测 C++ API Demo 使用指南
2.1 下载Paddle-Lite-Demo
下载链接
目标检测 Demo 位于 Paddle-Lite-Demo/object_detection/android/app/cxx/picodet_detection_demo
目录
2.2 打开 picodet_detection_demo项目
2.2.1 修改build.gradle,配置国内镜像仓库
将原工程build.gradle文件中的
repositories {
google()
jcenter()
}
全部替换成对应的国内镜像加速仓库,修改后文件如下
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2.2.2 NDK 配置错误问题
在导入项目、编译或者运行过程中遇到 NDK 配置错误的提示,请打开 File > Project Structure > SDK Location
,修改 Andriod NDK location 为本机配置的 NDK 所在路径。
(如是是通过 Andriod Studio 的 SDK Tools 下载的 NDK,可以直接点击下拉框选择默认路径。 还有一种 NDK 配置方法,可以在 yolo_detection_demo/local.properties 文件中手动完成 NDK 路径配置,如下图所示。如果以上步骤仍旧无法解决 NDK 配置错误,请尝试根据 Andriod Studio 官方文档中的更新 Android Gradle 插件章节,尝试更新Android Gradle plugin版本。)
2.2.3 gradle.properties文件配置
问题:Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not “opens java.io” to unnamed module
在项目的gradle.properties文件,在org.gradle.jvmargs配置进行修改:
-add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED -\
-add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
2.2.4 NDK版本选择
问题:invalid local symbol '__bss_start__' in global part of symbol table
NDK版本不同导致的,我这里用的是NDK版本是26.1.10909125
,改为21.1.6352462
后就能编译通过了。用第三方编译好了的库文件还有版本匹配的风险。
2.3 更新预测库支持 FP16
2.3.1 下载预测库
点击 Run 按钮,自动编译 APP ,该过程会自动下载 Paddle Lite 预测库和模型,需要联网。
默认下载的是v2.11_rc
版本,不支持fp16预测。需要下载文件名带fp16的预测库。
2.3.2 替换java 库
(1)jar包
下载的预测库解压后将inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16\java\jar\PaddlePredictor.jar
替换 Demo 中的 Paddle-Lite-Demo/object_detection/andrdoid/app/cxx/picodet_detection_demo/app/PaddleLite/java/PaddlePredictor.jar
(2)Java so
inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16\java\so\libpaddle_lite_jni.so
替换 Demo 中的 Paddle-Lite-Demo/object_detection/andrdoid/app/cxx/picodet_detection_demo/app/PaddleLite/java/libs/arm64-v8a/libpaddle_lite_jni.so
2.3.3 替换c++库
(1)inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16\cxx\include
替换 Demo 中的 Paddle-Lite-Demo/object_detection/andrdoid/app/cxx/picodet_detection_demo/app/PaddleLite/cxx/include
(2)inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16\cxx\lib\libpaddle_lite_api_shared.so
库替换 Demo 中的 Paddle-Lite-Demo/object_detection/andrdoid/app/cxx/picodet_detection_demo/app/PaddleLite/cxx/libs/arm64-v8a/libpaddle_lite_api_shared.so
2.4 部署模型到移动端
手机连接电脑,打开 USB 调试和文件传输模式,并在 Android Studio 上连接自己的手机设备(手机需要开启允许从 USB 安装软件权限)
模型设置为picodet_s_320_cpu_fp16.nb
点击 Run 按钮,自动编译 APP安装到手机。成功后效果如下,图一:APP 安装到手机 图二: APP 打开后的效果,会自动识别图片中的物体并标记。
预测时间17ms。
2.5 注意事项
2.5.1 算法前后处理
Picodet 和 Picodet 增强版,算法的前、后处理完全相同
1.前处理:包括 Detection 常见的减均值等操作
2.后处理:包括 nms 等
2.5.2 后处理写入模型结构
(1) 该 Picodet Demo 使用PicoDet-S 320*320实现
(2)该 Demo 仅支持增强版模型替换,即将模型的后处理写入网络,具体操作方法请参考PaddleDetection导出部分。
注意:替换模型时,需要修改输入shape、类别数等。