type
status
date
slug
summary
tags
category
icon
password
URL
Rating
Meta 前几天刚放出的版面恢复方面的工作:“Nougat: Neural Optical Understanding for Academic Documents”。Nougat,中文翻译是牛轧(zhá, ɡá)糖。代码和模型都开源。Nougat 和 我的开源工具 Pix2Text (P2T) 很像,所以下面我就仔细介绍下 Nougat,然后把它和 P2T 对比下,当做是竞品分析。
 
输入文献扫描后的图片,Nougat 可以按顺序识别出其中的文字、数学公式和表格,并以 Mardkown 的格式输出识别结果。相当于做了版面恢复的事,但做的又不够彻底。Nougat 虽然现在只能算是个实验室的半成品,但它的英文识别精度还是非常高的。
 
之前做版面恢复,一般的流程是先用一个版面分析模型来检测出扫描图片中每一块的含义,比如某一块是文本段(text),某一块是公式(Equation)等;然后再利用其他模型去单独识别每一块中的内容。
 
但是,Nougat 是通过一个端到端的模型,直接把图片内容解析出来,以 markdown 纯文本表示输出。因为数学公式和表格在 markdown 里都可以用纯文本表示,所以 Nougat 就都能识别,但是其中的 Figure 没法用纯文本表示,所以 Nougat 当前就直接忽略不管了。
<ins/>

Nougat: Neural Optical Understanding for Academic Documents

模型架构

模型和甜甜圈 Donut 是一模一样,标准的 Encoder-Decoder 框架。(牛轧糖估计就是和甜甜圈配对的😅)
Encoder 用的是 20层 (Swin-B {2, 2, 14, 2})的 Swin Transformer
Decoder 用的是文字生成模型 mBART 中decoder,可以看成比较标准的 transformer decoder。
Nougat 发布了两个模型:0.1.0-base中的decoder是10层,允许的最大解码长度为4096,参数量大概是350M,模型文件大小是 1.31G。而0.1.0-small中的decoder是4层,允许的最大解码长度为3584,参数量大概是250M,模型文件大小是956M
 
模型输入的图片大小是 (H, W) = (896, 672),比较大,对应一页pdf。
 

构造训练数据集

模型本身没什么创新,作者的主要工作是在构造训练数据集
这个数据集是真的很难构造的。。它的输入是单页 pdf 转成的图片,输出是这页pdf对应的 markdown(MMD,Mathpix MD)格式的纯文本序列。输出的 MMD 格式文件,可以在 https://snip.mathpix.com/ 渲染出数学公式。
 
作者收集了在arXiv上发布的1,748,201篇文章的源代码并编译成PDF。为确保格式的一致性,首先使用LaTeXML处理源文件并将其转换为HTML5文件。这一步很重要,因为它消除了LaTeX源代码中歧义,让结果更加标准化,尤其是对数学表达式。转换过程包括替换用户定义的宏、标准化空白、添加可选的括号、规范化表格,以及用正确的数字替换引用和引文
之后,解析HTML文件并将其转换为一种轻量级的标记语言(Mathpix Markdown, MMD),该语言支持各种元素,如标题、粗体和斜体文本、算法、LaTeX内联和显示数学以及LaTeX表格。这样,确保源代码格式正确并准备好进行进一步的处理。流程可见下图:
notion image
 
上面的过程还只是获得了样本的输出。输入的图片和输出对应才是真的麻烦。arXiv中的源代码是没有分页的概念的,比如不知道通过源码渲染出的pdf的第一页的末尾部分到底对应源码的什么位置。也就是没法对源码按pdf的分页进行分段。论文中介绍了作者是怎么做的,但过于琐碎这里就不讲了。大家有兴趣可以去看原论文或者源代码。
虽然作者花了很多精力在做分页,但结果依旧会有错误。这些错误会带入到生成的训练数据集,最终导致训练出的模型可能在识别一页图片时会无缘无故漏掉一些段落,或者某些段落的位置不对
https://facebookresearch.github.io/nougat/
 
📌
看代码库作者构造的训练集arXiv应该是不提供下载的,但提供了构造数据集的脚本。有需要的话可以从头自己构造😅。
 
训练时除了使用作者自己构造出来的 arXiv 数据集外,还使用了 PMCIDL 两个公开数据集。数据量如图。
怎么说呢,这个数据量没有几十块卡是训练不动的。
 
notion image

模型训练

Data Augmentation

训练时作者使用了以下的数据增强方法,这些增强方法可以模拟模型推断时遇到的各种图片类型。具体实现参考代码:https://github.com/facebookresearch/nougat/blob/main/nougat/transforms.py
notion image
 

Anti-repetition augmentation

作者发现,在生成结果时,模型有可能会陷入重复的情况,比如最后一句或段落被一遍又一遍地重复。模型无法自行从这种状态中恢复。在测试集中,大概有1.5%的页面存在这种行为,但对于域外文档(out-of-domain documents),这种频率会更高。这是 Transformer 生成模型的已知问题(原因是生成模型在训练和推断时方式不一致。训练时没有误差传播,而生成时前面预测错误会影响后面的预测结果)。
 
