当前位置: 首页 > news >正文

PP-OCR的安卓端部署

EMO了几天

我浪费了几天的生命,去研究PP-OCR的模型微调、从训练模型导出预测模型,结果一个坑接着一个坑,没有善终。
找了好多资料,得到一些负面信息,比如说飞浆的团队修复问题不及时啦,代码仓库有好多年不更新啦,为了KPI而搞开源啦等等。
今天想着还是先把安卓端部署过程记录下来吧,忘掉那些不开心吧。

安卓端部署简介

如果直接用官方提供的模型去跑,其实还是挺香的,OCR是飞浆框架下最厉害的库了。
安卓部署官方也有demo的(当然是几年前的),PaddleOCR–deploy下去找,我也放到csdn下载了。

例子中使用的PP-OCRv2的模型,想想现在都PP-OCRv4了,是不是心中着急?

PaddleLite

想要在安卓端部署,需要飞浆下的另一个重要的库,PaddleLite。
Paddle Lite 是百度飞桨(PaddlePaddle)生态中的端侧推理引擎,专注于在移动设备、嵌入式设备和边缘计算场景中实现高效的深度学习模型部署。其核心目标是通过轻量化、高性能的优化技术,降低模型运行时的资源消耗,同时支持多种硬件平台和操作系统。
Demo中使用的是2.10版本,目录结构如下:

OpenCV

OpenCV的作用自然在负责图像处理部分。在安卓平台,它的用途还真是广泛的不得了。
Demo中使用的是4.2.0,目录结构如下:

PaddleOCR的模型和字典

模型文件和字典是程序运行后下载的,如下图:

App源码简介

代码结构依然是Java层+Native层。

Java代码

上层的业务逻辑,以及通过JNI调用Native层代码。结构如下:

Java层与Native层沟通仅仅用了三个方法,它们在OCRPredictorNative类中:

    protected native long init(String detModelPath, String recModelPath, String clsModelPath, int useOpencl, int threadNum, String cpuMode);protected native float[] forward(long pointer, Bitmap originalImage,int max_size_len, int run_det, int run_cls, int run_rec);protected native void release(long pointer);

Native层代码

源码结构如下图:

JNI的实现在native.cpp中,重点看forward方法的实现,OCR的处理逻辑及返回结果都在这里了。

extern "C" JNIEXPORT jfloatArray JNICALL
Java_com_baidu_paddle_lite_demo_ocr_OCRPredictorNative_forward(JNIEnv *env, jobject thiz, jlong java_pointer, jobject original_image,jint j_max_size_len, jint j_run_det, jint j_run_cls, jint j_run_rec) {LOGI("begin to run native forward");if (java_pointer == 0) {LOGE("JAVA pointer is NULL");return cpp_array_to_jfloatarray(env, nullptr, 0);}cv::Mat origin = bitmap_to_cv_mat(env, original_image);if (origin.size == 0) {LOGE("origin bitmap cannot convert to CV Mat");return cpp_array_to_jfloatarray(env, nullptr, 0);}int max_size_len = j_max_size_len;int run_det = j_run_det;int run_cls = j_run_cls;int run_rec = j_run_rec;ppredictor::OCR_PPredictor *ppredictor =(ppredictor::OCR_PPredictor *)java_pointer;std::vector<int64_t> dims_arr;std::vector<ppredictor::OCRPredictResult> results =ppredictor->infer_ocr(origin, max_size_len, run_det, run_cls, run_rec);LOGI("infer_ocr finished with boxes %ld", results.size());// 这里将std::vector<ppredictor::OCRPredictResult> 序列化成// float数组,传输到java层再反序列化std::vector<float> float_arr;for (const ppredictor::OCRPredictResult &r : results) {float_arr.push_back(r.points.size());float_arr.push_back(r.word_index.size());float_arr.push_back(r.score);// add det pointfor (const std::vector<int> &point : r.points) {float_arr.push_back(point.at(0));float_arr.push_back(point.at(1));}// add rec word idxfor (int index : r.word_index) {float_arr.push_back(index);}// add cls resultfloat_arr.push_back(r.cls_label);float_arr.push_back(r.cls_score);}return cpp_array_to_jfloatarray(env, float_arr.data(), float_arr.size());
}

运行结果

相关文章:

PP-OCR的安卓端部署

