🚀 UniChart:用于图表理解和推理的通用视觉语言预训练模型
UniChart是一个用于图表理解和推理的预训练模型,它能编码图表的相关文本、数据和视觉元素,并通过特定的文本解码器生成自然语言输出。该模型在多种下游任务中表现出色,为基于图表的数据分析提供了强大支持。
🚀 快速开始
论文摘要指出:图表在数据分析、洞察可视化以及回答关于数据的复杂推理问题方面非常受欢迎。为了便于使用自然语言进行基于图表的数据分析,最近引入了一些下游任务,如图表问答和图表总结。然而,大多数解决这些任务的方法在语言或视觉 - 语言任务上进行预训练时,并未尝试明确建模图表的结构(例如,数据如何进行视觉编码以及图表元素之间如何相互关联)。为了解决这个问题,研究人员首先构建了一个涵盖广泛主题和视觉风格的大型图表语料库。然后提出了UniChart,一个用于图表理解和推理的预训练模型。UniChart对图表的相关文本、数据和视觉元素进行编码,然后使用基于图表的文本解码器以自然语言生成预期输出。研究人员提出了几个特定于图表的预训练任务,包括:(i)用于从图表中提取视觉元素(如条形图、折线图)和数据的低级任务,以及(ii)用于获得图表理解和推理技能的高级任务。研究发现,在大型语料库上对模型进行特定于图表的低级和高级任务的预训练,然后在三个下游任务上进行微调,可在这三个下游任务上取得最先进的性能。
✨ 主要特性
- 构建大型语料库:涵盖广泛主题和视觉风格的图表语料库,为模型训练提供丰富数据。
- 特定预训练任务:提出低级和高级特定于图表的预训练任务,提升模型对图表的理解和推理能力。
- 多下游任务支持:在图表问答、图表总结等多个下游任务中表现出色。
📦 安装指南
文档未提及具体安装步骤,可参考推理部分使用已有的模型进行推理。
💻 使用示例
基础用法
from transformers import DonutProcessor, VisionEncoderDecoderModel
from PIL import Image
import torch, os, re
torch.hub.download_url_to_file('https://raw.githubusercontent.com/vis-nlp/ChartQA/main/ChartQA%20Dataset/val/png/multi_col_1229.png', 'chart_example_1.png')
model_name = "ahmed-masry/unichart-chartqa-960"
image_path = "/content/chart_example_1.png"
input_prompt = "<chartqa> What is the lowest value in blue bar? <s_answer>"
model = VisionEncoderDecoderModel.from_pretrained(model_name)
processor = DonutProcessor.from_pretrained(model_name)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
image = Image.open(image_path).convert("RGB")
decoder_input_ids = processor.tokenizer(input_prompt, add_special_tokens=False, return_tensors="pt").input_ids
pixel_values = processor(image, return_tensors="pt").pixel_values
outputs = model.generate(
pixel_values.to(device),
decoder_input_ids=decoder_input_ids.to(device),
max_length=model.decoder.config.max_position_embeddings,
early_stopping=True,
pad_token_id=processor.tokenizer.pad_token_id,
eos_token_id=processor.tokenizer.eos_token_id,
use_cache=True,
num_beams=4,
bad_words_ids=[[processor.tokenizer.unk_token_id]],
return_dict_in_generate=True,
)
sequence = processor.batch_decode(outputs.sequences)[0]
sequence = sequence.replace(processor.tokenizer.eos_token, "").replace(processor.tokenizer.pad_token, "")
sequence = sequence.split("<s_answer>")[1].strip()
print(sequence)
高级用法
在推理时,可根据不同的下游任务修改input_prompt
,具体如下:
任务 |
输入提示 |
图表问答 |
<chartqa> question <s_answer> |
开放图表问答 |
<opencqa> question <s_answer> |
图表总结 |
<summarize_chart> <s_answer> |
数据表提取 |
<extract_data_table> <s_answer> |
📚 详细文档
在线演示
如果您想快速尝试我们的模型,可以访问我们托管在Hugging Face Spaces平台上的公共在线演示,界面友好!
图表总结的输入提示是**<summarize_chart>,数据表生成的输入提示是<extract_data_table>**。
推理
您可以使用Hugging Face库轻松地使用我们的模型进行推理!您只需执行以下操作:
- 将
model_name
更改为您首选的检查点。
- 将
image_path
更改为您系统上图表示例图像的路径。
- 根据您首选的任务编写
input_prompt
,如下表所示。
任务 |
输入提示 |
图表问答 |
<chartqa> question <s_answer> |
开放图表问答 |
<opencqa> question <s_answer> |
图表总结 |
<summarize_chart> <s_answer> |
数据表提取 |
<extract_data_table> <s_answer> |
📄 许可证
本项目采用GPL - 3.0许可证。
📞 联系我们
如果您对这项工作有任何疑问,请通过以下电子邮件地址联系**Ahmed Masry**:amasry17@ku.edu.tr 或 ahmed.elmasry24653@gmail.com。
📚 引用
如果您在研究中使用了我们的模型或数据集,请引用我们的论文。
@misc{masry2023unichart,
title={UniChart: A Universal Vision-language Pretrained Model for Chart Comprehension and Reasoning},
author={Ahmed Masry and Parsa Kavehzadeh and Xuan Long Do and Enamul Hoque and Shafiq Joty},
year={2023},
eprint={2305.14761},
archivePrefix={arXiv},
primaryClass={cs.CL}
}