识别工作原理
识别工作原理
本页逐步讲解 AsposeOcr.Recognize() 实际在内部的工作方式,从输入验证到最终的 RecognitionResult。调用 AsposeOcr.Recognize(OcrInput) 会运行一个固定的八步流水线。以下每一步都基于库自身的实现——没有可配置的阶段。
1. 输入验证
在加载任何模型之前,Recognize() 会验证 OcrInput:它会拒绝 null 输入(ArgumentNullException)、不受支持的 InputType(NotSupportedException),以及任何磁盘上不存在的排队路径(FileNotFoundException)。在所有输入通过之前,不会创建 ONNX 会话。
2. PDF 渲染或光栅加载
对于 InputType.PDF,每页被渲染为 24 位 RGB 图像,位于 150 DPI using Aspose.PDF.FOSS。对于 InputType.SingleImage,光栅文件直接加载。150 DPI 的渲染分辨率是固定的,无法配置。
3. 检测器预处理
图像使用 Rec. 709 亮度加权系数,相较于简单的通道平均,这种方式更准确地保留感知亮度。如果图像的最长边超过 1000 像素,则使用可分离的 Lanczos-8 过滤器(两次一维通道)以匹配检测模型的训练时预处理。为相同原因,在图像底部追加一条 32 像素的白色条带。
4. 区域检测
预处理后的图像通过第一个嵌入的 ONNX 模型,该模型生成文本概率图和中间视觉特征。第二个 ONNX 模型——精炼模型——加强相邻字符之间的关联,使整行文本被检测为一个区域,而不是多个碎片。两个模型均在 CPU 上运行,Microsoft.ML.OnnxRuntime 配置为 8 个内部操作工作线程。
5. 区域后处理
检测器的文本和链接概率图先进行阈值化,然后使用四连通的广度优先洪水填充进行分组。每个得到的区域进行膨胀,拟合最小面积矩形,缩放回源图像坐标,并简化为非嵌套、轴对齐的线段矩形。这些矩形即为 RecognitionResult.LinesResult.Line 最终返回的结果。
6. 行识别
对每个检测到的矩形进行两像素的填充,从源图像中裁剪出来,并在保持宽高比的情况下,缩放至固定的 1200×32 白色画布。结果转换为 NHWC 灰度张量并传递给识别模型。
7. CTC 解码
识别模型的原始输出使用贪婪方式解码 CTC(连接时序分类) 解码:将重复的预测类别合并,去除空白类别,然后通过模型内嵌的拉丁字母表将剩余类别映射,生成该行的识别文本。
8. 结果组装
识别出的行与其源图像矩形配对,以构建每个 RecognitionResult.LinesResult。所有非空行使用平台换行符连接,生成 RecognitionResult.RecognitionText。
顺序 vs. 并行工作
输入文件以及 PDF 的单独页面都会被处理 sequentially — 没有输入级别的多线程 API。并行性仅存在于每个 ONNX 推理调用内部,在那里 Microsoft.ML.OnnxRuntime 在其 8 个配置的内部操作线程上并行化图执行。