EMO了几天 我浪费了几天的生命&#xff0c;去研究PP-OCR的模型微调、从训练模型导出预测模型&#xff0c;结果一个坑接着一个坑&#xff0c;没有善终。 找了好多资料&#xff0c;得到一些负面信息&#xff0c;比如说飞浆的团队修复问题不及时啦&#xff0c;代码仓库有好多年不…...

2048小游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…...

研0大模型学习(第四、五天)

学习CSDN教程&#xff1a;VSCode Debug指南 但里面貌似主要是针对nodejs的&#xff0c;所以我在 CSDN教程&#xff1a;VSCode调试python程序 中学习&#xff0c;刚开始调试报错python版本太低&#xff0c;于是我安装了旧版本的pythondebugger&#xff0c;再把python解释器从原…...

编程规范之整数运算

在表达式中混用有符号数和无符号数时&#xff0c;可能会因隐式转换而导致非预期的结果。因此应尽量在表达式中使用相同符号类型的 变量。 对于无法使用相同符号类型的场景&#xff0c;应将不同类型的变量显式转换为相同类型&#xff0c;当表达式中的无符号数隐式转换为另一个有…...

【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南

MATLAB Gurobi YALMIP 综合优化教程&#xff08;进阶&#xff09; 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模&#xff0c;并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...

LINUX学习——守护进程的含义及编程实现

实验目的 理解守护进程的含义。掌握编程实现守护进程的主要步骤。 实验步骤 守护进程的含义&#xff1a; 守护进程是运行在后台的一种特殊进程&#xff0c;独立于控制终端&#xff0c;周期性地执行任务或等待处理事件。守护进程通常以 d 结尾&#xff0c;如 httpd、sshd 等。…...

Json 在线格式化 - 加菲工具

Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...

final关键字带来的问题

定义了一个配置类&#xff1a; public class EsignConfig { public static final String EsignOrgId "*****"; // 应用ID public static final String EsignAppId "*****"; // 应用密钥 public static final String EsignAppSecret…...

Flash存储器(一):接口标准全解析

目录 一.接口类型与协议标准 二.应用场景 Flash存储器的接口设计直接影响其性能、应用场景及系统集成复杂度。以下从接口类型、协议标准及应用场景三个方面进行系统阐述。 一.接口类型与协议标准 Flash接口类型与协议标准 序号接口类型协议标准特点1并行接口…...

第18周:对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 问题&#xff1a;在上一章代码中是ResNeXt-50的残差单元&#xff0c;问题:如果conv shortcutFalse那么在执行“xAdd0)…“语句时&#xff0c;通道数不一致的&…...

Django 结合 Vue 实现简单管理系统的详解

以下是一个 Django 结合 Vue 实现简单管理系统的详细步骤及示例代码: 项目整体架构思路 后端:使用 Django 搭建 RESTful API,负责数据的存储和处理。前端:使用 Vue 构建用户界面,通过调用后端 API 实现数据的展示、添加、修改和删除等操作。步骤 1:创建 Django 项目和应…...

ValueError: model.embed_tokens.weight doesn‘t have any device set

ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度学习框架(如 PyTorch)中使用,一般是在处理自然语言处理(NLP)任务时,用于指代模型中词嵌入层(Embedding layer)的权重参数。下面详细解释: 词嵌入层的作用 …...

公务员行测之速算分数记忆检验-无答案版本

前言 这一篇是根据百分数&#xff0c;默写分数&#xff0c;我发现我看见百分数有点想不到分数 速算之百分数记忆检验 50 % \ 50\% 50% 33.3 % \ 33.3\% 33.3% 25 % \ 25\% 25% 20 % \ 20\% 20% 16.7 % \ 16.7\% 16.7% 14.3 % \ 14.3\% 14.3% 12.5 % \ 12.5\% 1…...

大模型面经 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的区别是什么?

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识 引言 在微服务架构中&#xff0c;分布式事务是一个不可避免的话题。随着业务复杂度的提升&#xff0c;单体应用逐渐演变为多个微服务&#xff0c;如何保证跨服务的数据一致性成为…...

大语言模型减少幻觉的常见方案

什么是大语言模型的幻觉 大语言模型的幻觉&#xff08;Hallucination&#xff09;是指模型在生成文本时&#xff0c;输出与输入无关、不符合事实、逻辑错误或完全虚构的内容。这种现象主要源于模型基于概率生成文本的本质&#xff0c;其目标是生成语法合理、上下文连贯的文本&…...

方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】

在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…...

shiro使用

shiro是apache提供的一种安全框架。他可以将登录&#xff0c;权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…...

