File size: 17,326 Bytes
091f1a3
c260487
091f1a3
87dbe75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c550b7
 
091f1a3
 
87dbe75
 
 
091f1a3
5ec0053
091f1a3
4799099
091f1a3
37f825a
 
586258c
 
091f1a3
 
87dbe75
 
 
 
 
 
 
 
 
68e1e79
 
87dbe75
 
 
d2d9a3a
87dbe75
 
 
 
586258c
87dbe75
 
 
 
 
 
 
 
 
 
 
90f4809
 
0e819ae
87dbe75
 
 
7bea5e4
 
 
 
e5d8ed3
 
 
7bea5e4
 
 
e452509
7bea5e4
 
 
 
 
 
 
 
87dbe75
 
 
 
 
b8f5ed0
87dbe75
 
 
61dc075
87dbe75
b8f5ed0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87dbe75
 
 
 
 
 
 
 
 
b8f5ed0
 
 
87dbe75
 
 
b8f5ed0
87dbe75
 
 
 
 
b8f5ed0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87dbe75
 
eaa1215
 
 
 
 
 
 
 
 
 
001b043
 
 
 
eaa1215
001b043
 
 
 
 
 
 
 
 
eaa1215
87dbe75
 
 
c4cb64d
 
87dbe75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bae6882
87dbe75
 
 
 
bae6882
87dbe75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eadb7e9
 
c4cb64d
eadb7e9
 
87dbe75
 
 
78869f1
 
 
 
 
 
 
 
87dbe75
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
---
base_model: OpenGVLab/InternVL2-1B
library_name: transformers
datasets:
- 5CD-AI/Viet-OCR-VQA
- 5CD-AI/Viet-Doc-VQA
- 5CD-AI/Viet-Doc-VQA-II
- Vi-VLM/Vista
- 5CD-AI/Viet-Receipt-VQA
- 5CD-AI/Viet-Sketches-VQA
- 5CD-AI/Viet-Geometry-VQA
- 5CD-AI/Viet-Wiki-Handwriting
- 5CD-AI/Viet-ComputerScience-VQA
- 5CD-AI/Viet-Handwriting-gemini-VQA
- 5CD-AI/Viet-Menu-gemini-VQA
- 5CD-AI/Viet-Vintext-gemini-VQA
- 5CD-AI/Viet-OpenViVQA-gemini-VQA
- 5CD-AI/Viet-Resume-VQA
- 5CD-AI/Viet-ViTextVQA-gemini-VQA
language:
- vi
- en
pipeline_tag: visual-question-answering
tags:
- vision
---

<div align="center">
  <img src="Vintern_logo.png" width="700"/>
</div>

## Vintern-1B-v2 ❄️ (Viet-InternVL2-1B-v2) - The LLaVA 🌋 Challenger

