# DePlot

## Tổng quan

DePlot được đề xuất trong bài báo [DePlot: One-shot visual language reasoning by plot-to-table translation](https://huggingface.co/papers/2212.10505) của Fangyu Liu, Julian Martin Eisenschlos, Francesco Piccinno, Syrine Krichene, Chenxi Pang, Kenton Lee, Mandar Joshi, Wenhu Chen, Nigel Collier, Yasemin Altun.

Tóm tắt của bài báo nêu rõ như sau:

*Ngôn ngữ trực quan như biểu đồ và đồ thị rất phổ biến trong thế giới con người. Việc hiểu các biểu đồ và đồ thị đòi hỏi kỹ năng suy luận mạnh mẽ. Các mô hình tiên tiến (SOTA) trước đây cần ít nhất hàng chục nghìn ví dụ huấn luyện và khả năng suy luận của chúng vẫn còn rất hạn chế, đặc biệt là với các truy vấn phức tạp do con người viết. Bài báo này trình bày giải pháp one-shot đầu tiên cho suy luận ngôn ngữ trực quan. Chúng tôi phân tách thách thức của suy luận ngôn ngữ trực quan thành hai bước: (1) dịch từ biểu đồ sang văn bản, và (2) suy luận trên văn bản đã được dịch. Điểm mấu chốt của phương pháp này là một module chuyển đổi phương thức, có tên là DePlot, dịch ảnh của biểu đồ hoặc đồ thị thành một bảng tuyến tính hóa. Đầu ra của DePlot sau đó có thể được sử dụng trực tiếp để prompt một mô hình ngôn ngữ lớn (LLM) đã được huấn luyện trước, khai thác khả năng suy luận few-shot của các LLM. Để có được DePlot, chúng tôi chuẩn hóa tác vụ từ biểu đồ sang bảng bằng cách thiết lập các định dạng tác vụ và chỉ số thống nhất, và huấn luyện DePlot end-to-end trên tác vụ này. DePlot sau đó có thể được sử dụng ngay lập tức cùng với các LLM theo kiểu plug-and-play. So với một mô hình SOTA được finetune trên hơn >28k điểm dữ liệu, DePlot+LLM với chỉ one-shot prompting đạt được mức cải thiện 24,0% so với SOTA finetune trên các truy vấn do con người viết từ tác vụ chart QA.*

DePlot là một mô hình được huấn luyện bằng kiến trúc `Pix2Struct`. Bạn có thể tìm thêm thông tin về `Pix2Struct` trong [tài liệu Pix2Struct](./pix2struct). DePlot là một tập con Visual Question Answering của kiến trúc `Pix2Struct`. Nó hiển thị câu hỏi đầu vào trên hình ảnh và dự đoán câu trả lời.

## Ví dụ sử dụng

Hiện tại có một checkpoint khả dụng cho DePlot:

- `google/deplot`: DePlot được tinh chỉnh trên bộ dữ liệu 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))
```

## Tinh chỉnh

Để tinh chỉnh DePlot, hãy tham khảo [notebook tinh chỉnh](https://github.com/huggingface/notebooks/blob/main/examples/image_captioning_pix2struct.ipynb) của pix2struct. Đối với các mô hình `Pix2Struct`, chúng tôi nhận thấy rằng việc tinh chỉnh mô hình với Adafactor và cosine learning rate scheduler giúp hội tụ nhanh hơn:

```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 là một mô hình được huấn luyện bằng kiến trúc `Pix2Struct`. Để tham khảo API, hãy xem [tài liệu `Pix2Struct`](./pix2struct).

