Skip to content

svjack/docvqa-gen

Repository files navigation


docvqa-gen

基于英语和中文文档视觉的问答数据集生成器

In English

简要引述

现在,许多问答框架都提供了一个用于生成自定义数据集的功能,以支持在数据维度上训练模型。例如,primeqa提供了许多工具包,其中包括多语言问题生成:支持对表格和多语言文本进行有效领域适应的问题生成。而PaddleNLP也在中文NLP领域实现了这个功能。从源代码可以看出,它们可能从一些框架中获得了灵感,例如text2text。我也是在2022年4月初从text2text中获取了这个想法。

由于PaddleNLP不久前发布了这个功能,我认为现在是时候发布一个演示项目,以推广这个功能到OCR领域,并提供一个在图像上生成问题的接口。这是DocVQA任务的数据组成部分。

核心是在图像上训练一个问题生成器,如果有人提供答案,这个生成器将给出问题。这个需求可以通过一个名为donut的多模态框架来满足,在其DocVQA变体中,它可以在图像上执行问答操作。在某些情况下,这个模型的表现不能超过一些带有OCR帮助的框架。

由于全能构造使得生成器错误无法在不同模块中得到很好的处理,这可能使结论过于依赖训练数据集,并给训练这种模型的图像增强任务带来挑战。

但是,这并不影响使用donut来训练问题生成器的方便性。因为donut中的解码器使用hyunwoongko/asian-bart-ecjk,这使得此框架适用于包括英语、中文、日语和韩语在内的多种语言,而这种优秀模型的开发者主要来自韩国。这为处理ecjk领域中的生成问题生成提供了机会。

最小依赖安装

如果有人只想使用训练好的donut模型在图像上生成问题。我已经将它们的训练早期停止版本分别上传到了HuggingFace hub的英文和中文领域。您可以从svjack/question_generator_by_zh_on_picsvjack/question_generator_by_en_on_pic下载它们,然后通过以下命令安装donut

pip install torch 
pip install transformers==4.11.3
pip install opencv-python==4.6.0.66
pip install donut-python

这将帮助您使用它们。(您可以使用git-lfs下载它们,并使用DonutModel.from_pretrained(en_model_path)来以donut相同的方式初始化权重)

更进一步

在NLP领域中,如果给你一个段落,你怎么能从这个段落中得到一些问题和它们的答案,整个目标可以分成几个模块。

以下是在HuggingFace Space中自行训练和构建的NLP示例部署。
问句生成器 🍩 展示

在段落上的问句生成器例子展示

文本对应的图片 Girl in a jacket Girl in a jacket
生成的问答对 Girl in a jacket Girl in a jacket

首先,确定人们主要感兴趣的问题答案类型。一个常用的NLP任务可以解决这个问题——命名实体识别(NER),在许多话题中,人们主要关心命名实体,因此许多数据集都是以NE为中心构建的。因此,您可以将命名实体提取为答案。如果答案来自文本,则需要原生的NER。

当涉及到图像时,可以使用PaddleOCRkie module模块在PPStructure中进行命名实体识别。

其次,使用生成器生成关于这个答案的问题。

当涉及到图像时,这是在donut的帮助下完成的,但由于数据集的变化,当图像由一些长段落构成时,donut问题生成器可能无法正常工作。因此需要通过OCR提取长段落,并在OCR识别出的段落中生成问题。在英文领域,text2text通过其Handler处理它,而我发布了我的svjack/squad_gen_qst_zh_v0可以用于中文。

第三,使用SQuAD样式模型验证生成的问题。

当涉及到图像时,需要验证由donut,生成器和文本生成器生成的问题。这需要一个支持在英语和中文文档图像上执行问答的模型。这可以通过PaddleNLP文档智能模块进行实现。

在上述讨论之后,从段落生成问题的任务已经升级为文档图像生成问题。PaddleNLP和PaddleOCR对从donut出发提供了这种改进以支持——只需要一个生成器"更进一步",它在英语和中文方面具有兼容性。而且,DocVQA数据集的生成已经在理论上完成。

完全依赖安装

如果想要使用"一步到位"的功能从文档图像中生成问题和答案,除了donut之外,您还需要安装用于执行命名实体识别(NER)的模型(我选择了spacy),并下载一些必需的模型文件到本地。为了简化安装过程,在notebook.ipynb中,它集成了每个安装步骤并在一个小的jupyter笔记本中运行演示。您可以在任何良好的网络连接的笔记本服务器上运行此notebook(如Kaggle Colab或您的本地jupyter服务器)。
或者您可以通过requirements.txt安装python包

pip install -r requirements.txt

然后通过packages.txt下载apt-get依赖项到本地,下载svjack/question_generator_by_zh_on_picsvjack/question_generator_by_en_on_pic

