```
### 端到端评测
端到端评测是对模型在PDF页面内容解析上的精度作出的评测。以模型输出的对整个PDF页面解析结果的Markdown作为Prediction。Overall指标的计算方式为:
$$\text{Overall} = \frac{(1-\textit{Text Edit Distance}) \times 100 + \textit{Table TEDS} +\textit{Formula CDM}}{3}$$
Comprehensive evaluation of document parsing on OmniDocBench (v1.5)
| Model Type |
Methods |
Size |
Overall↑ |
TextEdit↓ |
FormulaCDM↑ |
TableTEDS↑ |
TableTEDS-S↑ |
Read OrderEdit↓ |
Specialized VLMs |
| PaddleOCR-VL-1.5 |
0.9B |
94.50 |
0.035 |
94.21 |
92.76 |
95.79 |
0.042 |
| GLM-OCR |
0.9B |
94.35 |
0.045 |
93.65 |
93.89 |
96.50 |
0.047 |
| Youtu-Parsing |
2.5B |
93.37 |
0.042 |
91.22 |
93.10 |
96.47 |
0.026 |
| PaddleOCR-VL |
0.9B |
92.86 |
0.035 |
91.22 |
90.89 |
94.76 |
0.043 |
| Logics-Parsing-v2 |
4B |
92.56 |
0.043 |
91.41 |
90.54 |
93.85 |
0.044 |
| FireRed-OCR |
2B |
92.07 |
0.035 |
90.98 |
88.72 |
92.38 |
0.041 |
| MinerU2.5 |
1.2B |
90.93 |
0.045 |
88.86 |
88.44 |
92.42 |
0.044 |
| HunyuanOCR |
1B |
90.57 |
0.085 |
86.01 |
94.19 |
95.96 |
0.082 |
| OpenDoc |
0.1B |
90.57 |
0.043 |
87.70 |
88.30 |
92.24 |
0.050 |
| FD-RL |
4B |
90.20 |
0.053 |
88.52 |
87.43 |
92.19 |
0.063 |
| DeepSeek-OCR-2 |
3B |
89.17 |
0.049 |
86.85 |
85.60 |
90.06 |
0.060 |
| MonkeyOCR-pro-3B |
3B |
88.85 |
0.075 |
87.25 |
86.78 |
90.63 |
0.128 |
| Dolphin-v2 |
3B |
88.71 |
0.073 |
87.26 |
86.20 |
89.77 |
0.064 |
| OCRVerse |
4B |
88.55 |
0.058 |
86.91 |
84.55 |
88.45 |
0.071 |
| dots.ocr |
3B |
88.41 |
0.048 |
83.22 |
86.78 |
90.62 |
0.053 |
| MonkeyOCR-3B |
3B |
87.13 |
0.075 |
87.45 |
81.39 |
85.92 |
0.129 |
| Deepseek-OCR |
3B |
87.01 |
0.073 |
83.37 |
84.97 |
88.80 |
0.086 |
| MonkeyOCR-pro-1.2B |
1.2B |
86.96 |
0.084 |
85.02 |
84.24 |
89.02 |
0.130 |
| Nanonets-OCR-s |
3B |
85.59 |
0.093 |
85.90 |
80.14 |
85.57 |
0.108 |
| MinerU2-VLM |
0.9B |
85.56 |
0.078 |
80.95 |
83.54 |
87.66 |
0.086 |
| Dolphin-1.5 |
0.3B |
83.21 |
0.092 |
80.78 |
78.06 |
84.10 |
0.080 |
| olmOCR |
7B |
81.79 |
0.096 |
86.04 |
68.92 |
74.77 |
0.121 |
| POINTS-Reader |
3B |
80.98 |
0.134 |
79.20 |
77.13 |
81.66 |
0.145 |
| Mistral OCR |
- |
78.83 |
0.164 |
82.84 |
70.03 |
78.04 |
0.144 |
| OCRFlux |
3B |
74.82 |
0.193 |
68.03 |
75.75 |
80.23 |
0.202 |
| Dolphin |
0.3B |
74.67 |
0.125 |
67.85 |
68.70 |
77.77 |
0.124 |
General VLMs |
| Ovis2.6-30B-A3B |
30B |
92.36 |
0.037 |
90.32 |
90.46 |
94.00 |
0.046 |
| Gemini-3 Flash |
- |
90.37 |
0.065 |
89.56 |
88.01 |
93.79 |
0.071 |
| Gemini-3 Pro |
- |
90.17 |
0.062 |
88.79 |
87.83 |
93.32 |
0.074 |
| Kimi K2.5 |
1T |
89.33 |
0.065 |
86.92 |
87.57 |
91.82 |
0.084 |
| Qwen3-VL-235B |
235B |
89.15 |
0.069 |
88.14 |
86.21 |
90.55 |
0.068 |
| Gemini-2.5 Pro |
- |
88.03 |
0.075 |
85.82 |
85.71 |
90.29 |
0.097 |
| Qwen2.5-VL |
72B |
87.02 |
0.094 |
88.27 |
82.15 |
86.22 |
0.102 |
| GPT5.2 |
- |
85.75 |
0.124 |
86.93 |
82.76 |
88.25 |
0.106 |
| InternVL3.5 |
241B |
82.67 |
0.142 |
87.23 |
75.00 |
81.28 |
0.125 |
| InternVL3 |
78B |
80.33 |
0.131 |
83.42 |
70.64 |
77.74 |
0.113 |
| GPT-4o |
- |
75.02 |
0.217 |
79.70 |
67.07 |
76.09 |
0.148 |
Pipeline Tools |
| PP-StructureV3 |
- |
86.73 |
0.073 |
85.79 |
81.68 |
89.48 |
0.073 |
| Mathpix |
- |
80.11 |
0.168 |
84.75 |
72.43 |
79.25 |
0.165 |
| Mineru2-pipeline |
- |
75.51 |
0.209 |
76.55 |
70.90 |
79.11 |
0.225 |
| Marker-1.8.2 |
- |
71.30 |
0.206 |
76.66 |
57.88 |
71.17 |
0.250 |
更多分属性评测结果在论文中展示。或者你可以使用[tools/generate_result_tables.ipynb](./tools/generate_result_tables.ipynb)来生成结果的leaderboard。
#### 端到端评测方法-end2end
端到端评测分为两种方式:
- `end2end`: 该方法是用OmniDocBench的JSON文件作为Ground Truth, config文件请参考:[end2end](./configs/end2end.yaml)
- `md2md`: 该方法是用OmniDocBench的markdown格式作为Ground Truth。具体内容将在下一小节*markdown-to-markdown评测*中详述。
我们推荐使用`end2end`的评测方式,因为该方式可以保留sample的类别和属性信息,从而帮助进行特殊类别ignore的操作,以及分属性的结果输出。
`end2end`的评测可以对四个维度进行评测,我们提供了一个end2end的评测结果示例在[result](./result)中,包括:
- 文本段落
- 行间公式
- 表格
- 阅读顺序
【end2end.yaml的字段解释】
`end2end.yaml`的配置如下:
```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。
目前[CDM](https://github.com/opendatalab/UniMERNet/tree/main/cdm)已支持直接评测,需要根据[README](./metrics/cdm/README-CN.md)配置CDM环境后使用,并且在config文件中直接调用`CDM`。除此之外,仍然保留了之前导出CDM评测所需的格式的JSON文件,只需要在metric中配置`CDM_plain`字段,即可将输出整理为CDM的输入格式,并存储在[result](./result)中。
在端到端的评测中,config里可以选择配置不同的匹配方式,一共有三种匹配方式:
- `no_split`: 不对text block做拆分和匹配的操作,而是直接合并成一整个markdown进行计算,这种方式下,将不会输出分属性的结果,也不会输出阅读顺序的结果;
- `simple_match`: 不进行任何截断合并操作,仅对文本做双换行的段落分割后,直接与GT进行一对一匹配;
- `quick_match`:在段落分割的基础上,加上截断合并的操作,减少段落分割差异对最终结果的影响,通过*Adjacency Search Match*的方式进行截断合并;目前v1.5版本在评测方法上已全面升级为**混合匹配**的方法,允许公式和文本进行匹配,减少了模型输出公式为unicode格式造成的分数影响;
我们推荐使用`quick_match`的方式以达到较好的匹配效果,但如果模型输出的段落分割较准确,也可以使用`simple_match`的方式,评测运行会更加迅速。匹配方法通过`config`中的`dataset`字段下的`match_method`字段进行配置。
使用`filter`字段可以对数据集进行筛选,比如将`dataset`下设置`filter`字段为`language: english`,将会仅评测页面语言为英文的页面。更多页面属性请参考*评测集介绍*部分。如果希望全量评测,请注释掉`filter`相关字段。
#### 端到端评测方法-md2md
markdown-to-markdown评测以模型输出的对整个PDF页面解析结果的Markdown作为Prediction,用OmniDocBench的markdown格式作为Ground Truth。config文件请参考:[md2md](./configs/md2md.yaml)。我们更加推荐使用上一节的`end2end`的方式使用OmniDocBench进行评测,从而保留丰富的属性标注以及ignore逻辑。但是我们依然提供了`md2md`的评测方法,以便于与现有的评测方式对齐。
`md2md`的评测可以对三个维度进行评测,包括:
- 文本段落
- 行间公式
- 表格
- 阅读顺序
【md2md.yaml的字段解释】
`md2md.yaml`的配置如下:
```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](./configs/formula_recognition.yaml)进行配置。
【formula_recognition.yaml的字段解释】
`formula_recognition.yaml`的配置文件如下:
```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](https://github.com/opendatalab/UniMERNet/tree/main/cdm)评测所需的格式,只需要在metric中配置CDM字段,即可将输出整理为CDM的输入格式,并存储在[result](./result)中。
`dataset`的部分,输入的`ground_truth`的`data_path`中的数据格式与OmniDocBench保持一致,仅对应的公式sample下新增一个自定义字段保存模型的prediction结果。通过`dataset`下的`prediction`字段下的`data_key`对存储了prediction信息的字段进行指定,比如`pred`。关于更多OmniDocBench的文件结构细节请参考`评测集介绍`小节。模型结果的输入格式可以参考[OmniDocBench_demo_formula](./demo_data/recognition/OmniDocBench_demo_formula.json),其格式为:
```JSON
[{
"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的脚本供参考:
```PYTHON
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 = "\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)
```
### 文字OCR评测
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 |
Pipeline Tools & Expert Vision Models |
PaddleOCR |
0.071 |
0.055 |
0.118 |
0.060 |
0.038 |
0.085 |
0.060 |
0.015 |
0.285 |
0.021 |
| OpenOCR |
0.07 |
0.068 |
0.106 |
0.069 |
0.058 |
0.081 |
0.069 |
0.038 |
0.891 |
0.025 |
| Tesseract-OCR |
0.096 |
0.551 |
0.250 |
0.439 |
0.328 |
0.331 |
0.426 |
0.117 |
0.969 |
0.984 |
| EasyOCR |
0.26 |
0.398 |
0.445 |
0.366 |
0.287 |
0.388 |
0.36 |
0.97 |
0.997 |
0.926 |
| Surya |
0.057 |
0.123 |
0.164 |
0.093 |
0.186 |
0.235 |
0.104 |
0.634 |
0.767 |
0.255 |
| Mathpix |
0.033 |
0.240 |
0.261 |
0.185 |
0.121 |
0.166 |
0.180 |
0.038 |
0.185 |
0.638 |
| GOT-OCR |
0.041 |
0.112 |
0.135 |
0.092 |
0.052 |
0.155 |
0.091 |
0.562 |
0.966 |
0.097 |
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-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 |
Component-level OCR text recognition evaluation on OmniDocBench (v1.0) text subset.
文字OCR评测可以参考[ocr](./configs/ocr.yaml)进行配置。
【ocr.yaml的字段解释】
`ocr.yaml`的配置文件如下:
```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](./demo_data/recognition/OmniDocBench_demo_text_ocr.json),各个字段含义可以参考*公式识别评测*部分提供的样例。
在此提供一个模型infer的脚本供参考:
```PYTHON
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 = "\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.8 |
75.9 |
83.4 |
72.9 |
76.2 |
76.9 |
88 |
64.5/81 |
69.2/76.6 |
72.8/76.4 |
30.5/76.2 |
75.8 |
| 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 (v1.0) table subset. (+/-) means with/without special situation.
表格识别评测可以参考[table_recognition](./configs/table_recognition.yaml)进行配置。
**对于模型预测为LaTex格式的表格, 会使用[latexml](https://math.nist.gov/~BMiller/LaTeXML/)工具将latex转为html 再进行评测. 评测代码会自动进行格式转换,需要用户预先安装[latexml](https://math.nist.gov/~BMiller/LaTeXML/)**
【table_recognition.yaml的字段解释】
`table_recognition.yaml`的配置文件如下:
```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](./demo_data/recognition/OmniDocBench_demo_table.json),其格式为:
```JSON
[{
"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的脚本供参考:
```PYTHON
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 = "\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)
```
### Layout检测
OmniDocBench包含每个PDF页面的所有文档组件的bounding box信息,因此可以作为Layout检测任务评测的benchmark。
| Model |
Backbone |
Params |
Book |
Slides |
Research Report |
Textbook |
Exam Paper |
Magazine |
Academic Literature |
Notes |
Newspaper |
Average |
| DiT-L |
ViT-L |
361.6M |
43.44 |
13.72 |
45.85 |
15.45 |
3.40 |
29.23 |
66.13 |
0.21 |
23.65 |
26.90 |
| LayoutLMv3 |
RoBERTa-B |
138.4M |
42.12 |
13.63 |
43.22 |
21.00 |
5.48 |
31.81 |
64.66 |
0.80 |
30.84 |
28.84 |
| DocLayout-YOLO |
v10m |
19.6M |
43.71 |
48.71 |
72.83 |
42.67 |
35.40 |
51.44 |
64.64 |
9.54 |
57.54 |
47.38 |
| SwinDocSegmenter |
Swin-L |
223M |
42.91 |
28.20 |
47.29 |
32.44 |
20.81 |
52.35 |
48.54 |
12.38 |
38.06 |
35.89 |
| GraphKD |
R101 |
44.5M |
39.03 |
16.18 |
39.92 |
22.82 |
14.31 |
37.61 |
44.43 |
5.71 |
23.86 |
27.10 |
| DOCX-Chain |
- |
- |
30.86 |
11.71 |
39.62 |
19.23 |
10.67 |
23.00 |
41.60 |
1.80 |
16.96 |
21.27 |
Component-level layout detection evaluation on OmniDocBench (v1.0) layout subset: mAP results by PDF page type.
Layout检测config文件参考[layout_detection](./configs/layout_detection.yaml),数据格式参考[detection_prediction](./demo_data/detection/detection_prediction.json)。
【layout_detection.yaml的字段解释】
以下我们以精简格式为例进行展示。`layout_detection.yaml`的配置文件如下:
```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,其数据格式为:
```JSON
{
"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](./configs/formula_detection.yaml)进行配置。
【formula_detection.yaml的字段解释】
`formula_detection.yaml`的配置文件如下:
```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](./tools/json2md.py) 用于将JSON格式的OmniDocBench转换为Markdown格式;
- [visualization](./tools/visualization.py) 用于可视化OmniDocBench的JSON文件;
- [generate_result_tables](./tools/generate_result_tables.py) 可用于整理模型结果榜单;
- [model_infer](./tools/model_infer)文件夹下提供了一些模型推理的脚本供参考,请在配置了模型环境后使用,包括:
- `_img2md.py` 用于调用模型将图片转换为Markdown格式;
- `_ocr.py` 用于调用模型对block级别的文档文本段落进行文本识别;
- `_formula.py`用于调用模型对行间公式进行公式识别;
## 评测模型信息
### End2End
### Text Recognition
### Layout
### Formula
### Table
## TODO
- [ ] 匹配算法`match_full`接入
- [ ] 针对模型特定输出格式进行匹配后处理优化
- [ ] 增加特殊字符的Unicode映射表
## Known Issues
- 部分模型偶尔会出现输出格式不规范(比如将多栏文本识别为表格,将公式识别为Unicode文本),导致匹配失败的情况,可以针对模型输出格式进行后处理优化
- 由于各种模型对符号的识别能力不同,导致部分符号的识别结果不一致(比如列表的标识符等),目前的文本评测中仅保留中英文本参与评测,后续将增加Unicode映射表来优化
欢迎大家使用OmniDocBench数据集,并提出宝贵的意见和建议,帮助我们不断优化数据集质量和评测工具。有任何意见和建议,欢迎提issue,我们将在第一时间响应。如有评测方案优化可以提PR,我们也将及时review和更新。
## Acknowledgement
- 感谢[2077AI](https://2077ai.com)提供的高质量数据集标注
- [PubTabNet](https://github.com/ibm-aur-nlp/PubTabNet) TEDS指标计算
- [latexml](https://github.com/brucemiller/LaTeXML) LaTeX to HTML转换工具
- [Tester](https://github.com/intsig-textin/markdown_tester) Markdown表格转HTML工具
## 版权声明
PDF来源从网络公开渠道收集以及社群用户贡献,已剔除了不允许分发的内容,只用作科研,不作为商业用途。若有侵权请联系OpenDataLab@pjlab.org.cn。
## 引用
```bibtex
@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},
}
```