# Ovis-Image

![concepts](https://github.com/AIDC-AI/Ovis-Image/blob/main/docs/imgs/ovis_image_case.png)

Ovis-Image là mô hình text-to-image 7B được tối ưu hóa đặc biệt cho việc render văn bản chất lượng cao, được thiết kế để hoạt động hiệu quả dưới các ràng buộc tính toán nghiêm ngặt.

[Báo cáo kỹ thuật Ovis-Image](https://arxiv.org/abs/2511.22982) từ Alibaba Group, do Guo-Hua Wang, Liangfu Cao, Tianyu Cui, Minghao Fu, Xiaohao Chen, Pengxin Zhan, Jianshan Zhao, Lan Li, Bowen Fu, Jiaqi Liu, Qing-Guo Chen thực hiện.

Tóm tắt từ bài báo là:

*Chúng tôi giới thiệu Ovis-Image, một mô hình text-to-image 7B được tối ưu hóa đặc biệt cho việc render chữ chất lượng cao, được thiết kế để hoạt động hiệu quả dưới các ràng buộc tính toán nghiêm ngặt. Được xây dựng dựa trên khung Ovis-U1 trước đó của chúng tôi, Ovis-Image tích hợp bộ giải mã thị giác dựa trên diffusion với backbone đa phương thức Ovis 2.5 mạnh hơn, tận dụng quy trình huấn luyện tập trung vào văn bản kết hợp giữa tiền huấn luyện quy mô lớn và các cải tiến hậu huấn luyện được điều chỉnh cẩn thận. Mặc dù có kiến trúc gọn nhẹ, Ovis-Image đạt hiệu suất render chữ ngang bằng với các mô hình mở lớn hơn đáng kể như Qwen-Image và tiệm cận các hệ thống mã nguồn đóng như Seedream và GPT4o. Quan trọng là, mô hình vẫn có thể triển khai trên một GPU cao cấp đơn lẻ với bộ nhớ vừa phải, thu hẹp khoảng cách giữa việc render chữ cấp frontier và triển khai thực tế. Kết quả của chúng tôi cho thấy việc kết hợp một backbone đa phương thức mạnh với công thức huấn luyện tập trung vào văn bản được thiết kế cẩn thận là đủ để đạt được việc render chữ song ngữ đáng tin cậy mà không cần đến các mô hình quá khổ hoặc độc quyền.*

**Những điểm nổi bật**:

*   **Hiệu năng hiển thị văn bản mạnh mẽ ở quy mô 7B gọn nhẹ**: Ovis-Image là mô hình text-to-image 7B mang lại chất lượng hiển thị văn bản tương đương với các hệ thống lớn hơn thuộc lớp 20B như Qwen-Image và cạnh tranh được với các mô hình đóng nguồn hàng đầu như GPT4o trong các kịch bản tập trung vào văn bản, đồng thời vẫn đủ nhỏ để chạy trên phần cứng phổ biến, dễ tiếp cận.
*   **Độ trung thực cao với các prompt nặng về văn bản và nhạy cảm với bố cục**: Mô hình thể hiện xuất sắc với các prompt đòi hỏi sự khớp chặt chẽ giữa nội dung ngôn ngữ và typography được render (ví dụ: poster, banner, logo, UI mockups, infographics), tạo ra văn bản dễ đọc, chính tả đúng và nhất quán về mặt ngữ nghĩa trên nhiều phông chữ, kích thước và tỷ lệ khung hình khác nhau mà không làm giảm chất lượng hình ảnh tổng thể.
*   **Hiệu suất và khả năng triển khai**: Với ngân sách 7B tham số và kiến trúc tối giản, Ovis-Image chạy được trên một GPU cao cấp đơn lẻ với bộ nhớ vừa phải, hỗ trợ sử dụng tương tác có độ trễ thấp và mở rộng lên phục vụ sản xuất theo lô, mang đến khả năng render văn bản gần mức tiên phong cho các ứng dụng mà các mô hình có hàng chục tỷ tham số là không thực tế.

Pipeline này được đóng góp bởi Ovis-Image Team. Mã nguồn gốc có thể được tìm thấy [tại đây](https://github.com/AIDC-AI/Ovis-Image).

Các model có sẵn:

| Mô hình | dtype được khuyến nghị |
|:-----:|:-----------------:|
| [`AIDC-AI/Ovis-Image-7B`](https://huggingface.co/AIDC-AI/Ovis-Image-7B) | `torch.bfloat16` |

Tham khảo bộ sưu tập [này](https://huggingface.co/collections/AIDC-AI/ovis-image) để biết thêm thông tin.

## OvisImagePipeline[[diffusers.OvisImagePipeline]]

#### diffusers.OvisImagePipeline[[diffusers.OvisImagePipeline]]

```python
diffusers.OvisImagePipeline(scheduler: FlowMatchEulerDiscreteScheduler, vae: AutoencoderKL, text_encoder: Qwen3Model, tokenizer: Qwen2Tokenizer, transformer: OvisImageTransformer2DModel)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L129)

**Tham số:**

transformer ([OvisImageTransformer2DModel](/docs/diffusers/main/vi/api/models/ovisimage_transformer2d#diffusers.OvisImageTransformer2DModel)) : Kiến trúc Transformer điều kiện (MMDiT) để khử nhiễu các latents ảnh đã mã hóa.

scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : Một trình lập lịch được sử dụng kết hợp với `transformer` để khử nhiễu các latent ảnh đã mã hóa.

vae ([AutoencoderKL](/docs/diffusers/main/vi/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh sang và từ các biểu diễn ẩn.

text_encoder (`Qwen3Model`) : Bộ mã hóa văn bản của lớp [Qwen3Model](https://huggingface.co/docs/transformers/en/model_doc/qwen3#transformers.Qwen3Model).

tokenizer (`Qwen2TokenizerFast`) : Tokenizer của lớp [Qwen2TokenizerFast](https://huggingface.co/docs/transformers/en/model_doc/qwen2#transformers.Qwen2TokenizerFast).

Pipeline Ovis-Image cho việc tạo ảnh từ văn bản.

Tham khảo: https://github.com/AIDC-AI/Ovis-Image

#### __call__[[diffusers.OvisImagePipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, negative_prompt: str | list[str] = '', guidance_scale: float = 5.0, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, sigmas: list[float] | None = None, num_images_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.FloatTensor] = None, prompt_embeds: typing.Optional[torch.FloatTensor] = None, negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None, output_type: str | None = 'pil', return_dict: bool = True, joint_attention_kwargs: dict[str, typing.Any] | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], max_sequence_length: int = 256)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L457)

**Tham số:**

prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt để hướng dẫn việc tạo ảnh. Nếu không được định nghĩa, bạn phải truyền `prompt_embeds` thay thế.

negative_prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Nếu không được định nghĩa, bạn phải truyền `negative_prompt_embeds` thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu `guidance_scale` không lớn hơn `1`).

guidance_scale (`float`, *optional*, mặc định là 1.0) : True classifier-free guidance (guidance scale) được kích hoạt khi `guidance_scale` > 1 và `negative_prompt` được cung cấp.

height (`int`, *optional*, mặc định là self.unet.config.sample_size * self.vae_scale_factor) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel. Giá trị mặc định là 1024 để đạt kết quả tốt nhất.

width (`int`, *optional*, mặc định là self.unet.config.sample_size * self.vae_scale_factor) : Độ rộng tính bằng pixel của hình ảnh được tạo ra. Mặc định được đặt là 1024 để đạt kết quả tốt nhất.

num_inference_steps (`int`, *optional*, mặc định là 50) : Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn, với cái giá là suy luận chậm hơn.

sigmas (`list[float]`, *optional*) : Các sigma tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ tham số `sigmas` trong phương thức `set_timesteps` của chúng. Nếu không được định nghĩa, hành vi mặc định khi `num_inference_steps` được truyền vào sẽ được sử dụng.

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một hoặc một danh sách [torch generator](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đảm bảo quá trình sinh là tất định.

latents (`torch.FloatTensor`, *tùy chọn*) : Các latents nhiễu đã được tạo trước, được lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo ảnh. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo ra bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

prompt_embeds (`torch.FloatTensor`, *tùy chọn*) : Các vector nhúng văn bản đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *vd.* trọng số của prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *tùy chọn*) : Các vector nhúng văn bản âm đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *vd.* trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào `negative_prompt`.

output_type (`str`, *tùy chọn*, mặc định là `"pil"`) : Định dạng đầu ra của hình ảnh được tạo. Chọn giữa [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` hoặc `np.array`.

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một `~pipelines.flux.FluxPipelineOutput` thay vì một tuple thông thường hay không.

joint_attention_kwargs (`dict`, *tùy chọn*) : Một từ điển kwargs mà nếu được chỉ định sẽ được truyền đến `AttentionProcessor` như đã định nghĩa dưới `self.processor` trong [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).

callback_on_step_end (`Callable`, *tùy chọn*) : Một hàm được gọi vào cuối mỗi bước khử nhiễu trong quá trình suy luận. Hàm này được gọi với các đối số sau: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` sẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởi `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`List`, *tùy chọn*) : Danh sách các đầu vào tensor cho hàm `callback_on_step_end`. Các tensor được chỉ định trong danh sách sẽ được truyền dưới dạng tham số `callback_kwargs`. Bạn chỉ có thể bao gồm các biến được liệt kê trong thuộc tính `._callback_tensor_inputs` của lớp pipeline của bạn.

max_sequence_length (`int` mặc định là 512) : Độ dài tối đa của chuỗi để sử dụng với `prompt`.

**Trả về:** [OvisImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput) hoặc `tuple`

[OvisImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput) nếu `return_dict` là True, ngược lại là một `tuple`. Khi trả về tuple, phần tử đầu tiên là một danh sách chứa các hình ảnh đã tạo.

Hàm được gọi khi gọi pipeline cho việc sinh.

Ví dụ:
```py
>>> import torch
>>> from diffusers import OvisImagePipeline

>>> pipe = OvisImagePipeline.from_pretrained("AIDC-AI/Ovis-Image-7B", torch_dtype=torch.bfloat16)
>>> pipe.to("cuda")
>>> prompt = 'A creative 3D artistic render where the text "OVIS-IMAGE" is written in a bold, expressive handwritten brush style using thick, wet oil paint. The paint is a mix of vibrant rainbow colors (red, blue, yellow) swirling together like toothpaste or impasto art. You can see the ridges of the brush bristles and the glossy, wet texture of the paint. The background is a clean artist's canvas. Dynamic lighting creates soft shadows behind the floating paint strokes. Colorful, expressive, tactile texture, 4k detail.'
>>> image = pipe(prompt, negative_prompt="", num_inference_steps=50, guidance_scale=5.0).images[0]
>>> image.save("ovis_image.png")
```

#### encode_prompt[[diffusers.OvisImagePipeline.encode_prompt]]

```python
encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, device: typing.Optional[torch.device] = None, num_images_per_prompt: int = 1, max_sequence_length: int = 256, prompt_embeds: typing.Optional[torch.FloatTensor] = None, negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L269)

**Tham số:**

prompt (`str` hoặc `list[str]`, *tùy chọn*) : prompt cần được mã hóa

negative_prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn tạo ảnh. Chỉ được sử dụng khi `do_classifier_free_guidance` là `True`. Nếu không được định nghĩa, một chuỗi rỗng sẽ được sử dụng.

do_classifier_free_guidance (`bool`, *tùy chọn*, mặc định là `True`) : Có mã hóa cả `negative_prompt` cho classifier-free guidance hay không.

device : (`torch.device`): thiết bị torch

num_images_per_prompt (`int`) : số lượng hình ảnh cần được tạo cho mỗi prompt

max_sequence_length (`int`, *tuỳ chọn*, mặc định là 256) : Độ dài tối đa của chuỗi để sử dụng cho `prompt`.

prompt_embeds (`torch.FloatTensor`, *tùy chọn*) : Các vector nhúng văn bản đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *vd.* trọng số của prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *tùy chọn*) : Các vector nhúng văn bản âm đã được tạo trước. Nếu không được cung cấp, chúng sẽ được tạo từ `negative_prompt`.

## OvisImagePipelineOutput[[diffusers.pipelines.ovis_image.OvisImagePipelineOutput]]

#### diffusers.pipelines.ovis_image.OvisImagePipelineOutput[[diffusers.pipelines.ovis_image.OvisImagePipelineOutput]]

```python
diffusers.pipelines.ovis_image.OvisImagePipelineOutput(images: list[PIL.Image.Image, numpy.ndarray])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ovis_image/pipeline_output.py#L24)

**Tham số:**

images (`list[PIL.Image.Image]` hoặc `np.ndarray`) : Danh sách các hình ảnh PIL đã khử nhiễu có độ dài `batch_size` hoặc mảng numpy có hình dạng `(batch_size, height, width, num_channels)`. Các hình ảnh PIL hoặc mảng numpy thể hiện các hình ảnh đã khử nhiễu của pipeline khuếch tán.

Lớp đầu ra cho các pipeline Ovis-Image.