We are excited to introduce  **Vintern-1B-v2** the Vietnamese 🇻🇳 multimodal model that combines the advanced Vietnamese language model [Qwen2-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct)[1] with the latest visual model, [InternViT-300M-448px](https://huggingface.co/OpenGVLab/InternViT-300M-448px)[2], CVPR 2024. This model excels in tasks such as OCR-VQA, Doc-VQA, and Chart-VQA,... With only 1 billion parameters, it is **4096 context length** finetuned from the [Viet-InternVL2-1B](https://huggingface.co/5CD-AI/Viet-InternVL2-1B) model on over 3 million specialized image-question-answer pairs for optical character recognition 🔍, text recognition 🔤, document extraction 📑, and general VQA. The model can be integrated into various on-device applications 📱, demonstrating its versatility and robust capabilities.

[**\[🤗 HF Demo\]**](https://huggingface.co/spaces/khang119966/Vintern-v2-Demo)

The special thing is that our model can be easily finetuned with a T4 GPU on Google Colab by following the instructions provided at the end of this section.

## Model Details

|      Model Name      |                                     Vision Part                                     |                                        Language Part                                         |                  
| :------------------: | :---------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------: |
|      Vintern-1B-v2      |    [InternViT-300M-448px](https://huggingface.co/OpenGVLab/InternViT-300M-448px)    |            [Qwen2-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct)            |  


Vintern-1B-v2 is a multimodal large language model series, featuring models of various sizes. For each size, we release instruction-tuned models optimized for multimodal tasks. Vintern-1B-v2 consists of [InternViT-300M-448px](https://huggingface.co/OpenGVLab/InternViT-300M-448px), an MLP projector, and [Qwen2-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct).

## Training details 📚

The fine-tuning dataset was meticulously sampled in part from the following datasets:  
[Viet-OCR-VQA 📚](https://huggingface.co/datasets/5CD-AI/Viet-OCR-VQA), [Viet-Doc-VQA 📄](https://huggingface.co/datasets/5CD-AI/Viet-Doc-VQA), [Viet-Doc-VQA-II 📑](https://huggingface.co/datasets/5CD-AI/Viet-Doc-VQA-II), [Vista 🖼️](https://huggingface.co/datasets/Vi-VLM/Vista), [Viet-Receipt-VQA 🧾](https://huggingface.co/datasets/5CD-AI/Viet-Receipt-VQA), [Viet-Sketches-VQA ✏️](https://huggingface.co/datasets/5CD-AI/Viet-Sketches-VQA), [Viet-Geometry-VQA 📐](https://huggingface.co/datasets/5CD-AI/Viet-Geometry-VQA), [Viet-Wiki-Handwriting ✍️](https://huggingface.co/datasets/5CD-AI/Viet-Wiki-Handwriting), [Viet-ComputerScience-VQA 💻](https://huggingface.co/datasets/5CD-AI/Viet-ComputerScience-VQA), [Viet-Handwriting-gemini-VQA 🖋️](https://huggingface.co/datasets/5CD-AI/Viet-Handwriting-gemini-VQA), [Viet-Menu-gemini-VQA 🍽️](https://huggingface.co/datasets/5CD-AI/Viet-Menu-gemini-VQA), [Viet-Vintext-gemini-VQA 📜](https://huggingface.co/datasets/5CD-AI/Viet-Vintext-gemini-VQA), [Viet-OpenViVQA-gemini-VQA 🧠](https://huggingface.co/datasets/5CD-AI/Viet-OpenViVQA-gemini-VQA), [Viet-Resume-VQA 📃](https://huggingface.co/datasets/5CD-AI/Viet-Resume-VQA), [Viet-ViTextVQA-gemini-VQA 📑](https://huggingface.co/datasets/5CD-AI/Viet-ViTextVQA-gemini-VQA)

## Benchmarks 📈

Since there are still many different metrics that need to be tested, **we chose a quick and simple metric first to guide the development of our model**. Our metric is inspired by Lavy[4]. For the time being, we are using GPT-4 to evaluate the quality of answers on two datasets: OpenViVQA and ViTextVQA. Detailed results can be found at the provided [here](https://huggingface.co/datasets/5CD-AI/Vintern-1B-v2-Benchmark-gpt4o-score). The inputs are images, questions, labels, and predicted answers. The model will return a score from 0 to 10 for the corresponding answer quality. The results table is shown below.

<table border="1" cellspacing="0" cellpadding="5">
    <tr align="center">
        <td rowspan="2"><b>Model</b></td>
        <td colspan="2"><b>gpt4o-score</b></td>
    </tr>
    <tr align="center">
        <td><b>OpenViVQA-dev</b></td>
        <td><b>ViTextVQA-dev</b></td>
    </tr>
    <tr align="center">
        <td align="left">Vintern-1B</td>
        <td>7.1/10</td>
        <td>7.6/10</td>
    </tr>
    <tr align="center">
        <td align="left"><b>Vintern-1B-v2</b></td>
        <td><b>7.7/10</b></td>
        <td><b>7.7/10</b></td>
    </tr>
</table>

The benchmark result in [MTVQA](https://github.com/bytedance/MTVQA/tree/main)

| Models                          | Open-Source | Vietnamese Score |
|:----------------------------------:|:-------------:|:------------------:|
| Qwen2-VL 72B (Top 1)                  | ✗            | 41.6             |
| GPT-4o (Top 2)                         | ✗            | 34.2             |
| **Vintern-1B-V2** (Top 3)               | ✓           | **31.7**             |
| Qwen2-VL 7B                      | ✓           | 30.0             |
| Claude3 Opus                     | ✗           | 29.1             |
| GPT-4o mini                      | ✗           | 29.1             |
| GPT-4V                           | ✗           | 28.9             |
| Gemini Ultra                     | ✗           | 28.6             |
| InternVL2 76B                    | ✓           | 26.9             |
| QwenVL Max                       | ✗           | 23.5             |
| Claude3 Sonnet                   | ✗           | 20.8             |
| QwenVL Plus                      | ✗           | 18.1             |
| MiniCPM-V2.5                     | ✓           | 15.3             |
| InternVL-V1.5                    | ✗           | 12.4             |

We are still working on more detailed benchmarks.

## Examples

<div align="center">
  <img src="ex_images/1.png" width="500"/>
</div>

```
User: <image>
Mô tả hình ảnh một cách chi tiết.
Assistant: Bức ảnh là một trang giấy kẻ ô vuông với dòng chữ viết tay bằng mực đen. Bố cục đơn giản, chỉ có nội dung văn bản được viết theo chiều dọc từ trên xuống dưới. Các dòng chữ được sắp xếp theo thứ tự từ trên xuống dưới như sau:

- Nghe thầy đọc thơ
- Em nghe thầy đọc bao ngày
- Tiếng thơ đỏ nắng xanh cây quanh nhà
- Mái chèo nghe vọng sông xa
- Em êm nghe tiếng của bà năm xưa
- Nghe trăng thở động tàu dừa
- Rào rào nghe chuyển con mưa giữa trời
- Thêm yêu tiếng hát nụ cười
- Nghe thơ em thấy đất trời đẹp ra.
- Trần Đăng Khoa
```

<div align="center">
  <img src="ex_images/4.jpg" width="500"/>
</div>

```
User: <image>
Tam giác ABC là gì của đường tròn tâm O ?
Assistant: Tam giác ABC là tam giác nội tiếp của đường tròn tâm O.
```

<div align="center">
  <img src="ex_images/2.jpg" width="500"/>
</div>

```
User: <image>
Mô tả hình ảnh một cách chi tiết.
Assistant: Bức ảnh chụp một con sông ở Việt Nam với những ngôi nhà cổ kính được sơn màu vàng nhạt. Phía trước là một con thuyền nhỏ màu đỏ và một chiếc thuyền lớn màu xanh dương.
Trên thuyền có một người đàn ông đang chèo thuyền. Hai bên bờ sông là những hàng cây xanh mát. Bầu trời trong xanh và có một vài đám mây trắng.
Ở góc dưới bên trái của bức ảnh có dòng chữ "VNEXPRESS".
```

<div align="center">
  <img src="ex_images/3.png" width="400"/>
</div>

```
User: <image>
Mô tả hình ảnh một cách chi tiết.
Assistant: Bức ảnh là một thông báo tuyển dụng của công ty Mobifone. Bố cục được chia thành 3 phần chính:

- Phần đầu tiên là tiêu đề "TUYỂN DỤNG" được in chữ màu đỏ đậm, cỡ chữ lớn, nằm ở vị trí trung tâm phía trên cùng của bức ảnh.

- Phần thứ hai là phần giới thiệu về vị trí và yêu cầu của ứng viên. Phần này được trình bày theo dạng liệt kê các mục:
    - Vị trí: Nhân viên kinh doanh
    - Địa điểm: Thành phố và các huyện Yên Sơn, Sơn Dương, Hàm Yên, Chiêm Hóa
    - Yêu cầu: Trình độ: Tốt nghiệp Trung cấp trở lên, Độ tuổi: Không quá 35 tuổi

- Phần thứ ba là phần giới thiệu về chế độ đãi ngộ. Phần này được trình bày theo dạng liệt kê các mục:
    - Chế độ đãi ngộ:
        - Mức lương: 7.000.000đ - 17.000.000đ
        - Thưởng thi đua hàng tháng, quý: Thưởng theo doanh số
        - Chế độ bảo hiểm theo quy định
        - Được trau dồi các kỹ năng: Giao tiếp, thuyết phục, chăm sóc khách hàng...

Phần cuối cùng là phần "NỘP HỒ SƠ" với thông tin liên lạc của người nộp hồ sơ. Phần này được trình bày theo dạng liệt kê các mục:
    - Người nhận: Trần Thị Thúy
    - Địa chỉ: 547 đường Quang Trung, Tổ 25, Phường Phan Thiết, TP Tuyên Quang
    - Điện thoại liên hệ: 0901.452.888
    - Email nhận hồ sơ: thuy.tranthi.kd@mobifone.vn
    - Thời hạn nộp hồ sơ: đến hết ngày 28/5/2021
```

<div align="center">
  <img src="ex_images/5.jpg" width="400"/>
</div>

```
User: <image>
Con nào sẽ thắng ?
Assistant: Con thỏ sẽ thắng.
```

<div align="center">
  <img src="ex_images/6.png" width="400"/>
</div>


```
User: <image>
Mô tả chi tiết hình ảnh.
Assistant: Bức ảnh hiển thị một đoạn mã nguồn được viết bằng ngôn ngữ lập trình Python. Đoạn mã này bao gồm hai phần:
Phần đầu: Nêu tiêu đề "Example of avoiding complex expressions" (Mô tả ví dụ về việc tránh các hàm phức tạp).
Phần chính: Bao gồm hai hàm square_numbers và main().
Hàm square_numbers nhận một tham số là danh sách số từ 1 đến 4. Hàm này sử dụng vòng lặp for để duyệt qua mỗi số trong danh sách và thêm nó vào danh sách squares. Sau đó, hàm trả về danh sách squares.
Hàm main() tạo một biến numbers với giá trị [1, 2, 3, 4], sau đó gọi hàm square_numbers và ghi kết quả vào biến result. Cuối cùng, hàm print(result) sẽ in ra kết quả của hàm main().
```

## Quickstart

Here provides a code snippet to show you how to load the tokenizer and model and how to generate contents.
To run inference using the model, follow the steps outlined in our Colab inference notebook
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1ZD1oB56PF0lF66RCuTVJYLTEV0tM3CFf?usp=sharing)

```python
import numpy as np
import torch
import torchvision.transforms as T
# from decord import VideoReader, cpu
from PIL import Image
from torchvision.transforms.functional import InterpolationMode
from transformers import AutoModel, AutoTokenizer

IMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)

def build_transform(input_size):
    MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
    transform = T.Compose([
        T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),
        T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),
        T.ToTensor(),
        T.Normalize(mean=MEAN, std=STD)
    ])
    return transform

def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
    best_ratio_diff = float('inf')
    best_ratio = (1, 1)
    area = width * height
    for ratio in target_ratios:
        target_aspect_ratio = ratio[0] / ratio[1]
        ratio_diff = abs(aspect_ratio - target_aspect_ratio)
        if ratio_diff < best_ratio_diff:
            best_ratio_diff = ratio_diff
            best_ratio = ratio
        elif ratio_diff == best_ratio_diff:
            if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
                best_ratio = ratio
    return best_ratio

def dynamic_preprocess(image, min_num=1, max_num=12, image_size=448, use_thumbnail=False):
    orig_width, orig_height = image.size
    aspect_ratio = orig_width / orig_height

    # calculate the existing image aspect ratio
    target_ratios = set(
        (i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if
        i * j <= max_num and i * j >= min_num)
    target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])

    # find the closest aspect ratio to the target
    target_aspect_ratio = find_closest_aspect_ratio(
        aspect_ratio, target_ratios, orig_width, orig_height, image_size)

    # calculate the target width and height
    target_width = image_size * target_aspect_ratio[0]
    target_height = image_size * target_aspect_ratio[1]
    blocks = target_aspect_ratio[0] * target_aspect_ratio[1]

    # resize the image
    resized_img = image.resize((target_width, target_height))
    processed_images = []
    for i in range(blocks):
        box = (
            (i % (target_width // image_size)) * image_size,
            (i // (target_width // image_size)) * image_size,
            ((i % (target_width // image_size)) + 1) * image_size,
            ((i // (target_width // image_size)) + 1) * image_size
        )
        # split the image
        split_img = resized_img.crop(box)
        processed_images.append(split_img)
    assert len(processed_images) == blocks
    if use_thumbnail and len(processed_images) != 1:
        thumbnail_img = image.resize((image_size, image_size))
        processed_images.append(thumbnail_img)
    return processed_images

def load_image(image_file, input_size=448, max_num=12):
    image = Image.open(image_file).convert('RGB')
    transform = build_transform(input_size=input_size)
    images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
    pixel_values = [transform(image) for image in images]
    pixel_values = torch.stack(pixel_values)
    return pixel_values

model = AutoModel.from_pretrained(
    "5CD-AI/Vintern-1B-v2",
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
    trust_remote_code=True,
).eval().cuda()
tokenizer = AutoTokenizer.from_pretrained("5CD-AI/Vintern-1B-v2", trust_remote_code=True, use_fast=False)

test_image = 'test-image.jpg'

pixel_values = load_image(test_image, max_num=12).to(torch.bfloat16).cuda()
generation_config = dict(max_new_tokens= 1024, do_sample=False, num_beams = 3, repetition_penalty=2.5)

question = '<image>\nMô tả hình ảnh một cách chi tiết.'

response, history = model.chat(tokenizer, pixel_values, question, generation_config, history=None, return_history=True)
print(f'User: {question}\nAssistant: {response}')

#question = "Câu hỏi khác ......"
#response, history = model.chat(tokenizer, pixel_values, question, generation_config, history=history, return_history=True)
#print(f'User: {question}\nAssistant: {response}')
```

## Finetune on your Data

[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1bK6fpWfResjv9UxWoKHDStXQ8bop3a6Z?usp=sharing)


## Citation 

```
@misc{doan2024vintern1befficientmultimodallarge,
      title={Vintern-1B: An Efficient Multimodal Large Language Model for Vietnamese}, 
      author={Khang T. Doan and Bao G. Huynh and Dung T. Hoang and Thuc D. Pham and Nhat H. Pham and Quan T. M. Nguyen and Bang Q. Vo and Suong N. Hoang},
      year={2024},
      eprint={2408.12480},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2408.12480}, 
}
```

## References

[1] Yang, An, et al. "Qwen2 technical report." arXiv preprint arXiv:2407.10671 (2024).

[2] Chen, Zhe, et al. "Internvl: Scaling up vision foundation models and aligning for generic visual-linguistic tasks." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2024.

[3] Chen, Zhe, et al. "How far are we to gpt-4v? closing the gap to commercial multimodal models with open-source suites." arXiv preprint arXiv:2404.16821 (2024).

[4] Tran, Chi, and Huong Le Thanh. "LaVy: Vietnamese Multimodal Large Language Model." arXiv preprint arXiv:2404.07922 (2024).