在Huggingface Space上部署的示例(在上述第三步中没有进行验证)

文档问句生成描述

图片 Girl in a jacket Girl in a jacket
上面图片生成的问答对 Girl in a jacket Girl in a jacket

HuggingFace 展示

模型展示

名称 HuggingFace 模型链接 HuggingFace 空间链接 语言
英文图片文档问题生成器 🦅 https://huggingface.co/svjack/question_generator_by_en_on_pic https://huggingface.co/spaces/svjack/Question-Generator-on-English-Doc English
中文图片文档问题生成器 🐰 https://huggingface.co/svjack/question_generator_by_zh_on_pic https://huggingface.co/spaces/svjack/Question-Generator-on-Chinese-Doc Chinese

手动运行的例子

因为在项目中路径是固定的,所以所有检查示例的函数都应该在项目的根目录中运行。 我建议在检查示例之前先运行notebook.ipynb以完成安装。 在使用它们之前,请检查imgs文件夹中的内容。

手动设定答案的问句生成

  • 1
from qa_on_image import *
img_path = "imgs/en_img.png"
input_img = read_img_to_3d_array(img_path)
demo_process_vqa(input_img, "605-7227", "en")

将会给出这些输出:

{'question': '605-7227', 'answer': 'What is the Phone #?'}
  • 2
from qa_on_image import *
img_path = "imgs/zh_img.png"
input_img = read_img_to_3d_array(img_path)
demo_process_vqa(input_img, "零钱通", "zh")

将会给出这些输出:

{'question': '零钱通', 'answer': '支付方式是什么?'}

更进一步的 (在图片上生成问句) 例子

  • 1
from qa_on_pic import *
img_path = "imgs/en_img.png"
qa_df = generate_qa(img_path, ppstructure_bin_path, table_engine)
qa_df.values.tolist()

将会给出这些输出:

[['What is the supplier name?', 'Coyne Beahm Shouse, Inc', 1.0, 'image'],
 ['What is the Address?', '6522 Bryan Bouievard', 1.0, 'image'],
 ['What is the Phone #?', '(336) 605-7227', 0.99, 'image'],
 ['What is the Effective Date?', '9/7/2005', 0.97, 'image'],
 ['What was the other name of the other Supplier Name?',
  'Coyne Beahm Shouse, Inc',
  0.97,
  'context'],
 ['What must be included in the contract?',
  'signed Bid Waiver',
  0.91,
  'context'],
 ['What is the number of the street number in the city?', '1', 0.8, 'context'],
 ['What is the job assignment?', '9/7/2005', 0.59, 'image']]
  • 2
from qa_on_pic import *
img_path = "imgs/zh_img.png"
qa_df = generate_qa(img_path, ppstructure_bin_path, table_engine)
qa_df.values.tolist()

将会给出这些输出:

[['账单的商户全称是什么?', '云城区小木船酒行', 1.0, 'image'],
 ['当前状态是什么?', '支付成功', 1.0, 'image'],
 ['支付方式是什么?', '零钱通', 0.99, 'image'],
 ['账单的支付金额是多少?', '2980.00', 0.85, 'image']]
  • 3
from qa_on_pic import *
img_path = "imgs/en_context.png"
qa_df = generate_qa(img_path, ppstructure_bin_path, table_engine)
qa_df.values.tolist()

将会给出这些输出:

[['When must the payment terms be completed?',
  'prior to September 1, 1994',
  1.0,
  'context'],
 ['How often are Safeway" Hot Shoe" awards provided?',
  'annual',
  0.88,
  'context'],
 ['Who received $ 200 in Safeway Gift Certificates?',
  'Winner',
  0.82,
  'context']]
  • 4
from qa_on_pic import *
img_path = "imgs/zh_context_1.png"
qa_df = generate_qa(img_path, ppstructure_bin_path, table_engine)
qa_df.values.tolist()

将会给出这些输出:

[['公司何时发布《发行股份及支付现金购买资产并募集资金汇合备', '2018年12月27日', 1.0, 'context'],
 ['中金黄金在购买其持有的矿业', '90%股权', 0.96, 'context'],
 ['右下角的数字是什么?', '2020', 0.88, 'image'],
 ['该图中的人民币是指什么?', '当前价', 0.82, 'image'],
 ['谁为其持有的矿业股份 并获得其持有的矿业股份?', '中金黄金', 0.55, 'context']]

Contact

svjack - svjackbt@gmail.com - ehangzhou@outlook.com

Project Link:https://github.com/svjack/docvqa-gen

HuggingFace 空间链接:

https://huggingface.co/spaces/svjack/Question-Generator

Acknowledgements