# MatCha

## Resumen

MatCha se propuso en el artículo [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.

El resumen del artículo establece lo siguiente:

*Los datos de lenguaje visual, como gráficos, diagramas e infografías, son omnipresentes en el mundo humano. Sin embargo, los modelos de visión-lenguaje de última generación no rinden bien con estos datos. Proponemos MatCha (preentrenamiento de razonamiento matemático y redibujado de gráficos) para mejorar las capacidades de los modelos de lenguaje visual en el modelado conjunto de gráficos/diagramas y datos de lenguaje. Específicamente, proponemos varias tareas de preentrenamiento que cubren la deconstrucción de diagramas y el razonamiento numérico, que son las capacidades clave en el modelado de lenguaje visual. Realizamos el preentrenamiento de MatCha a partir de Pix2Struct, un modelo de lenguaje visual de imagen a texto propuesto recientemente. En benchmarks estándar como PlotQA y ChartQA, el modelo MatCha supera a los métodos de última generación en casi un 20%. También examinamos qué tan bien se transfiere el preentrenamiento de MatCha a dominios como capturas de pantalla, diagramas de libros de texto y figuras de documentos, y observamos una mejora general, lo que verifica la utilidad del preentrenamiento de MatCha en tareas de lenguaje visual más amplias.*

## Descripción del modelo

MatCha es un modelo entrenado con la arquitectura `Pix2Struct`. Puede encontrar más información sobre `Pix2Struct` en la [documentación de Pix2Struct](./pix2struct). MatCha es un subconjunto de Visual Question Answering de la arquitectura `Pix2Struct`. Representa la pregunta de entrada en la imagen y predice la respuesta.

## Uso

Actualmente hay 6 puntos de control disponibles para MatCha:

- `google/matcha`: el modelo base de MatCha, utilizado para ajustar MatCha en tareas posteriores
- `google/matcha-chartqa`: Modelo MatCha ajustado finamente en el conjunto de datos ChartQA. Puede usarse para responder preguntas sobre gráficos.
- `google/matcha-plotqa-v1`: Modelo MatCha ajustado en el conjunto de datos PlotQA. Puede usarse para responder preguntas sobre gráficos.
- `google/matcha-plotqa-v2`: Modelo MatCha ajustado en el conjunto de datos PlotQA. Puede usarse para responder preguntas sobre gráficos.
- `google/matcha-chart2text-statista`: Modelo MatCha ajustado finamente en el conjunto de datos Statista.
- `google/matcha-chart2text-pew`: Modelo MatCha ajustado finamente en el conjunto de datos Pew.

Los modelos ajustados en `chart2text-pew` y `chart2text-statista` son más adecuados para la resumición, mientras que los modelos ajustados en `plotqa` y `chartqa` son más adecuados para la respuesta a preguntas.

Puede utilizar estos modelos de la siguiente manera (ejemplo en un conjunto de datos de 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 ajustar MatCha, consulte el [cuaderno de ajuste fino](https://github.com/huggingface/notebooks/blob/main/examples/image_captioning_pix2struct.ipynb) de pix2struct. Para los modelos `Pix2Struct`, hemos encontrado que ajustar el modelo con Adafactor y un programador de tasa de aprendizaje coseno conduce a una convergencia más 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 es un modelo entrenado con la arquitectura `Pix2Struct`. Puede encontrar más información sobre `Pix2Struct` en la [documentación de Pix2Struct](./pix2struct).

