OmniDocBench是一个针对真实场景下多样性文档解析评测集,具有以下特点:
- 文档类型多样:该评测集涉及981个PDF页面,涵盖9种文档类型、4种排版类型和3种语言类型。覆盖面广,包含学术文献、财报、报纸、教材、手写笔记等;
- 标注信息丰富:包含15个block级别(文本段落、标题、表格等,总量超过20k)和4个Span级别(文本行、行内公式、角标等,总量超过80k)的文档元素的定位信息,以及每个元素区域的识别结果(文本Text标注,公式LaTeX标注,表格包含LaTeX和HTML两种类型的标注)。OmniDocBench还提供了各个文档组件的阅读顺序的标注。除此之外,在页面和block级别还包含多种属性标签,标注了5种页面属性标签、3种文本属性标签和6种表格属性标签。
- 标注质量高:经过人工筛选,智能标注,人工标注及全量专家质检和大模型质检,数据质量较高。
- 配套评测代码:设计端到端评测及单模块评测代码,保证评测的公平性及准确性。
可进行以下几个维度的评测:
- 端到端评测:包括end2end和md2md两种评测方式
- Layout检测
- 表格识别
- 公式识别
- 文本OCR
目前支持的metric包括:
- Normalized Edit Distance
- BLEU
- METEOR
- TEDS
- COCODet (mAP, mAR, etc.)
该评测集涉及981个PDF页面,涵盖9种文档类型、4种排版类型和3种语言类型。OmniDocBench具有丰富的标注,包含15个block级别的标注(文本段落、标题、表格等)和4个Span级别的标注(文本行、行内公式、角标等)。所有文本相关的标注框上都包含文本识别的标注,公式包含LaTeX标注,表格包含LaTeX和HTML两种类型的标注。OmniDocBench还提供了各个文档组件的阅读顺序的标注。除此之外,在页面和block级别还包含多种属性标签,标注了5种页面属性标签、3种文本属性标签和6种表格属性标签。
评测集的数据格式
评测集的数据格式为JSON,其结构和各个字段的解释如下:
[{
"layout_dets": [ // 页面元素列表
{
"category_type": "text_block", // 类别名称
"poly": [
136.0, // 位置信息,分别是左上角、右上角、右下角、左下角的x,y坐标
781.0,
340.0,
781.0,
340.0,
806.0,
136.0,
806.0
],
"ignore": false, // 是否在评测的时候不考虑
"order": 0, // 阅读顺序
"anno_id": 0, // 特殊的标注ID,每个layout框唯一
"text": "xxx", // 可选字段,OCR结果会写在这里
"latex": "$xxx$", // 可选字段,formula和table的LaTeX会写在这里
"html": "xxx", // 可选字段,table的HTML会写在这里
"attribute" {"xxx": "xxx"}, // layout的分类属性,后文会详细展示
"line_with_spans:": [ // span level的标注框
{
"category_type": "text_span",
"poly": [...],
"ignore": false,
"text": "xxx",
"latex": "$xxx$",
},
...
],
"merge_list": [ // 只有包含merge关系的标注框内有这个字段,是否包含merge逻辑取决于是否包含单换行分割小段落,比如列表类型
{
"category_type": "text_block",
"poly": [...],
... // 跟block级别标注的字段一致
"line_with_spans": [...]
...
},
...
]
...
],
"page_info": {
"page_no": 0, // 页码
"height": 1684, // 页面的宽
"width": 1200, // 页面的高
"image_path": "xx/xx/", // 标注的页面文件名称
"page_attribute": {"xxx": "xxx"} // 页面的属性标签
},
"extra": {
"relation": [ // 具有相关关系的标注
{
"source_anno_id": 1,
"target_anno_id": 2,
"relation": "parent_son" // figure/table与其对应的caption/footnote类别的关系标签
},
{
"source_anno_id": 5,
"target_anno_id": 6,
"relation_type": "truncated" // 段落因为排版原因被截断,会标注一个截断关系标签,后续评测的时候会拼接后再作为一整个段落进行评测
},
]
}
},
...
]
验证集类别
验证集类别包括:
# Block级别标注框
'title' # 标题
'text_block' # 段落级别纯文本
'figure', # 图片类
'figure_caption', # 图片说明、标题
'figure_footnote', # 图片注释
'table', # 表格主体
'table_caption', # 表格说明和标题
'table_footnote', # 表格的注释
'equation_isolated', # 行间公式
'equation_caption', # 公式序号
'header' # 页眉
'footer' # 页脚
'page_number' # 页码
'page_footnote' # 页面注释
'abandon', # 其他的舍弃类(比如页面中间的一些无关信息)
'code_txt', # 代码块
'code_txt_caption', # 代码块说明
'reference', # 参考文献类
# Span级别标注框
'text_span' # span级别的纯文本
'equation_ignore', # 需要忽略的公式类
'equation_inline', # 行内公式类
'footnote_mark', #文章的上下角标
验证集属性标签
页面分类属性包括:
'data_source': #PDF类型分类
academic_literature # 学术文献
PPT2PDF # PPT转PDF
book # 黑白的图书和教材
colorful_textbook # 彩色图文教材
exam_paper # 试卷
note # 手写笔记
magazine # 杂志
research_report # 研报、财报
newspaper # 报纸
'language':#语种
en # 英文
simplified_chinese # 简体中文
en_ch_mixed # 中英混合
'layout': #页面布局类型
single_column # 单栏
double_column # 双栏
three_column # 三栏
1andmore_column # 一混多,常见于文献
other_layout # 其他
'watermark': # 是否包含水印
true
false
'fuzzy_scan': # 是否模糊扫描
true
false
'colorful_backgroud': # 是否包含彩色背景,需要参与识别的内容的底色包含两个以上
true
false
标注框级别属性-表格相关属性:
'table_layout': # 表格的方向
vertical #竖版表格
horizontal #横版表格
'with_span': # 合并单元格
False
True
'line':# 表格的线框
full_line # 全线框
less_line # 漏线框
fewer_line # 三线框
wireless_line # 无线框
'language': #表格的语种
table_en # 英文表格
table_simplified_chinese #中文简体表格
table_en_ch_mixed #中英混合表格
'include_equation': # 表格是否包含公式
False
True
'include_backgroud': # 表格是否包含底色
False
True
'table_vertical' # 表格是否旋转90度或270度
False
True
标注框级别属性-文本段落相关属性:
'text_language': # 文本的段落内语种
text_en # 英文
text_simplified_chinese #简体中文
text_en_ch_mixed #中英混合
'text_background': #文本的背景色
white # 默认值,白色背景
single_colored # 除白色外的单背景色
multi_colored # 混合背景色
'text_rotate': # 文本的段落内文字旋转分类
normal # 默认值,横向文本,没有旋转
rotate90 # 旋转角度,顺时针旋转90度
rotate180 # 顺时针旋转180度
rotate270 # 顺时针旋转270度
horizontal # 文字是正常的,排版是竖型文本
标注框级别属性-公式相关属性:
'formula_type': #公式类型
print # 打印体
handwriting # 手写体
OmniDocBench开发了一套基于文档组件拆分和匹配的评测方法,对文本、表格、公式、阅读顺序这四大模块分别提供了对应的指标计算,评测结果除了整体的精度结果以外,还提供了分页面以及分属性的精细化评测结果,精准定位模型文档解析的痛点问题。
环境配置只需要在该项目目录下运行以下命令即可:
conda create -n omnidocbench python=3.8
conda activate omnidocbench
pip install -r requirements.txt
所有的评测的输入都是通过config文件进行配置的,我们在configs路径下提供了各个任务的模板,并且在接下来的小节也会对config文件的内容做详细讲解。
配置好config文件后,只需要将config文件作为参数传入,运行以下代码即可进行评测:
python pdf_validation.py --config <config_path>
端到端评测是对模型在PDF页面内容解析上的精度作出的评测。以模型输出的对整个PDF页面解析结果的Markdown作为Prediction。
Method Type | Methods | TextEdit↓ | FormulaEdit↓ | FormulaCDM↑ | TableTEDS↑ | TableEdit↓ | Read OrderEdit↓ | OverallEdit↓ | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
EN | ZH | EN | ZH | EN | ZH | EN | ZH | EN | ZH | EN | ZH | EN | ZH | ||
Pipeline Tools | MinerU-0.9.3 | 0.058 | 0.211 | 0.278 | 0.577 | 66.9 | 49.5 | 79.4 | 62.7 | 0.305 | 0.461 | 0.079 | 0.288 | 0.180 | 0.384 |
Marker-0.2.17 | 0.141 | 0.303 | 0.667 | 0.868 | 18.4 | 12.7 | 54.0 | 45.8 | 0.718 | 0.763 | 0.138 | 0.306 | 0.416 | 0.560 | |
Mathpix | 0.101 | 0.358 | 0.306 | 0.454 | 71.4 | 72.7 | 77.9 | 68.2 | 0.322 | 0.416 | 0.105 | 0.275 | 0.209 | 0.376 | |
Expert VLMs | GOT-OCR | 0.187 | 0.315 | 0.360 | 0.528 | 81.8 | 51.4 | 53.5 | 48.0 | 0.521 | 0.594 | 0.141 | 0.28 | 0.302 | 0.429 |
Nougat | 0.365 | 0.998 | 0.488 | 0.941 | 17.4 | 16.9 | 40.3 | 0.0 | 0.622 | 1.000 | 0.382 | 0.954 | 0.464 | 0.973 | |
General VLMs | GPT4o | 0.144 | 0.409 | 0.425 | 0.606 | 76.4 | 48.2 | 72.75 | 63.7 | 0.363 | 0.474 | 0.128 | 0.251 | 0.265 | 0.435 |
Qwen2-VL-72B | 0.252 | 0.251 | 0.468 | 0.572 | 54.9 | 60.9 | 59.9 | 66.8 | 0.591 | 0.587 | 0.255 | 0.223 | 0.392 | 0.408 | |
InternVL2-Llama3-76B | 0.353 | 0.290 | 0.543 | 0.701 | 69.8 | 49.6 | 63.8 | 61.1 | 0.616 | 0.638 | 0.317 | 0.228 | 0.457 | 0.464 |
更多分属性评测结果在论文中展示。
端到端评测分为两种方式:
end2end
: 该方法是用OmniDocBench的JSON文件作为Ground Truth, config文件请参考:end2endmd2md
: 该方法是用OmniDocBench的markdown格式作为Ground Truth。具体内容将在下一小节markdown-to-markdown评测中详述。
我们推荐使用end2end
的评测方式,因为该方式可以保留sample的类别和属性信息,从而帮助进行特殊类别ignore的操作,以及分属性的结果输出。
end2end
的评测可以对四个维度进行评测,我们提供了一个end2end的评测结果示例在result中,包括:
- 文本段落
- 行间公式
- 表格
- 阅读顺序
end2end.yaml的字段解释
end2end.yaml
的配置如下:
end2end_eval: # 指定task名称,端到端评测通用该task
metrics: # 配置需要使用的metric
text_block: # 针对文本段落的配置
metric:
- Edit_dist # Normalized Edit Distance
- BLEU
- METEOR
display_formula: # 针对行间公式的配置
metric:
- Edit_dist
- CDM # 仅支持导出CDM评测所需的格式,存储在results中
table: # 针对表格的配置
metric:
- TEDS
- Edit_dist
reading_order: # 针对阅读顺序的配置
metric:
- Edit_dist
dataset: # 数据集配置
dataset_name: end2end_dataset # 数据集名称,无需修改
ground_truth:
data_path: ./demo_data/omnidocbench_demo/OmniDocBench_demo.json # OmniDocBench的路径
prediction:
data_path: ./demo_data/end2end # 模型对PDF页面解析markdown结果的文件夹路径
match_method: quick_match # 匹配方式,可选有: no_split/no_split/quick_match
filter: # 页面级别的筛选
language: english # 需要评测的页面属性以及对应标签
prediction
下的data_path
输入的是模型对PDF页面解析结果的文件夹路径,路径中保存的是每个页面对应的markdown,文件名与图片名保持一致,仅将.jpg后缀替换成.md。
除了已支持的metric以外,还支持导出CDM评测所需的格式,只需要在metric中配置CDM字段,即可将输出整理为CDM的输入格式,并存储在result中。
在端到端的评测中,config里可以选择配置不同的匹配方式,一共有三种匹配方式:
no_split
: 不对text block做拆分和匹配的操作,而是直接合并成一整个markdown进行计算,这种方式下,将不会输出分属性的结果,也不会输出阅读顺序的结果;simple_match
: 不进行任何截断合并操作,仅对文本做双换行的段落分割后,直接与GT进行一对一匹配;quick_match
:在段落分割的基础上,加上截断合并的操作,减少段落分割差异对最终结果的影响,通过Adjacency Search Match的方式进行截断合并;
我们推荐使用quick_match
的方式以达到较好的匹配效果,但如果模型输出的段落分割较准确,也可以使用simple_match
的方式,评测运行会更加迅速。匹配方法通过config
中的dataset
字段下的match_method
字段进行配置。
使用filter
字段可以对数据集进行筛选,比如将dataset
下设置filter
字段为language: english
,将会仅评测页面语言为英文的页面。更多页面属性请参考评测集介绍部分。如果希望全量评测,请注释掉filter
相关字段。
markdown-to-markdown评测以模型输出的对整个PDF页面解析结果的Markdown作为Prediction,用OmniDocBench的markdown格式作为Ground Truth。config文件请参考:md2md。我们更加推荐使用上一节的end2end
的方式使用OmniDocBench进行评测,从而保留丰富的属性标注以及ignore逻辑。但是我们依然提供了md2md
的评测方法,以便于与现有的评测方式对齐。
md2md
的评测可以对三个维度进行评测,包括:
- 文本段落
- 行间公式
- 表格
- 阅读顺序
md2md.yaml的字段解释
md2md.yaml
的配置如下:
end2end_eval: # 指定task名称,端到端评测通用该task
metrics: # 配置需要使用的metric
text_block: # 针对文本段落的配置
metric:
- Edit_dist # Normalized Edit Distance
- BLEU
- METEOR
display_formula: # 针对行间公式的配置
metric:
- Edit_dist
- CDM # 仅支持导出CDM评测所需的格式,存储在results中
table: # 针对表格的配置
metric:
- TEDS
- Edit_dist
reading_order: # 针对阅读顺序的配置
metric:
- Edit_dist
dataset: # 数据集配置
dataset_name: md2md_dataset # 数据集名称,无需修改
ground_truth: # 针对ground truth的数据集配置
data_path: ./demo_data/omnidocbench_demo/mds # OmniDocBench的markdown文件夹路径
page_info: ./demo_data/omnidocbench_demo/OmniDocBench_demo.json # OmniDocBench的JSON文件路径,主要是用于获取页面级别的属性
prediction: # 针对模型预测结果的配置
data_path: ./demo_data/end2end # 模型对PDF页面解析markdown结果的文件夹路径
match_method: quick_match # 匹配方式,可选有: no_split/no_split/quick_match
filter: # 页面级别的筛选
language: english # 需要评测的页面属性以及对应标签
prediction
下的data_path
输入的是模型对PDF页面解析结果的文件夹路径,路径中保存的是每个页面对应的markdown,文件名与图片名保持一致,仅将.jpg
后缀替换成.md
。
ground_truth
下的data_path
输入的是OmniDocBench的markdown文件夹路径,与模型对PDF页面解析结果的markdown文件名一一对应。ground_truth
下的page_info
路径输入的是OmniDocBench的JSON文件路径,主要是用于获取页面级别的属性。如果不需要页面级别分属性的评测结果输出,也可以直接将该字段注释掉。但是,如果没有配置ground_truth
下的page_info
字段,就无法使用filter
相关功能。
除此之外的config中字段的解释请参考端到端评测-end2end小节。
OmniDocBench包含每个PDF页面的公式的bounding box信息以及对应的公式识别标注,因此可以作为公式识别评测的benchmark。公式包括行间公式equation_isolated
和行内公式equation_inline
,本repo目前提供的例子是行间公式的评测。
Models | CDM | ExpRate@CDM | BLEU | Norm Edit |
---|---|---|---|---|
GOT-OCR | 74.1 | 28.0 | 55.07 | 0.290 |
Mathpix | 86.6 | 2.8 | 66.56 | 0.322 |
Pix2Tex | 73.9 | 39.5 | 46.00 | 0.337 |
UniMERNet-B | 85.0 | 60.2 | 60.84 | 0.238 |
GPT4o | 86.8 | 65.5 | 45.17 | 0.282 |
InternVL2-Llama3-76B | 67.4 | 54.5 | 47.63 | 0.308 |
Qwen2-VL-72B | 83.8 | 55.4 | 53.71 | 0.285 |
Component-level formula recognition evaluation on OmniDocBench formula subset.
公式识别评测可以参考formula_recognition进行配置。
formula_recognition.yaml的字段解释
formula_recognition.yaml
的配置文件如下:
recogition_eval: # 指定task名称,所有的识别相关的任务通用此task
metrics: # 配置需要使用的metric
- Edit_dist # Normalized Edit Distance
- CDM # 仅支持导出CDM评测所需的格式,存储在results中
dataset: # 数据集配置
dataset_name: omnidocbench_single_module_dataset # 数据集名称,如果按照规定的输入格式则不需要修改
ground_truth: # 针对ground truth的数据集配置
data_path: ./demo_data/recognition/OmniDocBench_demo_formula.json # 同时包含ground truth和模型prediction结果的JSON文件
data_key: latex # 存储Ground Truth的字段名,对于OmniDocBench来说,公式的识别结果存储在latex这个字段中
category_filter: ['equation_isolated'] # 用于评测的类别,在公式识别中,评测的category_name是equation_isolated
prediction: # 针对模型预测结果的配置
data_key: pred # 存储模型预测结果的字段名,这个是用户自定义的
category_type: formula # category_type主要是用于数据预处理策略的选择,可选项有:formula/text
metrics
部分,除了已支持的metric以外,还支持导出CDM评测所需的格式,只需要在metric中配置CDM字段,即可将输出整理为CDM的输入格式,并存储在result中。
dataset
的部分,输入的ground_truth
的data_path
中的数据格式与OmniDocBench保持一致,仅对应的公式sample下新增一个自定义字段保存模型的prediction结果。通过dataset
下的prediction
字段下的data_key
对存储了prediction信息的字段进行指定,比如pred
。关于更多OmniDocBench的文件结构细节请参考评测集介绍
小节。模型结果的输入格式可以参考OmniDocBench_demo_formula,其格式为:
[{
"layout_dets": [ // 页面元素列表
{
"category_type": "equation_isolated", // OmniDocBench类别名称
"poly": [ // OmniDocBench位置信息,分别是左上角、右上角、右下角、左下角的x,y坐标
136.0,
781.0,
340.0,
781.0,
340.0,
806.0,
136.0,
806.0
],
... // 其他OmniDocBench字段
"latex": "$xxx$", // formula的LaTeX会写在这里
"pred": "$xxx$", // !! 模型的prediction结果存储在这里,由用户自定义一个新增字段,存储在与ground truth同级
...
],
"page_info": {...}, // OmniDocBench页面信息
"extra": {...} // OmniDocBench标注间关系信息
},
...
]
在此提供一个模型infer的脚本供参考:
import os
import json
from PIL import Image
def poly2bbox(poly):
L = poly[0]
U = poly[1]
R = poly[2]
D = poly[5]
L, R = min(L, R), max(L, R)
U, D = min(U, D), max(U, D)
bbox = [L, U, R, D]
return bbox
question = "<image>\nPlease convert this cropped image directly into latex."
with open('./demo_data/omnidocbench_demo/OmniDocBench_demo.json', 'r') as f:
samples = json.load(f)
for sample in samples:
img_name = os.path.basename(sample['page_info']['image_path'])
img_path = os.path.join('./Docparse/images', img_name)
img = Image.open(img_path)
if not os.path.exists(img_path):
print('No exist: ', img_name)
continue
for i, anno in enumerate(sample['layout_dets']):
if anno['category_type'] != 'equation_isolated': # 筛选出行间公式类别进行评测
continue
bbox = poly2bbox(anno['poly'])
im = img.crop(bbox).convert('RGB')
response = model.chat(im, question) # 需要根据模型修改传入图片的方式
anno['pred'] = response # 直接在对应的annotation下新增字段存储模型的infer结果
with open('./demo_data/recognition/OmniDocBench_demo_formula.json', 'w', encoding='utf-8') as f:
json.dump(samples, f, ensure_ascii=False)
OmniDocBench包含每个PDF页面的所有文字的bounding box信息以及对应的文字识别标注,因此可以作为OCR评测的benchmark。文本的标注包含block_level的标注和span_level的标注,都可以用于评测。本repo目前提供的例子是block_level的评测,即文本段落级别的OCR评测。
Model Type | Model | Language | Text background | Text Rotate | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
EN | ZH | Mixed | White | Single | Multi | Normal | Rotate90 | Rotate270 | Horizontal | ||
Expert Vision Models | PaddleOCR | 0.071 | 0.055 | 0.118 | 0.060 | 0.038 | 0.0848 | 0.060 | 0.015 | 0.285 | 0.021 |
Tesseract OCR | 0.179 | 0.553 | 0.553 | 0.453 | 0.463 | 0.394 | 0.448 | 0.369 | 0.979 | 0.982 | |
Surya | 0.057 | 0.123 | 0.164 | 0.093 | 0.186 | 0.235 | 0.104 | 0.634 | 0.767 | 0.255 | |
GOT-OCR | 0.041 | 0.112 | 0.135 | 0.092 | 0.052 | 0.155 | 0.091 | 0.562 | 0.966 | 0.097 | |
Mathpix | 0.033 | 0.240 | 0.261 | 0.185 | 0.121 | 0.166 | 0.180 | 0.038 | 0.185 | 0.638 | |
Vision Language Models | Qwen2-VL-72B | 0.072 | 0.274 | 0.286 | 0.234 | 0.155 | 0.148 | 0.223 | 0.273 | 0.721 | 0.067 |
InternVL2-Llama3-76B | 0.074 | 0.155 | 0.242 | 0.113 | 0.352 | 0.269 | 0.132 | 0.610 | 0.907 | 0.595 | |
GPT4o | 0.020 | 0.224 | 0.125 | 0.167 | 0.140 | 0.220 | 0.168 | 0.115 | 0.718 | 0.132 |
文字OCR评测可以参考ocr进行配置。
ocr.yaml的字段解释
ocr.yaml
的配置文件如下:
recogition_eval: # 指定task名称,所有的识别相关的任务通用此task
metrics: # 配置需要使用的metric
- Edit_dist # Normalized Edit Distance
- BLEU
- METEOR
dataset: # 数据集配置
dataset_name: omnidocbench_single_module_dataset # 数据集名称,如果按照规定的输入格式则不需要修改
ground_truth: # 针对ground truth的数据集配置
data_path: ./demo_data/recognition/OmniDocBench_demo_text_ocr.json # 同时包含ground truth和模型prediction结果的JSON文件
data_key: text # 存储Ground Truth的字段名,对于OmniDocBench来说,文本识别结果存储在text这个字段中,所有block level只要包含text字段的annotations都会参与评测
prediction: # 针对模型预测结果的配置
data_key: pred # 存储模型预测结果的字段名,这个是用户自定义的
category_type: text # category_type主要是用于数据预处理策略的选择,可选项有:formula/text
dataset
的部分,输入的ground_truth
的data_path
中的数据格式与OmniDocBench保持一致,仅对应的含有text字段的sample下新增一个自定义字段保存模型的prediction结果。通过dataset
下的prediction
字段下的data_key
对存储了prediction信息的字段进行指定,比如pred
。数据集的输入格式可以参考OmniDocBench_demo_text_ocr,各个字段含义可以参考公式识别评测部分提供的样例。
在此提供一个模型infer的脚本供参考:
import os
import json
from PIL import Image
def poly2bbox(poly):
L = poly[0]
U = poly[1]
R = poly[2]
D = poly[5]
L, R = min(L, R), max(L, R)
U, D = min(U, D), max(U, D)
bbox = [L, U, R, D]
return bbox
question = "<image>\nPlease convert this cropped image directly into latex."
with open('./demo_data/omnidocbench_demo/OmniDocBench_demo.json', 'r') as f:
samples = json.load(f)
for sample in samples:
img_name = os.path.basename(sample['page_info']['image_path'])
img_path = os.path.join('./Docparse/images', img_name)
img = Image.open(img_path)
if not os.path.exists(img_path):
print('No exist: ', img_name)
continue
for i, anno in enumerate(sample['layout_dets']):
if not anno.get('text'): # 筛选出OmniDocBench中包含text字段的annotations进行模型infer
continue
bbox = poly2bbox(anno['poly'])
im = img.crop(bbox).convert('RGB')
response = model.chat(im, question) # 需要根据模型修改传入图片的方式
anno['pred'] = response # 直接在对应的annotation下新增字段存储模型的infer结果
with open('./demo_data/recognition/OmniDocBench_demo_text_ocr.json', 'w', encoding='utf-8') as f:
json.dump(samples, f, ensure_ascii=False)
OmniDocBench包含每个PDF页面的公式的bounding box信息以及对应的表格识别标注,因此可以作为表格识别评测的benchmark。表格识别的标注包含HTML和LaTex两种格式,本repo目前提供的例子是HTML格式的评测。
Model Type | Model | Language | Table Frame Type | Special Situation | Overall | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
EN | ZH | Mixed | Full | Omission | Three | Zero | Merge Cell(+/-) | Formula(+/-) | Colorful(+/-) | Rotate(+/-) | |||
OCR-based Models | PaddleOCR | 76.8 | 71.8 | 80.1 | 67.9 | 74.3 | 81.1 | 74.5 | 70.6/75.2 | 71.3/74.1 | 72.7/74.0 | 23.3/74.6 | 73.6 |
RapidTable | 80.0 | 83.2 | 91.2 | 83.0 | 79.7 | 83.4 | 78.4 | 77.1/85.4 | 76.7/83.9 | 77.6/84.9 | 25.2/83.7 | 82.5 | |
Expert VLMs | StructEqTable | 72.0 | 72.6 | 81.7 | 68.8 | 64.3 | 80.7 | 85.0 | 65.1/76.8 | 69.4/73.5 | 66.8/75.7 | 44.1/73.3 | 72.7 |
GOT-OCR | 72.2 | 75.5 | 85.4 | 73.1 | 72.7 | 78.2 | 75.7 | 65.0/80.2 | 64.3/77.3 | 70.8/76.9 | 8.5/76.3 | 74.9 | |
General VLMs | Qwen2-VL-7B | 70.2 | 70.7 | 82.4 | 70.2 | 62.8 | 74.5 | 80.3 | 60.8/76.5 | 63.8/72.6 | 71.4/70.8 | 20.0/72.1 | 71.0 |
InternVL2-8B | 70.9 | 71.5 | 77.4 | 69.5 | 69.2 | 74.8 | 75.8 | 58.7/78.4 | 62.4/73.6 | 68.2/73.1 | 20.4/72.6 | 71.5 |
Component-level Table Recognition evaluation on OmniDocBench table subset. (+/-) means with/without special situation.
表格识别评测可以参考table_recognition进行配置。
对于模型预测为LaTex格式的表格, 会使用latexml工具将latex转为html 再进行评测. 评测代码会自动进行格式转换,需要用户预先安装latexml
table_recognition.yaml的字段解释
table_recognition.yaml
的配置文件如下:
recogition_eval: # 指定task名称,所有的识别相关的任务通用此task
metrics: # 配置需要使用的metric
- TEDS # Tree Edit Distance based Similarity
- Edit_dist # Normalized Edit Distance
dataset: # 数据集配置
dataset_name: omnidocbench_single_module_dataset # 数据集名称,如果按照规定的输入格式则不需要修改
ground_truth: # 针对ground truth的数据集配置
data_path: ./demo_data/recognition/OmniDocBench_demo_table.json # 同时包含ground truth和模型prediction结果的JSON文件
data_key: html # 存储Ground Truth的字段名,对于OmniDocBench来说,表格的识别结果存储在html和latex两个字段中, 评测latex格式表格时改为latex
category_filter: table # 用于评测的类别,在表格识别中,评测的category_name是table
prediction: # 针对模型预测结果的配置
data_key: pred # 存储模型预测结果的字段名,这个是用户自定义的
category_type: table # category_type主要是用于数据预处理策略的选择
dataset
的部分,输入的ground_truth
的data_path
中的数据格式与OmniDocBench保持一致,仅对应的表格sample下新增一个自定义字段保存模型的prediction结果。通过dataset
下的prediction
字段下的data_key
对存储了prediction信息的字段进行指定,比如pred
。关于更多OmniDocBench的文件结构细节请参考评测集介绍
小节。模型结果的输入格式可以参考OmniDocBench_demo_table,其格式为:
[{
"layout_dets": [ // 页面元素列表
{
"category_type": "table", // OmniDocBench类别名称
"poly": [ // OmniDocBench位置信息,分别是左上角、右上角、右下角、左下角的x,y坐标
136.0,
781.0,
340.0,
781.0,
340.0,
806.0,
136.0,
806.0
],
... // 其他OmniDocBench字段
"latex": "$xxx$", // table的LaTeX标注会写在这里
"html": "$xxx$", // table的HTML标注会写在这里
"pred": "$xxx$", // !! 模型的prediction结果存储在这里,由用户自定义一个新增字段,存储在与ground truth同级
...
],
"page_info": {...}, // OmniDocBench页面信息
"extra": {...} // OmniDocBench标注间关系信息
},
...
]
在此提供一个模型infer的脚本供参考:
import os
import json
from PIL import Image
def poly2bbox(poly):
L = poly[0]
U = poly[1]
R = poly[2]
D = poly[5]
L, R = min(L, R), max(L, R)
U, D = min(U, D), max(U, D)
bbox = [L, U, R, D]
return bbox
question = "<image>\nPlease convert this cropped image directly into html format of table."
with open('./demo_data/omnidocbench_demo/OmniDocBench_demo.json', 'r') as f:
samples = json.load(f)
for sample in samples:
img_name = os.path.basename(sample['page_info']['image_path'])
img_path = os.path.join('./demo_data/omnidocbench_demo/images', img_name)
img = Image.open(img_path)
if not os.path.exists(img_path):
print('No exist: ', img_name)
continue
for i, anno in enumerate(sample['layout_dets']):
if anno['category_type'] != 'table': # 筛选出表格类别进行评测
continue
bbox = poly2bbox(anno['poly'])
im = img.crop(bbox).convert('RGB')
response = model.chat(im, question) # 需要根据模型修改传入图片的方式
anno['pred'] = response # 直接在对应的annotation下新增字段存储模型的infer结果
with open('./demo_data/recognition/OmniDocBench_demo_table.json', 'w', encoding='utf-8') as f:
json.dump(samples, f, ensure_ascii=False)
OmniDocBench包含每个PDF页面的所有文档组件的bounding box信息,因此可以作为Layout检测任务评测的benchmark。
Model | Book | Slides | Research Report | Textbook | Exam Paper | Magazine | Academic Literature | Notes | Newspaper | Average mAP |
---|---|---|---|---|---|---|---|---|---|---|
DiT-L | 43.44 | 13.72 | 45.85 | 15.45 | 3.40 | 29.23 | 66.13 | 0.21 | 23.65 | 26.90 |
LayoutLMv3 | 42.12 | 13.63 | 43.22 | 21.00 | 5.48 | 31.81 | 64.66 | 0.80 | 30.84 | 28.84 |
DOCX-Chain | 30.86 | 11.71 | 39.62 | 19.23 | 10.67 | 23.00 | 41.60 | 1.80 | 16.96 | 21.27 |
DocLayout-YOLO | 43.71 | 48.71 | 72.83 | 42.67 | 35.40 | 51.44 | 66.84 | 9.54 | 57.54 | 48.71 |
Layout检测config文件参考layout_detection,数据格式参考detection_prediction。
layout_detection.yaml的字段解释
以下我们以精简格式为例进行展示。layout_detection.yaml
的配置文件如下:
detection_eval: # 指定task名称,所有的检测相关的任务通用此task
metrics:
- COCODet # 检测任务相关指标,主要是mAP, mAR等
dataset:
dataset_name: detection_dataset_simple_format # 数据集名称,如果按照规定的输入格式则不需要修改
ground_truth:
data_path: ./demo_data/omnidocbench_demo/OmniDocBench_demo.json # OmniDocBench的JSON文件路径
prediction:
data_path: ./demo_data/detection/detection_prediction.json # 模型预测结果JSON文件路径
filter: # 页面级别的筛选
data_source: exam_paper # 需要评测的页面属性以及对应标签
categories:
eval_cat: # 参与最终评测的类别
block_level: # block级别的类别,详细类别信息请参考OmniDocBench的评测集介绍部分
- title # Title
- text # Text
- abandon # Includes headers, footers, page numbers, and page annotations
- figure # Image
- figure_caption # Image caption
- table # Table
- table_caption # Table caption
- table_footnote # Table footnote
- isolate_formula # Display formula (this is a layout display formula, lower priority than 14)
- formula_caption # Display formula label
gt_cat_mapping: # ground truth到最终评测类别的映射表,key是ground truth类别,value是最终评测类别名称
figure_footnote: figure_footnote
figure_caption: figure_caption
page_number: abandon
header: abandon
page_footnote: abandon
table_footnote: table_footnote
code_txt: figure
equation_caption: formula_caption
equation_isolated: isolate_formula
table: table
refernece: text
table_caption: table_caption
figure: figure
title: title
text_block: text
footer: abandon
pred_cat_mapping: # prediction到最终评测类别的映射表,key是prediction类别,value是最终评测类别名称
title : title
plain text: text
abandon: abandon
figure: figure
figure_caption: figure_caption
table: table
table_caption: table_caption
table_footnote: table_footnote
isolate_formula: isolate_formula
formula_caption: formula_caption
使用filter字段可以对数据集进行筛选,比如将dataset
下设置filter
字段为data_source: exam_paper
即筛选数据类型为exam_paper的页面。更多页面属性请参考“评测集介绍”部分。如果希望全量评测,请注释掉filter
相关字段。
dataset
部分prediction
的data_path
中传入的是模型的prediction,其数据格式为:
{
"results": [
{
"image_name": "docstructbench_llm-raw-scihub-o.O-adsc.201190003.pdf_6", // 图片名
"bbox": [53.892921447753906, 909.8675537109375, 808.5555419921875, 1006.2714233398438], // bounding box信息,分别是左上角和右下角的x,y坐标
"category_id": 1, // 类别序号名称
"score": 0.9446213841438293 // 置信度
},
... // 所有的bounding box都直接平铺在一个list内部
],
"categories": {"0": "title", "1": "plain text", "2": "abandon", ...} // 每个类别序号所对应的类别名称
OmniDocBench包含每个PDF页面的公式的bounding box信息,因此可以作为Layout检测任务评测的benchmark。
公式检测与Layout检测的格式基本一致。公式包含行内公式和行间公式。在本节提供一个config样例,可以同时评测行间公式和行内公式的检测结果。公式检测可以参考formula_detection进行配置。
formula_detection.yaml的字段解释
formula_detection.yaml
的配置文件如下:
detection_eval: # 指定task名称,所有的检测相关的任务通用此task
metrics:
- COCODet # 检测任务相关指标,主要是mAP, mAR等
dataset:
dataset_name: detection_dataset_simple_format # 数据集名称,如果按照规定的输入格式则不需要修改
ground_truth:
data_path: ./demo_data/omnidocbench_demo/OmniDocBench_demo.json # OmniDocBench的JSON文件路径
prediction:
data_path: ./demo_data/detection/detection_prediction.json # 模型预测结果JSON文件路径
filter: # 页面级别的筛选
data_source: exam_paper # 需要评测的页面属性以及对应标签
categories:
eval_cat: # 参与最终评测的类别
block_level: # block级别的类别,详细类别信息请参考OmniDocBench的评测集介绍部分
- isolate_formula # 行间公式
span_level: # span级别的类别,详细类别信息请参考OmniDocBench的评测集介绍部分
- inline_formula # 行内公式
gt_cat_mapping: # ground truth到最终评测类别的映射表,key是ground truth类别,value是最终评测类别名称
equation_isolated: isolate_formula
equation_inline: inline_formula
pred_cat_mapping: # prediction到最终评测类别的映射表,key是prediction类别,value是最终评测类别名称
interline_formula: isolate_formula
inline_formula: inline_formula
config中参数解释以及数据集格式请参考Layout检测
小节,公式检测与Layout检测小节的主要区别是,在参与最终评测的类别eval_cat
下新增了span_level
的类别inline_formula
,span_level的类别和block_level级别的类别在评测的时候将会共同参与评测。
我们在tools
目录下提供了一些工具:
- json2md 用于将JSON格式的OmniDocBench转换为Markdown格式;
- visualization 用于可视化OmniDocBench的JSON文件;
- model_infer文件夹下提供了一些模型推理的脚本供参考,包括:
- mathpix_img2md.py 用于调用mathpix的API将图片转换为Markdown格式;
- internvl2_test_img2md.py 用于调用InternVL2模型将图片转换为Markdown格式,请在配置了InternVL2模型环境后使用;
- GOT_img2md.py 用于调用GOT-OCR模型将图片转换为Markdown格式,请在配置了GOT-OCR模型环境后使用;
- Qwen2VL_img2md.py 用于调用QwenVL模型将图片转换为Markdown格式,请在配置了QwenVL模型环境后使用;
- 匹配算法
match_full
接入 - 针对模型特定输出格式进行匹配后处理优化
- 增加特殊字符的Unicode映射表
- 部分模型偶尔会出现输出格式不规范(比如将多栏文本识别为表格,将公式识别为Unicode文本),导致匹配失败的情况,可以针对模型输出格式进行后处理优化
- 由于各种模型对符号的识别能力不同,导致部分符号的识别结果不一致(比如列表的标识符等),目前的文本评测中仅保留中英文本参与评测,后续将增加Unicode映射表来优化
欢迎大家使用OmniDocBench数据集,并提出宝贵的意见和建议,帮助我们不断优化数据集质量和评测工具。有任何意见和建议,欢迎提issue,我们将在第一时间响应。如有评测方案优化可以提PR,我们也将及时review和更新。
PDF来源从网络公开渠道收集以及社群用户贡献,已剔除了不允许分发的内容,只用作科研,不作为商业用途。若有侵权请联系[email protected]。
@misc{ouyang2024omnidocbenchbenchmarkingdiversepdf,
title={OmniDocBench: Benchmarking Diverse PDF Document Parsing with Comprehensive Annotations},
author={Linke Ouyang and Yuan Qu and Hongbin Zhou and Jiawei Zhu and Rui Zhang and Qunshu Lin and Bin Wang and Zhiyuan Zhao and Man Jiang and Xiaomeng Zhao and Jin Shi and Fan Wu and Pei Chu and Minghao Liu and Zhenxiang Li and Chao Xu and Bo Zhang and Botian Shi and Zhongying Tu and Conghui He},
year={2024},
eprint={2412.07626},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2412.07626},
}