微调 olmOCR 以成为忠实的 OCR 引擎

社区文章 发布于 2025 年 4 月 22 日
在 TNG,我们基于 olmOCR 创建了一个光学字符识别模型的微调版本,以帮助我们自动化内部文档处理工作流程。

最近,艾伦人工智能研究所推出了 olmOCR,该模型在将 PDF 转换为清晰、线性化的纯文本,同时保留结构化内容方面取得了令人印象深刻的结果。然而,olmOCR 的主要用例是为大型语言模型提供更多训练数据,因此它会忽略文档中的页眉和页脚等无关信息。虽然这对于生成训练数据很有益,但对于实际业务应用程序来说却是不够的,因为关键信息通常位于文本的页眉和页脚部分(例如发票)。本文介绍了我们如何微调原始 olmOCR-7B-0225-preview,使其成为忠实的 OCR 引擎,从而支持更广泛的应用程序。

在此示例中,页眉和页脚中标记为红色的关键信息被 olmOCR 忽略。image/png

基于管道的 OCR 引擎的问题

光学字符识别在各种业务用例中都有广泛应用。长期以来,基于人工智能的 OCR 引擎的主要范式是基于管道的系统。这些系统由多个机器学习组件(例如,段落分割、表格解析、字符识别等)串联而成。然而,这种方法的一个根本缺陷是,提取的结果大多不能以符合逻辑阅读顺序的方式扁平化上下文,这被称为线性化。这对于具有浮动元素(如带浮动图表、页眉、页脚等的多列文档)的布局丰富的文档尤其具有挑战性。随着视觉语言模型的最新出现,人们投入了大量精力将其作为替代 OCR 系统来解决这个问题。

起点:olmOCR-7B-0225-preview

在我们测试 Hugging Face 上发布的 olmOCR 模型用于发票解析等业务应用程序时,我们发现页眉和页脚中始终缺少重要信息。这是预料之中的,因为用于训练 olmOCR 的数据集 olmOCR-mix-0225 特意排除了这些区域中的无关信息,以保持自然的阅读流,因为此类信息在用于训练的下一词元预测上下文中无法有意义地预测。

为了解决此限制并实现全面的信息提取,我们利用 Qwen2.5-VL-72B-Instruct 生成了一个包含 8,000 个文档的数据集,该数据集捕获了所有相关信息,正如人们所期望的可靠 OCR 引擎。我们将训练设置基于开源的 olmOCR 训练管道,在 8xH100 Nvidia 节点上使用 4 个梯度累积步骤,总共进行 2.5 个 epoch。默认的超参数对我们来说效果很好,无需进行资源密集型超参数搜索。使用 MlLflow 进行的实验跟踪显示以下结果

image/png

为了进行评估,我们使用了 olmOCR-mix-0225 评估数据集的定制版本,其中包括也使用 Qwen2.5-VL-72B-Instruct 获取的页眉和页脚信息。

训练完成后,是时候对我们的模型进行测试了。

原始 olmOCR 与微调 olmOCR 的比较

我们对解析内容后缺少关键信息的文档进行了定性评估。我们的推理设置与 olmOCR 的设置相同,利用了一种称为文档锚定(document anchoring)的特殊提示策略,该策略保留了每页的原始数字内容。此技术提取原始文本块和位置信息,以便与栅格化图像一起提示 VLM。

我们在下面提供了原始响应和微调模型响应的几个示例。我们用红色标记了关键的缺失信息。

原始 PDF 是一张包含顶部和底部重要信息的发票。与 olmOCR-7B-0225-preview 不同,我们的微调版本提取了所有信息。

这个例子再次包含下游任务的重要信息。我们的模型提取了所有信息,并且仍然能够解析简单的表格。

复杂的双栏布局也可以用 olmOCR 解析。现在,页眉中的额外信息也已提取。

最后一个例子 ;-)

总的来说,我们对结果感到满意,因为现在所有信息(包括无关数据)都将被提取,并且模型仍然能够解析简单的表格。值得注意的是,我们注意到对于某些示例,输出质量会随着不同温度而显著变化。

总结

OCR 对于从文档中提取结构化信息至关重要。像 olmOCR 这样的端到端系统能够线性化内容,这使得它们比传统系统具有强大的优势。通过我们的微调版本,我们现在可以忠实地从各种文档中提取文本,包括页眉和页脚部分,这对于发票解析等业务用例至关重要。我们很想知道未来的模型在这个快速发展的领域中将如何演变。特别感谢艾伦人工智能研究所开源他们的模型、数据集和代码。

如果您想尝试我们的微调 olmOCR 模型,我们已将其开源到 HuggingFace

社区

好文章,谢谢分享!

是什么让您选择 8xH100 设置进行微调,以及您的体验如何?
您没有提到训练持续了多长时间,所以我想知道微调 olmOCR 是否确实需要那种硬件。

谢谢!

谢谢 andrei-41!

我们选择 8xH100 设置主要是为了速度和便利,因为我们有多次实验运行。我们最终的训练运行持续了 6 小时,所以它绝对是杀鸡用牛刀。但是我们通过云平台租用了集群,这是一个灵活、低承诺的选择;我们可以根据需要轻松启动/关闭实例。此外,就 GPU 内存而言,更少的内存绝对足够,可能两个 GPU 就够了。

您能分享一下用于微调的代码吗?我正在尝试为手写医疗处方制作 OCR,但无法获得正确的结果

注册登录 发表评论