Chapter 3:OCR 与文档理解基准(从图片文字到结构化信息)
1. 开篇段落
在多模态大模型(MLLM)的商业落地中,OCR(光学字符识别)与文档理解是价值密度最高的领域之一。不同于识别“一只猫”或“日落”,文档理解要求模型具备像素级的精确度和逻辑级的推理力。
如果一个模型把发票金额 "100.00" 读成 "1000.0",或者把合同条款中的 "No" 漏读,其毁灭性是致命的。因此,本章的评测基准不再是简单的“看图说话”,而是对模型感知极限(极小字)、布局理解(多栏混排)、逻辑推理(跨页信息)及格式化输出(JSON/Markdown)的全面压力测试。
本章学习目标:
- 全景认知:区分场景文字(Scene Text)与文档文字(Document Text)的评测差异。
- 架构洞察:深入理解 OCR-Free(端到端)与 OCR-Based(外挂系统)两种流派在 benchmark 上的表现特征。
- 基准精通:掌握 OCRBench v2、DocVQA、TextVQA、InfoVQA 的核心考点。
- 指标深究:从数学层面理解 ANLS 的计算逻辑及其对长短文本的不同偏置。
- 前沿技术:了解 High-Res Cropping(动态分辨率)如何解决“看不清”的问题。
2. 核心概念与文字论述
2.1 任务谱系:从“识字”到“结构化”
我们将文档理解能力拆解为四个进阶层级,评测难度逐级递增:
+------------------------+ +------------------------+ +------------------------+ +------------------------+
| Level 1: 纯感知 (OCR) | -> | Level 2: 实体抽取 (KIE)| -> | Level 3: 关系推理 (VQA)| -> | Level 4: 结构化还原 |
+------------------------+ +------------------------+ +------------------------+ +------------------------+
| 任务: 检测框 + 文字内容 | | 任务: 寻找 Key-Value 对| | 任务: 结合图像回答问题 | | 任务: 输出 Markdown/HTML|
| 示例: 读出所有路牌文字 | | 示例: 提取发票"总金额" | | 示例: "哪种药副作用最大?"| | 示例: 图片转可编辑文档 |
| 基准: IIIT5K, COCO-Text| | 基准: SROIE, FUNSD | | 基准: DocVQA, TextVQA | | 基准: Nougat, OBR (Parse)|
+------------------------+ +------------------------+ +------------------------+ +------------------------+
2.2 技术流派:OCR-Free vs. OCR-Based
在评测中,你会发现两类模型表现截然不同,理解这一点对分析榜单至关重要:
-
OCR-Based (Pipeline): 先用传统 OCR 引擎(如 PaddleOCR, Google Cloud Vision)提取文字和坐标,再将 OCR 结果作为 Prompt 喂给 LLM。 * 优势:对极小字、密集字极其鲁棒(只要 OCR 引擎强)。 * 劣势:丢失视觉特征(字体、颜色、划线),空间关系(Layout)难以通过文字坐标完美传达。
-
OCR-Free (End-to-End): 也就是现在的原生 MLLM(如 GPT-4o, Qwen-VL, LLaVA-NeXT)。直接将图片 encode 为 patch tokens。 * 优势:真正理解语义与视觉的结合(例如:理解红色字体代表“警告”)。 * 劣势:受限于分辨率。如果图片被压缩到 336x336,文字会糊成一团。因此,动态分辨率(AnyRes / Tile-Cropping) 是此类模型刷榜的关键技术。
2.3 代表性基准详解
A. 综合聚合类:OCRBench v2
- 地位:目前的行业标准“体检报告”。
- 构成:它不是单一任务,而是由 29 个数据集聚合而成,涵盖 Text Recognition, Scene Text VQA, Document VQA, KIE, Handwritten 等。
- 评分机制:总分 1000 分。每个子任务权重不同。
- Rule of Thumb:如果 OCRBench 分数 < 400,该模型基本是“文盲”;> 600 为可用;> 800 为 SOTA(GPT-4V 级别)。
B. 场景文字类:TextVQA & ST-VQA
- 场景:自然照片中的文字(招牌、T恤、菜单)。
- 核心难点:OOV (Out of Vocabulary)。很多品牌名、缩写词在 LLM 的词表中不存在,考验模型“按字面拼写”的能力,而不是“脑补”。
- 陷阱:背景干扰极大。例如问“左边那个人衣服上写了什么”,模型必须先定位“左边的人”,再读文字。
C. 文档与表格类:DocVQA
- 场景:扫描文档、表单、信件。
- 核心难点:高分辨率与布局理解。
-
案例:一个两栏排版的报纸。如果模型按从左到右扫描,会将左栏的第一行和右栏的第一行拼在一起,导致语序错乱。模型必须理解“栏”的概念。
-
数据特点:包含大量表格题。表格是 MLLM 的噩梦,因为需要行列对齐的视觉感知。
D. 复杂信息图:InfographicVQA
- 场景:海报、PPT、统计长图。
- 核心难点:文字很少,但逻辑极强。例如一个流程图,箭头指向哪里,代表了因果关系。模型必须读懂“箭头”和“图例”。
- 极高难度:目前许多 SOTA 模型在此基准上只能拿到 40%-50% 的分数,远低于人类水平。
E. 键值对提取 (KIE):SROIE / FUNSD
- 场景:专门针对表单(Form)和收据(Receipt)。
- 任务:不是问答,而是提取。例如
{"Total": "12.50", "Date": "2023-11-11"}。 - 评测关注:JSON 格式的合法性以及 Value 的精确匹配。
2.4 关键评估指标:ANLS 深度解析
ANLS (Average Normalized Levenshtein Similarity) 是 OCR VQA 界的“通用货币”。
(如果 ,则直接归零)
为什么不用 Exact Match (EM)?
- GT: "Coca-Cola"
- Pred: "Coca Cola" (少个连字符)
- EM 得分:0 (太苛刻)
- ANLS 得分: (合理)
为什么不用 BLEU?
- GT: "A12-B34"
- Pred: "B34-A12" (完全错误的序列号)
- BLEU-1 得分:1.0 (因为它只看词的出现,不管顺序,对于短序列号极其危险)
- ANLS 得分:较低(编辑距离大)
3. 本章小结
- 分辨率是生命线:在 DocVQA 中,输入分辨率从 224 提升到 1024,性能提升通常比换一个更大的 LLM 还要显著。
- 场景 vs. 文档:TextVQA 考的是“在复杂背景中找字”,DocVQA 考的是“在密集文字中找逻辑”。
- ANLS 统治一切:做 OCR 相关评测,必须实现 ANLS。
- 架构趋势:目前最强模型普遍采用 High-Res Vision Encoder + LLM 的端到端架构,通过将大图切成多个小图(Tiles)来解决分辨率问题。
4. 练习题
基础题
Q1. (概念辨析) 你有一个包含大量“发票扫描件”的数据集。你首先应该使用哪个 Benchmark 来评估你的模型是否具备处理此类数据的潜力? A. TextVQA B. CIFAR-10 C. SROIE / Cord (DocVQA family) D. RefCOCO
点击查看答案
答案:C. SROIE / Cord
解析:
- SROIE (Scanned Receipts OCR and Information Extraction) 和 Cord 专门针对收据和表单。
- 它们的任务重点是提取 Key-Value(如商家名、总金额),这与发票处理需求完全一致。
- TextVQA 是自然场景(路牌),RefCOCO 是定位物体,均不匹配。
Q2. (指标计算) Ground Truth: 2023
Model A Prediction: 2023 (后面有个空格)
Model B Prediction: 2024
请判断在标准 ANLS 计算逻辑中(通常预处理会 lower case 和 strip),Model A 和 Model B 的得分差异。
点击查看答案
答案:Model A = 1.0, Model B = 0.75
解析:
- 预处理:标准评测脚本通常会
.strip()去除首尾空格。因此 Model A "2023 " 变为 "2023",与 GT 完全一致,得 1.0 分。 - 编辑距离:Model B "2024" 与 "2023" 编辑距离为 1(替换 '4' 为 '3')。
- ANLS:Score = 1 - (1 / max(4, 4)) = 1 - 0.25 = 0.75。 注意:这就是为什么发票识别极度依赖准确率,0.75 分在业务上可能意味着严重的金额错误。
Q3. (数据分布) 为什么在 DocVQA 训练集中,很多问答对的答案就是图像中的原文(Extractive),而在 General VQA(如 VQAv2)中,答案往往是 "Yes/No" 或颜色单词?这对应模型训练有什么启示?
点击查看答案
答案:
- 任务本质:DocVQA 本质上是“视觉指代与复制”。用户问文档问题,通常是想获取文档内的具体信息(日期、条款)。
- 训练启示:这意味着训练 OCR 模型时,模型必须具备强大的 Copy Mechanism(复制机制)。
- 数据配方:在构建 SFT 数据时,不应只放 "Yes/No" 数据,必须大量加入要求模型"逐字抄写"原文的指令,以训练其字符级保真度。
挑战题
Q4. (架构设计 - 动态分辨率) 假设你使用 CLIP-ViT-L/14 (分辨率 224x224) 作为视觉编码器。我们要处理一张 A4 纸扫描件(像素 2480 x 3508),上面全是 10px 大小的密集文字。 请简述:如果你直接 resize 到 224 输入,会发生什么?你会设计怎样的“切片策略(Tiling Strategy)”来解决这个问题?
点击查看答案
答案:
直接 Resize 的后果: 2480 像素压缩到 224,压缩比超过 10倍。10px 的文字会变成 < 1px,完全丢失,变成噪声。模型将彻底无法阅读。
切片策略设计 (参考 LLaVA-NeXT / UReader 方案):
- 网格划分:将原图 2480x3508 切分成多个 224x224 (或 336x336) 的子图(Patches)。例如切成 N 个子图。
- 全局图 (Global View):同时保留一张 resize 到 224 的全图,用于提供宏观布局信息(比如哪里是标题,哪里是页脚)。
- 编码:将 Global Image 和 N 个 Local Crops 分别送入 ViT 编码。
- 拼接:将编码后的 tokens 拼接:
[Global Tokens, Crop_1_Tokens, ..., Crop_N_Tokens]。 - 位置编码:需要特殊的 Embedding 告诉 LLM,Crop_1 是左上角,Crop_2 是右上角,防止空间错乱。
Q5. (对抗性思考 - 幻觉) OCRBench 中有一种隐蔽的错误叫 "OCR Hallucination"。例如给一张只有 "Apple" 单词的图,问“图中的 Banana 多少钱?”,差的模型会回答一个随机数字。 请设计一种评测方法(Metric 或 Protocol)来专门捕捉这种“胡说八道”的 OCR 行为。
点击查看答案
参考方案:POPE-Text (Polling on Object Existence for Text)
-
构造负样本:基于 GT 文本,构造该图中不存在的文本问题。 * 图中有 "Coffee",问 "Does the image contain the word 'Tea'?" * 图中有 "Price: $5",问 "What is the price of the Milk?"
-
指标:计算 Precision (查准率)。 * 如果模型总是倾向于回答(Yes/Specific Value)而不是拒绝(No/Unanswerable),它的 Precision 会极低。
-
惩罚机制:在总分中,对于“不存在的信息”如果模型回答了具体值,给予重罚(例如 -10 分),迫使模型学会说“I don't see it”。
Q6. (工程估算) 使用一个基于 ViT-L (576 tokens per image) + Llama-3-8B 的模型。采用 2x2 的切片策略(1张全图 + 4张切片)处理 DocVQA。 请估算处理一张图片进入 LLM 的视觉 Token 总数是多少?这不仅影响显存,还影响什么?
点击查看答案
答案:
-
Token 计算: * 图像数量 = 1 (Global) + 4 (Crops) = 5 张图。 * 单图 Tokens = 576。 * 总视觉 Tokens = 5 * 576 = 2880 tokens。
-
影响分析: * 显存:KV Cache 会显著增加。 * 延迟 (Latency):对于 LLM,pre-fill 阶段需要处理近 3000 个 token,这会导致首字生成时间 (TTFT) 显著变慢(可能增加几百毫秒到1秒)。 * 上下文窗口:如果 LLM 上下文只有 4k,一张图就占了 70%,多轮对话(Multi-turn)将变得不可能。
5. 常见陷阱与错误 (Gotchas)
5.1 数据集层面的陷阱
- TextVQA 的 "unanswerable":TextVQA 包含很多无法回答的问题,标准答案通常预定义为特定的字符串(如 "unanswerable" 或空)。如果你的模型非常有礼貌地回答 "Sorry, I cannot read the text clearly",虽然人类看着舒服,但评测分数是 0。对策:在 Few-shot prompt 中明确规定无法回答时的输出格式。
- DocVQA 的年份格式:Ground Truth 可能是 "12/10/2023",如果模型输出 "October 12, 2023",ANLS 会扣分。对策:这属于 Dataset Bias,通常无法通过模型解决,需要在评测脚本中加入日期归一化(Date Normalization)逻辑,或者在 Prompt 中强制要求 "extract exactly as appeared"。
5.2 训练/微调层面的陷阱
- Resize 导致的“长条图”失真:
- 场景:小票、网页长截图(宽高比 1:5)。
- 错误:直接 resize 到 正方形。
- 后果:文字被压扁,完全不可读。
-
Rule of Thumb:Never change aspect ratio for OCR tasks. 必须使用 Padding 或者切片。
-
Markdown 格式训练的副作用:
- 最近流行用 Markdown 格式(如 Nougat 数据)微调模型。
- 副作用:模型可能会变得过于 obsessed with formatting,在简单的 VQA 任务中也试图输出表格代码,导致解析失败。需要混合 Plain Text VQA 数据进行中和。
5.3 评测脚本的陷阱
- 多答案匹配 (Multiple GTs):TextVQA 每个问题通常有 10 个由不同人标注的答案(以此来覆盖同义词)。
- 错误做法:只跟第一个答案算 ANLS。
- 正确做法:跟所有 10 个答案算 ANLS,取最高分作为该题得分。如果你的评测脚本写错了,分数会低 5-10 个点。