Spring Boot日志系统详解:Logback与SLF4J的默认集成

大家好呀&#xff01;&#x1f44b; 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统&#xff01; 一、日志系统的重要性 首先&#xff0c;咱们得明白为什么日志这么重要&#xff1f;&#x1f937;‍♂️ 想象一下&#xff0c;你正在玩一个超级复…...

基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程

Ai象棋是一款自动识别棋盘并分析下棋局势的工具&#xff0c;它能够自动化操作&#xff0c;帮助用户学习象棋知识。该软件无限制使用、界面无广告简洁&#xff0c;并提供永久授权。数据库中挑选1到2个即可完全满足使用需求&#xff0c;不必全部下载&#xff0c;解压mt管理器即可…...

刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程

2025年4月18日&#xff0c;大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命&#xff1a;聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措&#xff0c;无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可&#xff0c;也预示着共工…...

学习型组织与系统思考

真正的学习型组织不是只关注个人的学习&#xff0c;而是关注整个系统的学习。—彼得圣吉 在这两年里&#xff0c;越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师&#xff0c;进而在公司内部进行教学。我非常理解企业这样做的动机&#xff0c;毕竟内部讲师…...

mysql中优先使用datetime存储时间

基于大模型的问答进行了记录。 对为甚timestamp不如datetime好用做了深入了解&#xff0c;再此记录 范围广 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ 而 timestamp 仅支持’1970-01-01 00:00:01’ 到 ‘2038-01-19 03:14:07’ UTC, 存在2038年问题, 不适合长期存…...

【Linux】深入理解Linux文件系统:从C接口到内核设计哲学

文章目录 前言一、C语言中的文件接口1. 文件指针&#xff08;句柄&#xff09;FILE*以写方式打开文件&#xff0c;若文件不存在会新建一个文件W写入方式&#xff0c;在打开文件之前都会将文件内容全部清空追加写方式&#xff0c;其用法与写方法一致&#xff0c;不同在于a方法可…...

前端零基础入门到上班:Day7——表单系统实战全解析

&#x1f9e9;前端零基础入门到上班&#xff1a;Day7——表单系统实战全解析 ✅ 目标&#xff1a;不仅掌握 HTML 表单标签&#xff0c;更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动&#xff0c;为后续接入 Vue、后端接口打下坚实基础。 &#x1f31f; 一、HTML 表…...

阀门轴承电动车工件一键精修软件

若需定制开发“ComfyUI意见精修软件” 技术栈建议&#xff1a; 前端&#xff1a;React/Vue Figma插件API&#xff08;直接读取设计稿&#xff09;。 后端&#xff1a;Node.js/Python NLP库&#xff08;spaCy/NLTK&#xff09;。 数据库&#xff1a;MongoDB&#xff08;存储…...

【疑难杂症】【VS Code】VS Code连接不上远程服务器

【疑难杂症】【VS Code】VS Code连接不上远程服务器 经过多轮资料查询和测试&#xff0c;这种时候有三种可能&#xff1a; 可能原因1&#xff1a;服务器磁盘空间不足&#xff0c;无法创建服务器连接。 解决方案&#xff1a;清理磁盘空间&#xff0c;尤其是/tmp文件所在的磁盘。…...

Word 中“母版页”的等效机制

Word 和 PowerPoint 不太一样——**Word 实际上没有像 PowerPoint 那样的“母版页&#xff08;Master Page&#xff09;”**功能。但它有1个和“母版页”功能类似的东西&#xff0c;可能造成你看到的“校徽自动出现在每一页”的现象&#xff1a; ✅ Word 中“母版页”的等效机制…...

大模型时代:AI应用的变革与挑战

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...

C++ (菱形继承,通用接口 ,多态介绍)

