DriftLedger/plugins/ppocr/README.md
fengmengqi 2e73b5a2c6 feat: UI 全面重设计(Bento 明亮风)+ 记一笔 NumpadSheet + 管理页模板 + OCR v5→v6 升级
UI 重设计(P1-P5):
- 主题从靛蓝 accent 切换为近黑白单色(#111318),品牌感靠排版与财务语义色
- 暗色模式适配 OLED 纯黑,财务色整体提亮一档保证对比度
- 圆角体系新增 xl(24),卡片/弹窗统一大圆角
- 移除 Caveat/Quicksand 自定义字体,切换为系统字体
- 新增 display(34/800) 字阶用于净资产等大数字展示
- 分类/标签/渠道颜色统一到 palette.ts 色板(12 色循环 + FNV 哈希)
记一笔 NumpadSheet(P3 录入闭环):
- 全新计算器风格录入面板:方向 chip → 大金额 → 账户 chip → 分类快捷行 → 数字键盘
- 支持表达式输入(20+15-5.5)与字符串十进制求值,避免浮点精度问题
- 高级模式保留多行分录编辑器,简单模式自动推断双腿
- postingLegs.ts 实现 buildPostings 的逆操作(编辑/草稿预填)
- 未保存守卫:整页 beforeRemove + modal 脏状态上报
- 全局弹层(NumpadSheetHost)由+按钮唤起,可通过设置开关
Tab 栏重构:
- AppTabBar 替换默认 tab bar,中央+按钮唤起全局记账面板
- Tab 从 5 个精简为 4 个(首页/交易/报表/设置),+按钮独立
管理页模板 ManagementScreen:
- 统一「列表 + 新增 + 点按编辑 + 长按删除 + FormModal」模式
- 预算/分类/标签/信用卡等管理页消除手写样板
其他:
- OCR 模型从 PP-OCRv5 升级到 v6(det/rec/dict 全部替换)
- GBK 解码器 import 修复(text-encoding-gbk ESM 兼容)
- 批量确认失败数计算修正(用 failedPayees.length 替代 store 快照差值)
- 新增 diagnostics 诊断页、TodoStrip 首页待办条、SwipeableTransactionCard 左滑操作
- periodNav.ts 报表周期导航(anchor+period 统一状态管理,本地时区运算)
- 测试覆盖 numpadExpression/postingLegs/periodNav/palette/search/transactionGroups/categoryIcons/dateGrid
2026-07-22 13:33:29 +08:00

4.4 KiB
Raw Blame History

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