PaddleOCR系列-训练模型并部署android手机

2023-10-26

1. 训练paddleocr模型

,参考另一篇博客:PaddleOCR系列-基础知识

2. ocr模型部署安卓手机

总体说明

  1. 封装为独立的Library,可以编译为aar,作为模块来调用;
  2. Native层以C++编写;
  3. Demo App以Kotlin-JVM编写;
  4. Android版与其它版本不同,包含了几个应用场景,包括相册识别、摄像头识别、手机IMEI号识别、摄像头身份证识别这几个功能页面;
  5. opencv 3.4.15,使用了opencv-mobile的代码,编译脚本在script文件夹里;
  6. onnxruntime动态库 1.6.0(因为当前模型不支持高版本)
2.1 AndroidStudio 2021.2.1或以上;
2.2. NDK下载,在SDK Tools中下载,版本选最新版;
2.3. cmake 3.4.1或以上,最好是3.18.1,在SDK Tools中下载;
2.4. 使用模型

下载预训练模型:模型下载
使用自己的模型:

  • det模型用于分割文字块,有两种模型(server和mobile),其中server体积大且较慢但效果好,mobile体积小且较快但效果差点。
  • cls模型用于检测文字方向,只有一种模型
  • rec模型用于文字识别,有两种模型(server和mobile),其中server体积大且较慢但效果好,mobile体积小且较快但效果差点。
ocr_success/OcrLibrary/src/main/assets
    ├── ch_ppocr_mobile_v2.0_cls_infer.onnx
    ├── ch_PP-OCRv2_det_infer.onnx det二选一,推荐
    ├── ch_ppocr_server_v2.0_det_infer.onnx det二选一
    ├── ch_ppocr_mobile_v2.0_rec_infer.onnx rec二选一,推荐
    ├── ch_ppocr_server_v2.0_rec_infer.onnx rec二选一
    └── ppocr_keys_v1.txt
  • 代码中配置使用哪个模型
    ocr/OcrLibrary/src/main/java/com/benjaminwan/ocrlibrary/OcrEngine.kt,在init方法中配置:
val ret = init(
            context.assets, numThread,
            "ch_PP-OCRv2_det_infer.onnx",
            "ch_ppocr_mobile_v2.0_cls_infer.onnx",
            "ch_ppocr_mobile_v2.0_rec_infer.onnx",
            "ppocr_keys_v1.txt"
        )
2.5. 下载opencv-mobile-3.4.15-android.7z

下载地址 解压后目录结构为

ocr_success/OcrLibrary/src/sdk
    └── native
        ├── jni
        └── staticlibs
2.6. 下载onnxruntime-1.6.0-android.7z

下载地址

  • 解压后目录结构为
ocr_success/OcrLibrary/src/main/onnx
├── ONNXConfig.cmake
├── arm64-v8a
│   └── libonnxruntime.so
├── armeabi-v7a
│   └── libonnxruntime.so
├── include
├── x86
│   └── libonnxruntime.so
└── x86_64
    └── libonnxruntime.so
2.7. 编译
  • 编译Release包
  • mac/linux使用命令编译./gradlew assembleRelease
  • win使用命令编译gradlew.bat assembleRelease
  • 输出apk文件在app/build/outputs/apk
2.8. 重新编译

删除项目根目录下的如下缓存文件夹

.idea
build
app/build
OcrLibrary/.cxx
OcrLibrary/build
2.9. demo界面效果

main
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


下面为测试效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 源码下载

3.1. 项目源代码结构

在这里插入图片描述

ocr
    ├── app               # demo app
    ├── capture           # 截图
    ├── common-aar        # app引用的aar库
    ├── keystore          # app签名密钥文件
    ├── OcrLibrary        # Ocr引擎库,包含Jni和C++代码
    └── scripts           # 编译脚本