菱形继承 class A{public :int a;};class B:public A{};class C:public A{};class D:public B,public C{public:void function(){a200;} };int main(){D object;// object.a100; 如果如此使用会产生报错 会导致一个成员在类D中出现两次&#xff0c;产生歧义&#xff0c;浪…...

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件内加入以下内容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 将…...

4.18日学习--引用

引用是变量的别名&#xff0c;它为已存在的变量提供了一个新的名称&#xff0c;对引用的操作实际上就是对其所引用变量的操作。引用在定义时必须初始化&#xff0c;且一旦初始化后就不能再引用其他变量。 #include <iostream> using namespace std;//引用做函数的返回值…...

poj1067 取石子游戏 威佐夫博弈

题目 有两堆石子&#xff0c;数量任意&#xff0c;可以不同。游戏开始由两个人轮流取石子。游戏规定&#xff0c;每次有两种不同的取法&#xff0c; 一是可以在任意的一堆中取走任意多的石子&#xff1b;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者…...

文件二进制读写和文本读写以及编码解码

假如是utf8编码&#xff0c;windows系统 写&#xff1a;往键盘中写的字符会被utf8编码成字节写入文件。假如是文本写&#xff0c;\n会被替换为\r\n写入&#xff0c;结尾会加文件结束符EOF。假如是二进制写&#xff0c;\n就是\n&#xff0c;文件结尾也不会加什么EOF 读&#xff…...

Java学习手册:常见并发问题及解决方案

在Java并发编程中&#xff0c;开发者常常会遇到各种并发问题&#xff0c;这些问题可能导致程序行为不可预测、性能下降甚至程序崩溃。以下是一些常见的并发问题及其解决方案&#xff1a; 1.竞态条件&#xff08;Race Condition&#xff09; 竞态条件是指多个线程同时访问共享…...

幽灵依赖与常见依赖管理

文章目录 前言1. 演示&#xff1a;检测和修复幽灵依赖步骤1&#xff1a;安装 depcheck步骤2&#xff1a;在项目根目录运行 depcheck可能的输出步骤3&#xff1a;修复幽灵依赖 2. 依赖管理的好习惯 1. 场景设定现在有如下依赖需求&#xff1a; 2. 依赖冲突的表现3. 解决依赖冲突…...

第T7周:咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 VGG 网络优缺点分析&#xff1a; ● 优点&#xff1a; 结构简洁统一&#xff1a;整张网络结构统一&#xff0c;只使用 33 的小卷积核和 22 的最大池化&…...

【MySQL数据库入门到精通】

文章目录 一、SQL分类二、DDL-数据库操作1.查询2.创建数据库3.删除数据库4.使用数据库 三、DDL-表操作1.查询 一、SQL分类 根据功能主要分为DDL DML DQL DCL DDL:Date Definition Language数据定义语言&#xff1a;定义数据库&#xff0c;表和字段 DML:Date Manipulatin Lan…...

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…...

4.6 实现重定向

本实战通过ServletDemo09类演示了Servlet中的重定向功能。该Servlet通过HttpServletResponse的sendRedirect方法实现页面跳转。在doPost方法中&#xff0c;根据请求参数username和password判断用户身份。若用户名为admin且密码为123456&#xff0c;则调用sendRedirect方法将页面…...

Linux中的管道

管道的概念 管道是一种进程间通信的方式。 管道是一种半双工通信机制&#xff0c;数据只能读或写&#xff0c;如果要读写同时进行就要创建两个管道 管道的类型 1、匿名管道PIPE&#xff1a;通常在亲缘进程中使用&#xff08;兄弟、父子&#xff09; 函数参考&#xff1a;匿名管…...

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异&#xff0c;如何量化&#xff1f; 计算真实概论分布P信息量 和 估计概论分布为Q&#xff0c;但实际概率分布为P时信息量的差值 那么设&#xff0c;概率分…...

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)

一、每个阶段的 UAV—架构革新与限制突破 在 Microsoft Direct3D 11 中&#xff0c;计算着色器 (UAV) 的无序访问视图数限制为 8 个&#xff0c; (像素着色器) RTV) UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中&#xff0c;可绑定的数量已增加。 对于 DirectCompute&a…...

机械臂速成小指南(二十五):机械臂与人工智能的有机结合

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在我的主页中寻找哦&#x1f916;&#x1f63d;&#x1f984; ​ ​指南目录&#x1f4d6;&#xff1a; &#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&…...

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…...

Git学习之路(Updating)

常用命令 pwd &#xff1a;显示当前目录 git init: 在当前目录下创建一个新的仓库&#xff08;空的&#xff09; git add name.type&#xff1a;将文件添加到仓库 git commit -m "xx备注xx" &#xff1a;把文件提交到仓库。git commit一次可以提交很多文件。 git …...

【datawhaleAI春训营第一期笔记】AI+航空安全

记录了一些数据竞赛相关的知识&#xff0c;赛题的代码相关笔记可以从目录寻找 目录 数据竞赛知识前置知识TPOP竞赛分类&#xff1a; 机器学习基础线性模型树模型KNN模型神经网络 深度学习全连接网络深度学习正则化深度学习的优化卷积神经网络 竞赛基础知识数据清洗特征工程模型…...