Skip to content

[Feature Request] macOS OCR: 考虑使用 Apple Vision.framework 替代 CoreML EP 上的 PaddleOCR,绕开 #776 根因 #1434

Description

@ZURICHRAN

功能描述 / Feature Description

背景

#776 报告了 macOS 上 CoreML EP 运行 PaddleOCR 模型时存在识别结果不稳定的问题(同图 10–50% 概率漏字),维护者在 commit 12764784 中通过在 OCRResMgr::use_coreml() 内注释掉 CoreML 调用并强制 use_cpu() 进行了止血:

// det_option_.UseCoreML(coreml_flag);
// rec_option_.UseCoreML(coreml_flag);
LogWarn << "OCR with CoreML is very poor. I don't know the reason yet. Roll back to using CPU";
use_cpu();

这导致 macOS 上 OCR 识别目前无法利用 GPU/NPU 硬件加速。

提议

macOS 系统内置了 Vision.frameworkVNRecognizeTextRequest),这是苹果自研的文字识别引擎,运行于 GPU 与 Neural Engine (NPU) 上。与当前方案的关键区别在于:

可行性验证

我在下游项目中通过 Python (pyobjc-framework-Vision) 调用 VNRecognizeTextRequest 进行了初步验证:

  • 中日韩文字识别准确率良好,支持 VNRequestTextRecognitionLevelAccurate 精确模式
  • 硬件加速生效,GPU/NPU 被正确调用
  • 输出包含文本、置信度及归一化 bounding box(左下角原点,需转换为左上角像素坐标)

如果在框架层实现的优势

在下游各项目的应用层(Python / C# 侧)各自实现该方案存在明显的维护问题,正如 [MFABD2#432](sunyink/MFABD2#432) 中项目维护者 @sunyink 指出的:

  1. expected 字符串强绑定:下游项目的 pipeline JSON 中大量 expectedreplace 字段是对着 PaddleOCR 的具体输出行为标定的。更换引擎后,同一份 JSON 无法同时兼容两个引擎的输出差异,每新增或修改一个 OCR 节点都需要在两个引擎上分别验证。
  2. Custom 识别无原生 draw 回显:应用层接管后无法利用框架的 vision debug 图进行排查。
  3. 各下游项目重复造轮子:每个基于 MaaFramework 的项目都要独立实现一套坐标转换、ROI 裁剪、回退逻辑。

如果在框架层统一接入 Vision.framework 作为 macOS 上的 OCR 后端:

  • 框架可以保证 OCR 输出的归一化行为跨平台一致(在框架内部处理 PaddleOCR 与 Vision 的输出差异映射)
  • 所有下游项目零改动即可受益
  • draw 回显、threshold 过滤等框架级功能天然可用

需要讨论的点

  1. 输出一致性Vision.framework 的识别结果与 PaddleOCR 在字符级别上必然存在差异(如 bounding box 的 padding、特殊字符处理等)。是否可以在框架内部做一层归一化映射来抹平差异,还是允许 macOS 上的输出与其他平台存在可接受的偏差?
  2. C++ / Objective-C 混编Vision.framework 需要通过 Objective-C 或 Swift 调用,需要在 CMake 构建中引入 .mm 文件混编。对现有构建体系的侵入程度需要评估。
  3. 是否作为可选后端:可以考虑作为 macOS 上的可选 OCR 后端(类似 DirectML/CUDA 的角色),通过配置切换,而非强制替换。

相关引用


MaaFramework 版本 / Version

No response

其他信息 / Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions