DriftLedger/plugins/ppocr
fengmengqi bf04400852 feat: OCR 模型按需下载 + 三层独立开关 + 日志持久化 + 原生浮层主题同步 + 文档重构
OCR 模型按需下载(P8 瘦身):
- 移除 plugins/ppocr/assets/ 内置模型(det 9.8MB + rec 21MB + dict),APK 减包 ~31MB
- 新增 modelDownloader.ts:优先从 HuggingFace/CDN 下载,兜底从 APK assets 拷贝
- OcrModule.kt 新增 setModelDir,支持从 filesystem 加载模型,回退 assets 兼容旧用户
- settingsStore 持久化 ocrModelVersion / ocrModelDir
- 自动化页集成模型状态检查与一键下载 UI

OCR 三层独立控制:
- OcrProcessorConfig 从单一 aiVisionEnabled 拆分为 layer1/2/3 三个独立开关
- 设置页可按层启停(L1 正则规则 / L2 本地 OCR / L3 AI Vision)
- OCR 处理增加耗时与字符数日志

日志系统升级:
- logger.ts 新增 LogFileBackend 抽象,支持磁盘持久化(按日期 app-YYYY-MM-DD.log)
- 新增 logBackend.ts(ExpoLogFileBackend)+ 日志中心页 settings/logs.tsx
- 日志中心:实时缓冲 + 历史文件、4 级过滤、Tag/关键词搜索、JSON 展开、分享导出、7 天过期清理
- _layout.tsx 启动时初始化文件后端 + 日志脱敏(验证码/卡号)

原生浮层 UI 主题同步(P6):
- 新增 floatingUiConfig.ts:JS 侧从 theme tokens + i18n 构建 FloatingUiConfig 推送原生
- 新增 FloatingUiConfigStore.kt:SharedPreferences 存储,三浮层组件读取
- FloatingBillView 重设计:颜色/文案走配置、新增币种 chip、金额校验改 BigDecimal
- FloatingHelper / FloatingTip 同步适配
- _layout.tsx 新增 FloatingUiConfigSyncer,主题/语言切换自动推送

UI 与组件增强:
- FormModal 新增 select/dropdown 控件、行内布局(row/flex)、联动回调 onValuesChange
- 新增 Touchable 通用触摸组件、AccountCreateModal 快速建账弹窗
- 信用卡页展示账单周期/到期还款日/本期应还/剩余可用额度,关联账户改下拉选择
- AI 设置页重做:OpenAI/Gemini/DeepSeek 预设 + 默认 URL/模型
- 引导页新增 Android 权限检查步骤(无障碍/通知/短信/存储/悬浮窗)

去重优化:
- 对手方匹配改为模糊包含(includes),双方均无对手方时判定低置信度重复
- DedupResult 新增 matchedItem 返回匹配对比项

文档重构:
- README.md 重写为入口索引(品牌更新 + 模块概览 + 文档导航表)
- 新增 AGENTS.md(AI 助手贡献指南)、docs/architecture.md(Mermaid 数据流/分层/OCR 级联图)
- 新增 docs/development.md(环境/命令/编码规范/测试/提交规范)、plugins/README.md
- UI 重设计文档(design spec + p1-p8)移入 docs/design/

其他:
- i18n 新增权限/信用卡详情/日志中心/AI 设置等翻译键
- ppocr Config Plugin 修复 import 注入去重;size-optimization 增强
- 新增测试:logger.test.ts、floating-ui-config.test.ts
2026-07-23 19:03:38 +08:00
..
android feat: OCR 模型按需下载 + 三层独立开关 + 日志持久化 + 原生浮层主题同步 + 文档重构 2026-07-23 19:03:38 +08:00
app.plugin.js feat: OCR 模型按需下载 + 三层独立开关 + 日志持久化 + 原生浮层主题同步 + 文档重构 2026-07-23 19:03:38 +08:00
package.json feat: 品牌重命名为浮记(DriftLedger),全面升级精度安全与架构 2026-07-21 15:16:44 +08:00
README.md feat: OCR 模型按需下载 + 三层独立开关 + 日志持久化 + 原生浮层主题同步 + 文档重构 2026-07-23 19:03:38 +08:00

PP-OCR (ONNX Runtime) Config Plugin

本插件在 expo prebuild 时注入 PP-OCR 本地 OCR 原生模块plan.md 决策 4

引擎选用 ONNX Runtime跨平台、微软官方、Windows 友好),替代原 NCNN 方案。

当前版本