源码下载
源码下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PaddleOCR系列-训练模型并部署android手机 的相关文章

  • 如何在android中使用Ontouchevent突出显示此pdf页面

    这里我想使用android中的onTouchevent来突出显示这段文字 您可以使用 OnTouchListener 来获取事件的 x 和 y 然后将屏幕绘制为位图 并根据字母的左上角显示和字母的大小使用bitmap getPixel 看看
  • 测试权限和 Android 应用清单文件

    我想知道是否有办法添加某些权限 或任何东西 到 android 清单文件 但这样它仅在测试运行期间使用 不在生产期间使用 我正在寻找一些程序化的东西 而不是在测试时剪切和粘贴 这是上下文 我正在读这篇文章 http developer an
  • Android 索引滚动

    http developer android com design building blocks scrolling html http developer android com design building blocks scrol
  • AppCompat DayNight 主题始终显示为 Light 主题?

    我正在使用 AppCompat 中引入的新 Theme AppCompat DayNight 主题版本23 2 http android developers blogspot com 2016 02 android support lib
  • Android - NumberPicker 滚动/快速滑动更快

    如何使数字选择器滚动 快速滑动更快 目前从00分钟到59分钟需要付出很大的努力 我尝试过一些例子Android 中 Viewpager 控制器速度减慢 https stackoverflow com questions 8155257 sl
  • 鼠标在两个视图上移动,如何让它们都处理`ACTION_MOVE`事件

    我有两个视图 较大的一个在底部 较小的一个在顶部 如下图所示 现在我在 view1 view2 外部 上按鼠标 然后移动到 view2 我发现即使鼠标在移动过程中位于view2内部 view2也不会得到ACTION MOVE事件 只有vie
  • 在 strings.xml 中存储十六进制颜色值

    我正在尝试存储hex colorstrings xml 中我的文本的值 因此所有布局文件都将引用该值 以便能够轻松快速更改项目的所有布局文本 但是我在引用它时遇到了麻烦 Using android textColor FFFFFF 在我的
  • ViewPager 具有不同的纵向和横向适配器

    在纵向模式下 我的ViewPager有 3 个片段 A B C 但在横向模式下 它只有 2 个片段 A 和 C 所以我创建了 2 个FragmentStatePagerAdapters 代表每种模式 问题是当屏幕方向改变时 ViewPage
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • RxJava 相当于 orElse 是什么

    在其他语言的流 函数域中有一个常见的操作 那就是 orElse 它就像一个 if 当当前链没有得到任何结果时 它会更改为备用链 在具有 Maybe 类型的语言中 它基本上会继续 Some 类型的链或更改为 None 类型的 orElse 理
  • 将 Android 应用程序部署到手机:错误:[install_itemfolder_01] 错误 1 ​​Windows

    我已经安装了我可能需要的所有组件 我已经上网两天了 但找不到这个问题的答案 我检查了我的 apache ant javac java JRE JDK Qt 变量一切正常 Qt 喜欢我的所有设置 除了当我尝试将应用程序部署到模拟器或设备时出现
  • 任务“:app:checkReleaseDuplicateClasses”执行失败。扑

    请找到以下文件 1 应用程序 构建 gradle def localProperties new Properties def localPropertiesFile rootProject file local properties if
  • android:如何将图像添加到相册

    任何人都可以分享代码 或向我指出 Android 示例代码 来帮助我将图像添加到媒体商店 图库 中的相册中 在我的应用程序中 我从服务器下载图像 并使用相机 通过 Intent 拍摄新图像 我想将这些图像组织在特定于应用程序的相册中 类似于
  • 在 Android 中下载文件

    我正在使用以下代码在 Android 中下载文件 public class FileDownloadActivity extends Activity ProgressDialog mProgressDialog Called when t
  • BLE:使用 Android / iOS 读取长特征值

    对于正常的特征读取 仅读取 MTU 大小 20 字节 的数据 我的客户将提供更大尺寸 超过 100 字节 的特征 我看到 BLE 提供了 长读取 功能 可以读取直到达到特征的大小 https bluegiga zendesk com ent
  • 当按下 flutter 中编写的按钮时,有没有办法运行 python 脚本?

    本质上 我想做的是 按下我在 Flutter 中编程的按钮 当按下该按钮时 Python 脚本应该开始在我的 Android 设备上运行 我想在 python 中使用 youtube dl 用于下载 Youtube 视频 库 但我想知道是否
  • 从多个通知启动活动会覆盖之前的意图

    public static void showNotification Context ctx int value1 String title String message int value2 NotificationManager no
  • 如何将 Bundle 转换为 PersistableBundle?

    API21发布了PersistableBundle https developer android com reference android os PersistableBundle html这是系统出于各种目的而保留的捆绑包 JobSc
  • adb shell 的 BroadcastReceiver 权限

    考虑一个简单的工具 使用BroadcastReceiver实现一个简单的目标 因为这不应该被其他应用程序使用 所以它定义了一个保护级别为signature or signatureOrSystem
  • 安卓应用安全

    我想开发一个用户数据非常敏感的应用程序 我是开发新手 所以不确定以下内容 技术对于安全或高效来说是必要的 请留下您的评论 提前致谢 为了额外的安全性 我们可以避开市场 游戏商店 并将应用程序安装在个人设备上 它会让它更安全吗 我必须在设备上