为了降低这种过滤,作者对训练数据引入了随机扰动,这样可以帮助模型在训练时就看到前面可能预测错的情况,提升后面结果预测的稳定性(让模型不要过分依赖前面的预测结果)。作者的方法是对训练样本中的结果序列(即 ),随机选取序列中的10%的位置,然后用随机选取的 tokens 把这些选中位置的原有tokens替换掉。
作者实验表明这种方法没有导致性能下降,但确实显著减少了生成重复序列的次数。特别是对于域外文档,页面转换失败的比率下降了32%。
📌
这种方法在NLP中训练生成模型也会用到。
 

效果评估

从作者的实验效果看,精度相对于 Latex-OCR 还是高了很多的。我自己拿几张图片测了下,在英文场景下对文字和数学公式的识别精度非常不错,单字母的数学符号极少遗漏几乎都能识别出来。连字体加粗都能在 markdown 中还原。
💔
能不能花点钱用点心,跟 Mathpix 对比下。。跟 Latex-OCR 比合适么?人家模型大小是你的 1/10 好不好 ❄️❄️
notion image
 
推断速度是真的很慢啊……
我拿一页的pdf试了下,在我的Mac CPU跑大概要花8~10分钟。论文中原话是这样的:
📌
在一台配备有24GB VRAM的NVIDIA A10G显卡的机器上,可以并行处理6页内容。生成速度在很大程度上取决于给定页面上的文本量。在没做任何推理优化时,按平均每页有 ~1400 个 tokens算,Nougat base模型处理一个batch图片的平均时间为19.5秒
 
所以总的来说,Nougat 是富人使用的免费版面恢复工具,穷人还是老老实实用版面分析+OCR吧。
 
📌
看完 Nougat 的论文,我总有一种作者在用大炮打蚊子,用力过猛的感觉😅。

Nougat vs. Pix2Text (P2T)

我自己开发了一个开源工具叫 Pix2Text (P2T),对标的是版面恢复工具 Mathpix,功能和 Nougat 类似。P2T 定位就是“穷人”用的开源版面恢复工具,会坚持在使用小模型(大概是 Nougat 模型的十分之一大小)的基础上不断优化各模型和整体精度。毕竟,不方便用GPU的人占 99% 以上。
 
notion image
 
但当前 P2T 还只是做段落级别的恢复,而不是整个版面。也就是输入一张包含一段文字和数学公式的图片,P2T 可以识别出其中的文字和数学公式。P2T 的原理见下图:
P2T 使用开源工具 CnSTD 检测出图片中数学公式所在位置,再交由 LaTeX-OCR 识别出各对应位置数学公式的Latex表示。图片的剩余部分再交由 CnOCR 进行文字检测和文字识别。最后 P2T 合并所有识别结果,获得最终的图片识别结果。感谢这些开源工具。
P2T 使用开源工具 CnSTD 检测出图片中数学公式所在位置,再交由 LaTeX-OCR 识别出各对应位置数学公式的Latex表示。图片的剩余部分再交由 CnOCR 进行文字检测和文字识别。最后 P2T 合并所有识别结果,获得最终的图片识别结果。感谢这些开源工具。
更多介绍参考 Pix2Text 。对于不想本地部署,只想使用公式识别功能的朋友,可以直接使用 P2T网页版
 
未来一两年内 P2T 会补全版面恢复的完整功能,大致计划如下:
  • 今年:继续优化 MFDMFR 模型和文本 OCR 模型;
  • 明年:优化并加入版面分析模型表格识别模型,使 P2T 能够完成版面恢复的全部功能。
📌
重申一下,P2T 是很坚定的走小模型路线的,在优化精度时的一个大前提是不能让模型变大。
 
下面对当前的 NougatP2T 做个对比:
Nougat
P2T
模型文件大小
~ 1G
~ 100M
实现策略
端到端
多模型组合
推断速度(CPU)
~ 10分钟
~ 20秒
当前支持语言
英文等西文
英文,中文
支持文字识别
✔️
✔️
支持数学公式识别
✔️
✔️
支持表格识别
✔️(效果一般)
✖️(明年支持)
支持图片
✖️
✖️(明年支持)
支持多栏
支持,但效果不佳,识别结果是单列的;段落顺序可能错乱
✖️(明年支持)
 
在大模型时代,出现 Nougat 这样较大的版面恢复模型是很自然的现象。就跟文字识别模型的发展类似。现在已经有一些大模型(如 OFA)可以做到识别文字非常精准,可是大部分人还是倾向选择小模型。大模型用起来还是很贵的,所以像 CnOCR 这种开源的小模型才有生存空间。
 
总之,Pix2Text (P2T) 还是会按照自己的计划,坚持走 小模型+开源 的路线。欢迎大家试用免费的 P2T网页版,觉得不错可以帮忙宣传下。
<ins/>

References

 
CnOCR 纯数字识别新模型基于大语言模型的AI Agents—Part 2
Loading...