从0到1:PaddleOCR安卓端部署4步实操指南
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
拍一张纸质合同或票据,手机本地就能吐出带坐标的结构化文本,这是移动端应用里很常见的诉求。本文以 PaddleOCR 的安卓端部署工程(deploy/ppocr-android 目录)为主线,带你从环境检查到真机出结果完整走一遍,不用自己训练模型。
一、先说结论:这套方案适合谁
- 官方仓库直接提供 Android SDK(ppocr-android)和配套 Demo,模型为 ONNX 格式,推理走 ONNX Runtime 1.21.1,CPU 即可完成,全程离线。
- 覆盖"检测 + 识别"端到端流程,返回文本、置信度、坐标,并自带检测/识别分阶段计时,方便定位耗时。
- 门槛明确:JDK 17 构建,真机最低 Android 8.0(minSdk 26)。
- SDK 与 Demo 分离,之后可以用源码或 AAR 两种方式并入你自己的 App,不必整个 Demo 照搬。
| 场景 | 能做什么 | 关键产出 |
|---|---|---|
| 文档票据拍照 | 文字行定位 + 识别 | 文本 + 坐标 |
| 字段抽取类应用 | 带置信度取字 | 识别分数 |
| 已有 App 集成 | 源码 / AAR 依赖 | ppocr-sdk 模块 |
二、30秒看懂原理:一张图的数据流
你调用recognize()后,图片先送检测模型,找出所有文本行的四边形框;再把每个框裁剪出来逐条送识别模型输出文字。预处理、推理、后处理都封装在 SDK 内部,Kotlin 侧只拿最终结果和分阶段计时。整条链路在 CPU 上跑,不依赖云端接口。
三、开工前物料清单
动手前把这 6 项对一遍,能避开后面 80% 的报错:
| 物料 | 建议版本 | 备注 |
|---|---|---|
| Android Studio | Ladybug(2024.2+) | 打开 ppocr-android 工程 |
| JDK | 17 | Gradle 构建硬性要求 |
| Kotlin | 2.1.0 | 工程已锁版本,勿随意改 |
| 真机 | Android 8.0+ | 需开启 USB 调试 |
| ONNX Runtime | 1.21.1 | 已含在工程依赖里 |
| OpenCV | 4.5.3 | 初始化时机有讲究,见第六节 |
四、从零到跑通的完整实操
Step 1 克隆仓库并定位工程
做什么:拉取代码后进入安卓部署目录,官方文档在 docs/version3.x/inference_deployment/cross_platform/android_deployment.md,可作对照。
git clone https://gitcode.com/GitHub_Trending/pa/PaddleOCR cd PaddleOCR/deploy/ppocr-android看到什么算成功:目录下能看到 ppocr-sdk/(SDK 库模块)、app/(Demo)、run_benchmark.sh 三个关键入口。
Step 2 准备 ONNX 模型
做什么:从模型库下载 PP-OCRv6_small(求快可选 tiny),按目录规则放置——检测模型的 inference.onnx 放入 ppocr-sdk/src/main/assets/models/det/,识别模型的 inference.onnx 和 inference.yml 放入 models/rec/。
看到什么算成功:det 目录 1 个 onnx 文件,rec 目录 1 个 onnx + 1 个 yml,路径拼写无大小写错误。
Step 3 编译 Demo
做什么:用 Android Studio 直接打开工程点运行,或命令行构建并安装。
./gradlew :app:assembleDebug ./gradlew :app:installDebug看到什么算成功:BUILD SUCCESSFUL,且真机上安装无报错。
Step 4 真机验证识别结果
做什么:打开 PP-OCRv6 Demo,等模型加载完成,点 Select from Gallery 选一张文字清晰的图片。
看到什么算成功:界面显示逐行识别文本,并附检测、识别耗时统计。参考量级:仓库文档给出的样例设备(Android 9,5 行文本)全链路平均约 420 ms,其中检测约 350 ms、识别约 65 ms,你的设备按此数量级对照即可。
五、调优与性能参考:线程数和阈值怎么调
| 参数 | 默认值 | 含义 | 调整建议 |
|---|---|---|---|
| numThreads | 4 | 推理线程数 | 四核机取 2 或 4 试跑对比 P90 |
| detLimitSideLen | 64 | 检测输入边长上限 | 小字漏检时调大 |
| detBoxThresh | 0.6 | 检测框置信度阈值 | 漏框时降到 0.5 |
| recBatchSize | 1 | 识别批大小 | 文字行多时可试 2 |
三条调优建议:
- 先固定图片只调 numThreads,用 P90 而非均值判断,避免单次抖动误导。
- 漏检优先怀疑 detBoxThresh 和输入分辨率,顺序是降阈值、再加边长。
- 用仓库自带脚本在真机跑分布:
./run_benchmark.sh 10 3(10 次测量、3 次预热),输出 Mean/Stdev/P90,比手动点一次更可信。
六、高频问题速查
| 问题现象 | 可能原因 | 解决动作 |
|---|---|---|
| 打开 App 模型不加载 | onnx 没放进 assets/models | 按 Step 2 路径核对文件名 |
| 初始化即崩溃 | 未先初始化 OpenCV | 调 PaddleOCR.create 前先执行 OpenCVUtils.init |
| 识别结果为空 | detBoxThresh 偏高或图片模糊 | 降阈值,换清晰图重测 |
| 耗时明显偏长 | 线程数不匹配或图过大 | 减线程、调小输入边长 |
| 文字方向反了 | 图片旋转 180° | 拍摄端正方向,或预处理旋转 |
七、还能怎么玩
- 集成进自有 App:ppocr-sdk 支持源码依赖或打成 AAR(
./gradlew :ppocr-sdk:assembleRelease),业务侧只需 create、recognize、release 三个动作。 - 真机性能回归:把 run_benchmark.sh 的输出接进你的测试流程,换机或换模型后直接对比 P90。
- 想走 Paddle Lite 技术栈或支持更老机型:仓库里另有 deploy/android_demo(Paddle Lite 2.10 版 Java/C++ 示例),两套路线可按设备生态二选一。
八、写在最后
跟着四个步骤走完,你手上已经有一个能离线跑、可嵌进自有应用的安卓 OCR 能力。建议的下一步:先在自己设备上跑一轮 benchmark 拿到基准数据,再把 SDK 接进项目试一个真实场景。📱
项目地址:https://gitcode.com/GitHub_Trending/pa/PaddleOCR
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考