# DePlot

## Обзор

DePlot был предложен в статье [DePlot: One-shot visual language reasoning by plot-to-table translation](https://huggingface.co/papers/2212.10505) авторов Fangyu Liu, Julian Martin Eisenschlos, Francesco Piccinno, Syrine Krichene, Chenxi Pang, Kenton Lee, Mandar Joshi, Wenhu Chen, Nigel Collier, Yasemin Altun.

В аннотации к статье сказано следующее:

*Визуальный язык, такой как диаграммы и графики, повсеместно присутствует в человеческом мире. Понимание графиков и диаграмм требует развитых навыков рассуждения. Предыдущие модели, демонстрирующие наилучшие результаты (SOTA), требуют как минимум десятков тысяч примеров для обучения, при этом их способности к рассуждению по-прежнему сильно ограничены, особенно в случае сложных запросов, написанных человеком. В данной статье представлена первое решение задачи рассуждения на визуальном языке в режиме one-shot. Мы разбиваем задачу рассуждения на визуальном языке на два этапа: (1) перевод графика в текст и (2) рассуждение на основе переведённого текста. Ключевым элементом данного метода является модуль преобразования модальности, названный DePlot, который переводит изображение графика или диаграммы в линейную таблицу. Выходные данные DePlot можно затем напрямую использовать для формирования промпта для предобученной большой языковой модели (LLM), используя возможности few-shot рассуждения LLM. Для получения DePlot мы стандартизируем задачу перевода графика в таблицу, установив единые форматы задач и метрики, и обучаем DePlot end-to-end на этой задаче. DePlot можно использовать «из коробки» вместе с LLM в режиме plug-and-play. По сравнению с SOTA-моделью, дообученной на более чем >28k точках данных, DePlot+LLM с one-shot промптингом обеспечивает улучшение на 24,0% по сравнению с дообученной SOTA-моделью на запросах, написанных человеком, в задаче chart QA.*

DePlot — это модель, обученная с использованием архитектуры `Pix2Struct`. Дополнительную информацию об архитектуре `Pix2Struct` можно найти в [документации Pix2Struct](./pix2struct). DePlot представляет собой подмножество задачи визуального ответа на вопросы (Visual Question Answering) в рамках архитектуры `Pix2Struct`. Модель отображает входной вопрос на изображении и предсказывает ответ.

## Пример использования

В настоящее время для DePlot доступен один контрольный пункт:

- `google/deplot`: DePlot, дообученный на наборе данных 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))
```

## Доработка

Для дообучения DePlot обратитесь к [ноутбуку по дообучению](https://github.com/huggingface/notebooks/blob/main/examples/image_captioning_pix2struct.ipynb) pix2struct. Для моделей `Pix2Struct` мы выяснили, что дообучение модели с использованием Adafactor и косинусного планировщика скорости обучения приводит к более быстрому сходимости:

```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 — это модель, обученная с использованием архитектуры `Pix2Struct`. Справочник по API см. в [документации `Pix2Struct`](./pix2struct).

