PaddleDetection学习1——使用Paddle-Lite在 Android 上实现实时的目标检测功能

在 Android 上使用Paddle-Lite实现实时的目标检测功能

  • 1 环境准备
    • 1.1 安装Android Studio
      • 1.1.1 安装JAVA JDK
      • 1.1.2 Android Studio 安装步骤
      • 1.1.3 Android Studio 配置NDK
    • 1.2 Android 手机
  • 2 部署步骤
    • 2.1 下载Paddle-Lite-Demo
    • 2.2 打开 yolo_detection_demo项目
      • 2.2.1 修改build.gradle,配置国内镜像仓库
      • 2.2.2 NDK 配置错误问题
      • 2.2.3 gradle.properties文件配置
      • 2.2.4 NDK版本选择
    • 2.3 部署模型到移动端
    • 2.4 更新预测库支持FP16
      • 2.4.1 下载预测库
      • 2.4.2 替换java 库
      • 2.4.3 替换c++库
      • 2.4.4 模型优化(FP16)

1 环境准备

1.1 安装Android Studio

参考安装教程创建目录:
GAndroidFile:程序安装文件存放位置
GAndroidProject:项目文件存放位置
jdk:JAVA JDK安装包文件存放位置
sdk:Android SDK文件存放位置

1.1.1 安装JAVA JDK

根据电脑的操作系统下载对应的JDK,下载地址:JAVA JDK
双击进行安装,安装地址修改为前文所创建的jdk目录。

1.1.2 Android Studio 安装步骤

(1)下载地址:Android Studio
在这里插入图片描述
(2)双击下载的android-studio-2023.1.1.27-windows.exe。
(3)勾选上Android virtual Device(虚拟机安装文件,建议勾选)。
(4)选择安装路径GAndroidFile。
(5)安装完成后,提示找不到Android sdk列表,选择Cancel(退出)
(6)选择之前创建好的sdk路径安装Android sdk。

1.1.3 Android Studio 配置NDK

据 Android Studio 用户指南中的安装及配置 NDK 和 CMake 内容,预先配置好 NDK。选择最新的 NDK 版本,或者使用 Paddle Lite 预测库版本一样的 NDK。

1.2 Android 手机

准备一部 Android 手机,并开启 USB 调试模式。开启方法: 手机设置 -> 查找开发者选项 -> 打开开发者选项和 USB 调试模式

2 部署步骤

参考目标检测 C++ API Demo 使用指南

2.1 下载Paddle-Lite-Demo

下载链接
目标检测 Demo 位于 Paddle-Lite-Demo/object_detection/android/app/cxx/yolo_detection_demo 目录

2.2 打开 yolo_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 部署模型到移动端

手机连接电脑,打开 USB 调试和文件传输模式,并在 Android Studio 上连接自己的手机设备(手机需要开启允许从 USB 安装软件权限)
在这里插入图片描述
点击 Run 按钮,自动编译 APP 并安装到手机。(该过程会自动下载 Paddle Lite 预测库和模型,需要联网) 成功后效果如下,图一:APP 安装到手机 图二: APP 打开后的效果,会自动识别图片中的物体并标记。

在这里插入图片描述
平均预测时间178ms。
在这里插入图片描述

2.4 更新预测库支持FP16

2.4.1 下载预测库

下载文件名带fp16的预测库。
在这里插入图片描述

2.4.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.4.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.4 模型优化(FP16)

(1)下载 yolov3_mobilenet_v3模型,并解压
在这里插入图片描述

在这里插入图片描述
(2)使用Paddle-Lite的opt工具可以对inference模型进行优化。

paddle_lite_opt \
--model_file=yolov3_mobilenet_v3/__model__ \
--param_file=yolov3_mobilenet_v3/__params__ \
--optimize_out=output_inference/yolov3_mobilenet_v3_fp16/model \
--valid_targets=arm\
--enable_fp16=true

将生成的yolov3_mobilenet_v3_fp16文件夹拷贝到yolo_detection_demo\app\src\main\assets\models目录下
修改配置文件后运行。
在这里插入图片描述
平均预测时间87ms。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419394.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读_CogTree_推理的认知树

英文名称: From Complex to Simple: Unraveling the Cognitive Tree for Reasoning with Small Language Models中文名称: 从复杂到简单:揭示小型语言模型推理的认知树链接: http://arxiv.org/abs/2311.06754v1代码: https://github.com/alibaba/EasyNLP作者: Junbi…

51单片机流水灯

**led 介绍**LED是“Light Emitting Diode”的缩写,即发光二极管。它是一种半导体器件,能够将电能转化为可见光。LED灯通常由LED芯片、封装材料、铝基板和灯罩等部件组成。 **LED灯具有以下特点:** 节能:LED灯具有较高的光电转换…

【谭浩强C程序设计精讲 chap4】选择结构程序设计

文章目录 第4章 选择结构程序设计一、用 if 语句实现选择结构二、用 switch 语句实现多分支选择结构三、条件运算符和条件表达式 第4章 选择结构程序设计 一、用 if 语句实现选择结构 一般形式: if (表达式)  语句1 [ else  语句2 ] 其他形式,常用的…

Chatgpt+Comfyui绘图源码说明及本地部署文档

其他文档地址: ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码线上部署文档 一、源码说明 1、源码目录说明 app_home:app官网源码chatgpt-java:管理后台服务端源码、用户端的服务端源码chatgpt-pc:电脑网页前端源码cha…

函数的简单认识(上)

1.函数的概念 在C语⾔中引⼊函数(function)的概念,有些翻译为:⼦程序,⼦程序这种翻译更加准确⼀些。 C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。C语⾔的程序其实是…

ros2学习笔记-CLI工具,记录命令对应操作。

目录 环境变量turtlesim和rqt以初始状态打开rqt node启动节点查看节点列表查看节点更多信息命令行参数 --ros-args topic话题列表话题类型话题列表,附加话题类型根据类型查找话题名查看话题发布的数据查看话题的详细信息查看类型的详细信息给话题发布消息&#xff0…

数组、数组的删除添加、函数、返回值、匿名函数、回调函数

一、数组 概念:将多个元素按一定顺序排列放在一个集合中 创建数组(两种): 字面量创建 构造函数创建 数组的长度(length)、类型 空数组 长度为0数组是object 引用类型 如何获取数组中单个元素 索引&…

Crow:通过表单格式upload文件

除了下载,web后台一个常用的功能便是上传文件,而上传文件通常都是通过表单完成的。 通过表单上传文件时,http 请求头里会有如下信息: Content-Type:multipart/form-data 表示这是一个表单请求 boundary=---------------------------131943921939171068143514392405表示表单…

如何通过frp、geoserver发布家里电脑的空间数据教程

如何通过家里电脑的geoserver发布空间数据的教程 简介 大家好,我是锐多宝,最近我在开发一个新网站的时候遇到一个需求,这里记录一下以帮助需要用到的网友。 我的需求是:用户通过网站前端上传空间数据后,即可在前端展…

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种:相对、绝对路径。 相对路径:相对于当前位置的路径,以“./xxx.xxx”为标志绝对路径:以从盘符…

DHCP配置(路由器,交换机)

DHCP接口地址池配置 拓扑 PC配置DHCP点击应用。 路由器配置命令 <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]int g0/0/1[Huawei-GigabitEthernet0/0/1]ip address 10.1.1.1 24[Huawei-GigabitEthernet0/0/1]q[Huawei]dhcp enable Info: T…

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;232.用栈实现队列 **。题目介绍&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;…