Skip to content

feat(ocr): add four-way document orientation stage - #32

Open
hnlyf168 wants to merge 1 commit into
sdcb:mainfrom
hnlyf168:feat/document-orientation
Open

hnlyf168 wants to merge 1 commit into
sdcb:mainfrom
hnlyf168:feat/document-orientation

Conversation

@hnlyf168

Copy link
Copy Markdown
Contributor

为整页 90°、180°、270° 倾转增加可选的纸张方向识别第一阶段:先分类并校正整页,再执行 DET → 文本行 CLS → REC。返回的行框和 CTC 字符框仍使用原始输入图坐标,已有加载方式保持兼容。

模型与接入

  • 新增独立 Sdcb.SimdPaddleOCR.Models.DocumentOrientation NuGet 项目,只依赖 ModelProvider,不合并到现有中文模型包。
  • 使用官方 PP-LCNet_x1_0_doc_ori,支持 0°、90°、180°、270°。PP-LCNet_x1_0_textline_ori 仅支持 0°/180°,也已下载并独立导出为 ONNX,保留现有文本行分类模型。
  • PaddleOcrAll.Load/LoadAsync 接收独立方向 provider;可单独设置后端、线程预算、置信度阈值或关闭阶段。
  • 预处理遵循 PaddleX 的 RGB、短边 256、中心裁剪 224、ImageNet 归一化,只计算裁剪区域;整页旋转使用整数像素拷贝,支持四种像素格式和非紧密 stride。
  • 新增代码及配套转换、验证、性能测试工具包含中文方法和参数注释。

转换与算子

  • 固定源模型 revision,并记录源文件、输出模型的 SHA-256 和转换工具版本。
  • Paddle2ONNX 关闭内置优化导出后,使用独立 onnxsim 简化,再执行严格形状推导与 ONNX checker。两个模型均从 310 节点简化为 113 节点。
  • 每个模型用 15 组输入比较原始 Paddle、原始 ONNX、简化 ONNX;ONNX Runtime 图优化关闭。纸张模型最大绝对误差 3.5763e-7,文本行模型 4.1724e-7,全部最高分类一致。
  • 导入时将 Gemm 展开为现有 MatMul/Add 等节点,支持转置、缩放及广播偏置,复用 CPU/WASM/GPU 实现;修复 Constant 内部名称与输出边不同导致常量丢失的问题。
  • 对 RTX 3060 的小 1×1 特征图调整 Vulkan Split-K 点积路径选择,保留环境变量对照旧路径。

验证

  • .NET 10 单元测试:131 通过;netstandard2.0:128 通过;方向专项:12 通过。
  • 本机 CPU、RTX 3060 Vulkan、真实 Edge 浏览器 WASM(解释及 AOT)均通过四方向标签、文本、行框和字符框验证。Vulkan 验证实际会话有效,未静默回落。
  • 独立 NuGet 打包及仅使用本地 NuGet 源、无项目引用的模型加载烟测通过。
  • 中文 XML 注释编译检查,Python/Node/PowerShell 语法检查通过。

本机 i7-12700、32 GB RAM、RTX 3060 12 GiB,500×500 样例(16 行,预先旋转 90°),单请求连续运行,各模式两轮、每轮 20 秒;耗时含预处理,完整 OCR 含整页旋转,排除模型加载和 JPEG 解码:

模式 平均耗时 进程 CPU 进程工作集
方向识别 / CPU 2.82 ms 12.3% 108.8 MiB
方向识别 / Vulkan 1.02 ms 3.0% 242.4 MiB
完整 OCR / CPU 36.93 ms 40.2% 239.7 MiB
完整 OCR / Vulkan 15.32 ms 9.9% 332.4 MiB

完整 OCR 在该样例上约快 2.41 倍;CPU 占用按 20 个逻辑处理器归一化。CPU 方向第二轮存在长尾,以上平均包含两轮全部调用。GPU/显存指标为整卡读数,包含桌面和其他程序;完整基线、P95、峰值和采样记录见资源报告。方向功能的 GPU 实测覆盖本机 Vulkan,其他设备的方向模型性能未在本次本机测试中验证。

接入、转换复现与验证记录:

  • docs/document-orientation.md
  • docs/document-orientation-validation.json
  • docs/resource-performance.md
  • docs/resource-performance-validation.json

使用示例:

using Sdcb.SimdPaddleOCR.Models.DocumentOrientation;

using var ocr = await PaddleOcrAll.LoadAsync(
    ChineseV6TinyModels.Default,
    documentOrientation: DocumentOrientationModel.Provider,
    options: null);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants