# MatCha

## Visão geral

MatCha foi proposto no artigo [MatCha: Enhancing Visual Language Pretraining with Math Reasoning and Chart Derendering](https://huggingface.co/papers/2212.09662), de Fangyu Liu, Francesco Piccinno, Syrine Krichene, Chenxi Pang, Kenton Lee, Mandar Joshi, Yasemin Altun, Nigel Collier, Julian Martin Eisenschlos.

O resumo do artigo afirma o seguinte:

*Dados de linguagem visual, como gráficos, tabelas e infográficos, são ubíquos no mundo humano. No entanto, os modelos de visão-linguagem mais avançados não apresentam bom desempenho nesses dados. Propomos o MatCha (pré-treinamento de raciocínio matemático e re-renderização de gráficos) para aprimorar as capacidades dos modelos de linguagem visual na modelagem conjunta de gráficos/tabelas e dados de linguagem. Especificamente, propomos várias tarefas de pré-treinamento que cobrem a desconstrução de gráficos e o raciocínio numérico, que são as capacidades-chave na modelagem de linguagem visual. Executamos o pré-treinamento MatCha a partir do Pix2Struct, um modelo de linguagem visual de imagem-para-texto recentemente proposto. Em benchmarks padrão, como PlotQA e ChartQA, o modelo MatCha supera os métodos mais avançados em até quase 20%. Também examinamos o quão bem o pré-treinamento MatCha se transfere para domínios como capturas de tela, diagramas de livros didáticos e figuras de documentos e observamos uma melhoria geral, verificando a utilidade do pré-treinamento MatCha em tarefas mais amplas de linguagem visual.*

## Descrição do modelo

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

## Uso

Atualmente, 6 checkpoints estão disponíveis para MatCha:

- `google/matcha`: o modelo base MatCha, usado para ajustar o MatCha em tarefas específicas
- `google/matcha-chartqa`: modelo MatCha ajustado no conjunto de dados ChartQA. Pode ser usado para responder perguntas sobre gráficos.
- `google/matcha-plotqa-v1`: Modelo MatCha ajustado no conjunto de dados PlotQA. Pode ser usado para responder perguntas sobre gráficos.
- `google/matcha-plotqa-v2`: Modelo MatCha ajustado no conjunto de dados PlotQA. Pode ser usado para responder perguntas sobre gráficos.
- `google/matcha-chart2text-statista`: Modelo MatCha ajustado no conjunto de dados Statista.
- `google/matcha-chart2text-pew`: Modelo MatCha ajustado no conjunto de dados Pew.

Os modelos ajustados em `chart2text-pew` e `chart2text-statista` são mais adequados para sumarização, enquanto os modelos ajustados em `plotqa` e `chartqa` são mais adequados para resposta a perguntas.

Você pode usar esses modelos da seguinte forma (exemplo em um conjunto de dados ChartQA):

```python
import requests
from PIL import Image

from transformers import AutoProcessor, Pix2StructForConditionalGeneration

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

inputs = processor(images=image, text="Is the sum of all 4 places greater than Laos?", return_tensors="pt").to(0)
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 MatCha, 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)
```

MatCha é um modelo treinado usando a arquitetura `Pix2Struct`. Você pode encontrar mais informações sobre `Pix2Struct` na [documentação do Pix2Struct](./pix2struct).

