Skip to content

Question Answering dataset generator of Document Visual in English and Chinese

Notifications You must be signed in to change notification settings

svjack/docvqa-gen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ca992b7 · Apr 17, 2023

History

42 Commits
Nov 29, 2022
Nov 29, 2022
Nov 29, 2022
Dec 5, 2022
Nov 29, 2022
Nov 29, 2022
Nov 29, 2022
Nov 29, 2022
Apr 17, 2023
Apr 17, 2023
Dec 3, 2022
Nov 29, 2022
Feb 21, 2023
Nov 30, 2022
Nov 30, 2022
Nov 30, 2022
Nov 29, 2022
Apr 17, 2023
Nov 29, 2022

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