English | 简体中文
目录
ERNIE-Layout以文心文本大模型ERNIE为底座,融合文本、图像、布局等信息进行跨模态联合建模,创新性引入布局知识增强,提出阅读顺序预测、细粒度图文匹配等自监督预训练任务,升级空间解偶注意力机制,在各数据集上效果取得大幅度提升,相关工作ERNIE-Layout: Layout-Knowledge Enhanced Multi-modal Pre-training for Document Understanding已被EMNLP 2022 Findings会议收录[1]。考虑到文档智能在多语种上商用广泛,依托PaddleNLP对外开源业界最强的多语言跨模态文档预训练模型ERNIE-Layout。
🧾 通过Huggingface网页体验DocPrompt功能:
- 发票抽取问答
- 海报抽取问答
- 网页抽取问答
- 表格抽取问答
- 试卷抽取问答
- 英文票据多语种(中、英、日、泰、西班牙、俄语)抽取问答
- 中文票据多语种(中简、中繁、英、日、法语)抽取问答
- Demo图片可在此下载
通过paddlenlp.Taskflow
三行代码调用DocPrompt功能,具备多语言文档抽取问答能力,部分应用场景展示如下:
- 输入格式
[
{"doc": "./invoice.jpg", "prompt": ["发票号码是多少?", "校验码是多少?"]},
{"doc": "./resume.png", "prompt": ["五百丁本次想要担任的是什么职位?", "五百丁是在哪里上的大学?", "大学学的是什么专业?"]}
]
默认使用PaddleOCR进行OCR识别,同时支持用户通过word_boxes
传入自己的OCR结果,格式为List[str, List[float, float, float, float]]
。
[
{"doc": doc_path, "prompt": prompt, "word_boxes": word_boxes}
]
-
支持单条、批量预测
- 支持本地图片路径输入
>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> docprompt = Taskflow("document_intelligence") >>> pprint(docprompt([{"doc": "./resume.png", "prompt": ["五百丁本次想要担任的是什么职位?", "五百丁是在哪里上的大学?", "大学学的是什么专业?"]}])) [{'prompt': '五百丁本次想要担任的是什么职位?', 'result': [{'end': 7, 'prob': 1.0, 'start': 4, 'value': '客户经理'}]}, {'prompt': '五百丁是在哪里上的大学?', 'result': [{'end': 37, 'prob': 1.0, 'start': 31, 'value': '广州五百丁学院'}]}, {'prompt': '大学学的是什么专业?', 'result': [{'end': 44, 'prob': 0.82, 'start': 38, 'value': '金融学(本科)'}]}]
- http图片链接输入
>>> from pprint import pprint >>> from paddlenlp import Taskflow >>> docprompt = Taskflow("document_intelligence") >>> pprint(docprompt([{"doc": "https://bj.bcebos.com/paddlenlp/taskflow/document_intelligence/images/invoice.jpg", "prompt": ["发票号码是多少?", "校验码是多少?"]}])) [{'prompt': '发票号码是多少?', 'result': [{'end': 2, 'prob': 0.74, 'start': 2, 'value': 'No44527206'}]}, {'prompt': '校验码是多少?', 'result': [{'end': 233, 'prob': 1.0, 'start': 231, 'value': '01107 555427109891646'}]}]
-
可配置参数说明
batch_size
:批处理大小,请结合机器情况进行调整,默认为1。lang
:选择PaddleOCR的语言,ch
可在中英混合的图片中使用,en
在英文图片上的效果更好,默认为ch
。topn
: 如果模型识别出多个结果,将返回前n个概率值最高的结果,默认为1。
-
开源数据集介绍
数据集 任务类型 语言 说明 FUNSD 文档信息抽取 英文 - XFUND-ZH 文档信息抽取 中文 - DocVQA-ZH 文档视觉问答 中文 DocVQA-ZH已停止榜单提交,因此我们将原始训练集进行重新划分以评估模型效果,划分后训练集包含4,187张图片,验证集包含500张图片,测试集包含500张图片。 RVL-CDIP (sampled) 文档图像分类 英文 RVL-CDIP原始数据集共包含400,000张图片,由于数据集较大训练较慢,为验证文档图像分类的模型效果故进行降采样,采样后的训练集包含6,400张图片,验证集包含800张图片,测试集包含800张图片。 -
评测结果
在文档智能领域主流开源数据集的验证集上评测指标如下表所示:
Model FUNSD RVL-CDIP (sampled) XFUND-ZH DocVQA-ZH LayoutXLM-Base 86.72 90.88 86.24 66.01 ERNIE-LayoutX-Base 89.31 90.29 88.58 69.57 -
具体评测方式
-
以上所有任务均基于Grid Search方式进行超参寻优。FUNSD和XFUND-ZH每间隔 100 steps 评估验证集效果,评价指标为F1-Score。 RVL-CDIP每间隔2000 steps评估验证集效果,评价指标为Accuracy。DocVQA-ZH每间隔10000 steps评估验证集效果,取验证集最优效果作为表格中的汇报指标,评价指标为ANLS(计算方法参考https://arxiv.org/pdf/1907.00490.pdf)。
-
以上每个下游任务的超参范围如下表所示:
Hyper Parameters FUNSD RVL-CDIP (sampled) XFUND-ZH DocVQA-ZH learning_rate 5e-6, 1e-5, 2e-5, 5e-5 5e-6, 1e-5, 2e-5, 5e-5 5e-6, 1e-5, 2e-5, 5e-5 5e-6, 1e-5, 2e-5, 5e-5 batch_size 1, 2, 4 8, 16, 24 1, 2, 4 8, 16, 24 warmup_ratio - 0, 0.05, 0.1 - 0, 0.05, 0.1 FUNSD和XFUND-ZH使用的lr_scheduler_type策略是constant,因此不对warmup_ratio进行搜索。
-
文档信息抽取任务FUNSD和XFUND-ZH采用最大步数(max_steps)的微调方式,分别为10000 steps和20000 steps;文档视觉问答DocVQA-ZH的num_train_epochs为6;文档图像分类RVL-CDIP的num_train_epochs为20。
-
-
最优超参
不同预训练模型在下游任务上做Grid Search之后的最优超参(learning_rate、batch_size、warmup_ratio)如下:
Model FUNSD RVL-CDIP (sampled) XFUND-ZH DocVQA-ZH LayoutXLM-Base 1e-5, 2, _ 1e-5, 8, 0.1 1e-5, 2, _ 2e-5. 8, 0.1 ERNIE-LayoutX-Base 2e-5, 4, _ 1e-5, 8, 0. 1e-5, 4, _ 2e-5. 8, 0.05
- 请执行以下命令进行安装项目依赖
pip install -r requirements.txt
- FUNSD训练
python -u run_ner.py \
--model_name_or_path ernie-layoutx-base-uncased \
--output_dir ./ernie-layoutx-base-uncased/models/funsd/ \
--dataset_name funsd \
--do_train \
--do_eval \
--max_steps 10000 \
--eval_steps 100 \
--save_steps 100 \
--save_total_limit 1 \
--load_best_model_at_end \
--pattern ner-bio \
--preprocessing_num_workers 4 \
--overwrite_cache false \
--use_segment_box \
--doc_stride 128 \
--target_size 1000 \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--learning_rate 2e-5 \
--lr_scheduler_type constant \
--gradient_accumulation_steps 1 \
--seed 1000 \
--metric_for_best_model eval_f1 \
--greater_is_better true \
--overwrite_output_dir
- XFUND-ZH训练
python -u run_ner.py \
--model_name_or_path ernie-layoutx-base-uncased \
--output_dir ./ernie-layoutx-base-uncased/models/xfund_zh/ \
--dataset_name xfund_zh \
--do_train \
--do_eval \
--lang "ch" \
--max_steps 20000 \
--eval_steps 100 \
--save_steps 100 \
--save_total_limit 1 \
--load_best_model_at_end \
--pattern ner-bio \
--preprocessing_num_workers 4 \
--overwrite_cache false \
--use_segment_box \
--doc_stride 128 \
--target_size 1000 \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--learning_rate 1e-5 \
--lr_scheduler_type constant \
--gradient_accumulation_steps 1 \
--seed 1000 \
--metric_for_best_model eval_f1 \
--greater_is_better true \
--overwrite_output_dir
- DocVQA-ZH训练
python3 -u run_mrc.py \
--model_name_or_path ernie-layoutx-base-uncased \
--output_dir ./ernie-layoutx-base-uncased/models/docvqa_zh/ \
--dataset_name docvqa_zh \
--do_train \
--do_eval \
--lang "ch" \
--num_train_epochs 6 \
--lr_scheduler_type linear \
--warmup_ratio 0.05 \
--weight_decay 0 \
--eval_steps 10000 \
--save_steps 10000 \
--save_total_limit 1 \
--load_best_model_at_end \
--pattern "mrc" \
--use_segment_box false \
--return_entity_level_metrics false \
--overwrite_cache false \
--doc_stride 128 \
--target_size 1000 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 8 \
--learning_rate 2e-5 \
--preprocessing_num_workers 32 \
--save_total_limit 1 \
--train_nshard 16 \
--seed 1000 \
--metric_for_best_model anls \
--greater_is_better true \
--overwrite_output_dir
- RVL-CDIP训练
python3 -u run_cls.py \
--model_name_or_path ernie-layoutx-base-uncased \
--output_dir ./ernie-layoutx-base-uncased/models/rvl_cdip_sampled/ \
--dataset_name rvl_cdip_sampled \
--do_train \
--do_eval \
--num_train_epochs 20 \
--lr_scheduler_type linear \
--max_seq_length 512 \
--warmup_ratio 0.05 \
--weight_decay 0 \
--eval_steps 2000 \
--save_steps 2000 \
--save_total_limit 1 \
--load_best_model_at_end \
--pattern "cls" \
--use_segment_box \
--return_entity_level_metrics false \
--overwrite_cache false \
--doc_stride 128 \
--target_size 1000 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 8 \
--learning_rate 1e-5 \
--preprocessing_num_workers 32 \
--train_nshard 16 \
--seed 1000 \
--metric_for_best_model acc \
--greater_is_better true \
--overwrite_output_dir
使用动态图训练结束之后,还可以将动态图参数导出为静态图参数,静态图模型将用于后续的推理部署工作。具体代码见静态图导出脚本,静态图参数保存在output_path
指定路径中。运行方式:
- 导出在FUNSD上微调后的模型:
python export_model.py --task_type ner --model_path ./ernie-layoutx-base-uncased/models/funsd/ --output_path ./ner_export
- 导出在DocVQA-ZH上微调后的模型:
python export_model.py --task_type mrc --model_path ./ernie-layoutx-base-uncased/models/docvqa_zh/ --output_path ./mrc_export
- 导出在RVL-CDIP(sampled)上微调后的模型:
python export_model.py --task_type cls --model_path ./ernie-layoutx-base-uncased/models/rvl_cdip_sampled/ --output_path ./cls_export
- 可支持配置的参数:
model_path
:动态图训练保存的参数路径;默认为"./checkpoint/"。output_path
:静态图图保存的参数路径;默认为"./export"。
- 程序运行时将会自动导出模型到指定的
output_path
中,保存模型文件结构如下所示:
export/
├── inference.pdiparams
├── inference.pdiparams.info
└── inference.pdmodel
导出静态图模型之后可用于部署,项目提供了文档信息抽取、文档视觉问答和文档图像分类三大场景下的使用示例,详见ERNIE-Layout Python部署指南。