随机推荐

  • Install ModelSim on Linux

    To use ModelSim on Linux is quite difficult There is only exe file for installing ModelSim on Windows on the official we
  • php的phpstoem代码编辑器的快捷键,比较常用的归纳

    1 CTRL SHIFT N 全局搜索文件 优先文件名匹配的文件 2 CTRL R 当前窗口替换文本 3 CTRL E 最近打开的文件 4 F5 复制文件 文件夹 5 CTRL C 复制 CTRL V 粘贴 CTRL X 剪切 删除行 Ct
  • Linux 面试题-(腾讯,百度,美团,滴滴)

    Linux 面试题 腾讯 百度 美团 滴滴 分析日志t log 访问量 将各个ip 地址截取 并统计出现次数 并按从大到小排序 腾讯 http 192 168 200 10 index1 html http 192 168 200 10 i
  • 用两成数据也能训练出十成功力的模型,Jina Embeddings 这么做

    句向量 Sentence Embeddings 模型在多模态人工智能领域起着至关重要的作用 它通过将句子编码为固定长度的向量表示 将语义信息转化为机器可以处理的形式 在 文本分类 信息检索和相似度计算 等多个方面有着广泛应用 然而长期以来
  • unity 动画 - Animator 的使用

    创建 animator 文件 命名为 nanzhanshi2 controller 双击打开文件 默认三个 State AnyState Entry Exit Parameters 有四种类型的参数 Float Int Bool Trigg
  • cocos控制相机旋转

    import decorator Component Event EventMouse find Input input Node v3 Vec3 from cc const ccclass property decorator cccla
  • 1.Cherry Pick与Create Patch的区别

    Cherry Pick与Create Patch的区别 结论 实验 场景1 应用时无冲突 场景2 应用时产生冲突 使用cherry pick 使用patch 场景3 产生冲突 并且有其他文件的变更 原理 结论 1 应用无冲突时cherry
  • Java全栈体系路线(总结不易,持续更新中)

    文章目录 Java全栈工程师 font color orange Java基础 基础语法 面向对象 工具类 集合框架 序列化 反射机制 注解 文件处理 设计模式 视频教程 文档教程 练习题 面试题 GUI模块 多线程模块 Socket模块
  • VS2019修改代码后必须重新生成解决方案

    这是因为没有配置好 在工具 gt 选项 gt 生成和运行 gt 运行时 项目过期 在这里选择始终生成 这样的话就可以在修改代码之后自动重新生成解决方案
  • 钉钉环境下H5开发微应用遇到的问题和BUG(持续更新)

    项目类型 CRM 项目描述 微应用是钉钉为连接企业办公打造的移动入口 通过微应用你可以将企业的业务审批 内部系统 生成 协作 管理 上下游沟通连接到钉钉 该项目是在钉钉的基础上开发一个供本公司销售使用的客户管理系统 包含了客户 项目 订单
  • mysql实现行转列作为临时表、以及字符分割行转列

    1 需求 实现两个日期段转换为具体的日期天数 2022 10 23至2022 10 26得到一张2022 10 23 2022 10 24 2022 10 25 2022 10 26的临时表 SELECT DATE FORMAT DATE
  • vivado关联第三方编辑器

    前言 可忽略不看 绑定vivado的第三方编辑器的时候 本人曾经看过一些教程 但是对于路径的设置看的一头雾水 所以就把路径构成记录了下来 希望对你有帮助 需要关键在于step6中的路径格式 路径的格式简单分为三个部分 需要绑定的编辑器的路径
  • java中匿名内部类的匿名构造函数是怎么用的

    java中匿名内部类的匿名构造函数是怎么用的 下面的例子说明匿名内部类的匿名构造函数的用法 例2 7 2 0 interface FigureMark to win void whoAmI public class Test public
  • 刀片服务器切换显示,刀片机服务器切换

    刀片机服务器切换 内容精选 换一换 当保护组的生产站点发生故障时 将保护组的生产站点切到当前的容灾站点 即另一端AZ 启用当前容灾站点的云硬盘以及云服务器等资源 故障切换完成之后 保护组的当前生产站点变成故障切换发生之前的容灾站点 且生产站
  • 大数据开源框架之HBase编程实践

    HBase的安装部署请看 30条消息 大数据开源框架环境搭建 五 Hbase完全分布式集群的安装部署 木子一个Lee的博客 CSDN博客 目录 任务1 用HBase提供的HBase Shell命令实现以下指定功能 1 列出HBase所有的表
  • 我的创作纪念日

    机缘 我热爱编程 热爱解决问题 也享受在解决问题的过程中遇到的挑战 在大学的学习过程中 我发现将学习过程和解决问题的过程记录下来能够帮助我更深入地理解知识和技术 同时也为未来遇到类似问题提供了参考 我开始将我的学习笔记分享给同学们 收到了非
  • 二维矩形装箱问题

    装箱问题 是个NP问题 至于装箱问题到底是个什么东西 可以看看百度文档http wenku baidu com view f6e7f80590c69ec3d5bb755f html 其实我没看 研究二维矩形装箱问题 是因为需要将小图拼成大图
  • JAVA使用socket outputstream中碰到的问题

    今天在使用java的socket写网络通信 作为服务端向对端传送数据 建立连接后 首先发4个字节的内容 存放文件大小 然后再发送文件正文内容 代码是这样写的 Socket client new Socket 192 168 60 1 999
  • 谈谈Elasticsearch 和 传统关系型数据库的对比

    本帖最后由 mtsbv110 于 2016 3 22 15 03 编辑 1 在Elasticsearch中 文档归属于一种 类型 type 而这些类型存在于 索引 index 中 类比传统关系型数据库 Relational DB gt Da
  • PaddleOCR系列-训练模型并部署android手机

    PaddleOCR系列 训练模型并部署android手机 TOC PaddleOCR系列 训练模型并部署android手机 1 训练paddleocr模型 2 ocr模型部署安卓手机 2 1 AndroidStudio 2021 2 1或以