PP-OCRv6 smalldet 2.5M 参数 + rec 5.3M 参数,精度显著优于 v5 mobile

指标 PP-OCRv5 mobile PP-OCRv6 small
det Hmean 75.2% 84.1%
rec W-Avg 73.7% 81.3%
rec ONNX 大小 ~17 MB ~21 MB

文件结构

plugins/ppocr/
├── app.plugin.js              # Config Plugin 入口prebuild 时执行)
├── android/                   # Kotlin 原生实现prebuild 时复制进原生工程)
│   ├── OcrModule.kt           # React Native BridgeONNX Runtime 推理 + det/rec 前后处理
│   └── OcrPackage.kt          # RN Package 注册(注入到 MainApplication.getPackages
└── assets/                    # ONNX 模型 + 字典(需自行下载放置)
    ├── ppocrv6_det.onnx       # 文本检测模型PP-OCRv6 small
    ├── ppocrv6_rec.onnx       # 文本识别模型PP-OCRv6 small多语言
    └── ppocrv6_dict.txt       # PP-OCRv6 多语言字典CTC 解码用)

模型获取(一键下载)

PP-OCRv6 官方 ONNX 模型来自 PaddlePaddle/PP-OCRv6 系列

# 在项目根目录执行
mkdir -p plugins/ppocr/assets
cd plugins/ppocr/assets

# det 模型PP-OCRv6 small
curl -L -o ppocrv6_det.onnx \
  https://huggingface.co/PaddlePaddle/PP-OCRv6_small_det_onnx/resolve/main/inference.onnx

# rec 模型PP-OCRv6 small
curl -L -o ppocrv6_rec.onnx \
  https://huggingface.co/PaddlePaddle/PP-OCRv6_small_rec_onnx/resolve/main/inference.onnx

# PP-OCRv6 多语言字典(必须与上面的 rec 模型配套)
curl -L -o ppocrv6_dict.txt \
  https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/main/ppocr/utils/dict/ppocrv6_dict.txt

⚠️ 字典必须与 rec 模型配套v6 字典字符集与 v5 完全不同,混用会导致 CTC 解码乱码。 若之前使用过 v5 模型,务必删除旧文件(ppocrv5_det.onnxppocrv5_rec.onnxppocrv5_dict.txt)。

性能配置(参考 AutoAccounting OcrProcessor.kt

优化项 配置
引擎 ONNX Runtime Android
执行器 CPU兼容性最稳部分设备 GPU 会崩溃)
线程 intraOp=2 / interOp=2
det 图像 最大边 960px短边压缩 720px
rec 图像 固定高度 48px
ABI arm64-v8a主流设备

使用

app.json 注册插件:

{
  "plugins": ["./plugins/ppocr"]
}

JS 层通过 src/services/ocrBridge.tsNativeOcrBridge 调用,桥接到 NativeModules.PpOcr

  • recognizeText(base64) → 返回纯文本(多行用 \n 连接)
  • recognizeTextBlocks(base64) → 返回带坐标的文本块数组 [{text, x, y, width, height, confidence}]
  • isReady() → 模型是否加载完成

当前状态

  • app.plugin.js Config Plugin 逻辑prebuild 注入 Kotlin + 模型 + gradle 依赖 + MainApplication 注册)
  • android/OcrModule.kt ONNX Runtime 推理det DB 后处理 + rec CTC 解码)
  • android/OcrPackage.kt RN Package 注册
  • assets/:需自行下载放置(见上「模型获取」),版权/体积原因不入仓库

真机构建步骤:放置模型文件 → npx expo prebuild --platform androidConfig Plugin 会把 Kotlin 源码与 assets/ 下的模型/字典复制进 android/)→ npx expo run:android

若之前已 prebuild 过且更换过字典/模型文件,务必重新执行 npx expo prebuild --clean,否则 android/app/src/main/assets/ 下可能残留旧模型/字典。

v5 → v6 迁移说明

若从 PP-OCRv5 升级,需完成以下步骤:

  1. 下载新模型:按上述「模型获取」章节下载 v6 模型和字典
  2. 删除旧文件:移除 ppocrv5_det.onnxppocrv5_rec.onnxppocrv5_dict.txt
  3. 代码已自动适配OcrModule.kt 中的常量已更新为 v6 文件名
  4. 重新 prebuildnpx expo prebuild --clean 确保旧资产被清理
  5. 验证 tensor 名称v6 ONNX 模型的输入 tensor 名可能与 v5 不同,若推理报错需用 Netron 检查并调整 OcrModule.kt 中的 detInputs/recInputs map key