# DePlot

## Visão geral

DePlot foi proposto no artigo [DePlot: One-shot visual language reasoning by plot-to-table translation](https://huggingface.co/papers/2212.10505), de Fangyu Liu, Julian Martin Eisenschlos, Francesco Piccinno, Syrine Krichene, Chenxi Pang, Kenton Lee, Mandar Joshi, Wenhu Chen, Nigel Collier, Yasemin Altun.

O resumo do artigo afirma o seguinte:

*Linguagens visuais, como gráficos e plots, são ubíquas no mundo humano. Compreender plots e gráficos exige fortes habilidades de raciocínio. Modelos state-of-the-art (SOTA) anteriores exigem pelo menos dezenas de milhares de exemplos de treinamento e suas capacidades de raciocínio ainda são muito limitadas, especialmente em consultas complexas escritas por humanos. Este artigo apresenta a primeira solução one-shot para raciocínio em linguagem visual. Decompondo o desafio do raciocínio em linguagem visual em duas etapas: (1) tradução de plot para texto, e (2) raciocínio sobre o texto traduzido. A chave deste método é um módulo de conversão de modalidade, chamado DePlot, que traduz a imagem de um plot ou gráfico para uma tabela linearizada. A saída do DePlot pode então ser usada diretamente para fazer prompt a um large language model (LLM) pré-treinado, explorando as capacidades de raciocínio few-shot dos LLMs. Para obter o DePlot, padronizamos a tarefa de plot para tabela estabelecendo formatos e métricas de tarefa unificados, e treinamos o DePlot end-to-end nesta tarefa. O DePlot pode então ser usado pronto para uso junto com LLMs de forma plug-and-play. Em comparação com um modelo SOTA finetuned em mais de >28k pontos de dados, o DePlot+LLM com apenas one-shot prompting alcança uma melhoria de 24,0% em relação ao SOTA finetuned em consultas escritas por humanos da tarefa de chart QA.*

DePlot é um modelo treinado usando a arquitetura `Pix2Struct`. Você pode encontrar mais informações sobre `Pix2Struct` na [documentação do Pix2Struct](./pix2struct). DePlot é um subconjunto de Visual Question Answering da arquitetura `Pix2Struct`. Ele renderiza a pergunta de entrada na imagem e prevê a resposta.

## Exemplo de uso

Atualmente, um checkpoint está disponível para DePlot:

- `google/deplot`: DePlot ajustado no dataset ChartQA

```python
import requests
from PIL import Image

from transformers import AutoProcessor, Pix2StructForConditionalGeneration

model = Pix2StructForConditionalGeneration.from_pretrained("google/deplot", device_map="auto")
processor = AutoProcessor.from_pretrained("google/deplot")
url = "https://raw.githubusercontent.com/vis-nlp/ChartQA/main/ChartQA%20Dataset/val/png/5090.png"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(images=image, text="Generate underlying data table of the figure below:", return_tensors="pt").to(model.device)
predictions = model.generate(**inputs, max_new_tokens=512)
print(processor.decode(predictions[0], skip_special_tokens=True))
```

## Ajuste fino

Para fazer o ajuste fino do DePlot, consulte o [notebook de ajuste fino](https://github.com/huggingface/notebooks/blob/main/examples/image_captioning_pix2struct.ipynb) do pix2struct. Para os modelos `Pix2Struct`, verificamos que o ajuste fino do modelo com Adafactor e agendador de taxa de aprendizado cossenoidal leva a uma convergência mais rápida:

```python
from transformers.optimization import Adafactor, get_cosine_schedule_with_warmup

optimizer = Adafactor(self.parameters(), scale_parameter=False, relative_step=False, lr=0.01, weight_decay=1e-05)
scheduler = get_cosine_schedule_with_warmup(optimizer, num_warmup_steps=1000, num_training_steps=40000)
```

DePlot é um modelo treinado usando a arquitetura `Pix2Struct`. Para a referência da API, consulte a [documentação do `Pix2Struct`](./pix2struct).

