# Ovis-Image

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

Ovis-Image adalah model teks-ke-gambar 7B yang dioptimalkan secara khusus untuk rendering teks berkualitas tinggi, dirancang untuk beroperasi secara efisien di bawah batasan komputasi yang ketat.

[Laporan Teknis Ovis-Image](https://arxiv.org/abs/2511.22982) dari Alibaba Group, oleh Guo-Hua Wang, Liangfu Cao, Tianyu Cui, Minghao Fu, Xiaohao Chen, Pengxin Zhan, Jianshan Zhao, Lan Li, Bowen Fu, Jiaqi Liu, Qing-Guo Chen.

Abstrak dari makalah tersebut adalah:

*Kami memperkenalkan Ovis-Image, model teks-ke-gambar 7B yang dioptimalkan secara khusus untuk render teks berkualitas tinggi, dirancang agar beroperasi secara efisien di bawah kendala komputasi yang ketat. Dibangun di atas kerangka kerja Ovis-U1 kami sebelumnya, Ovis-Image mengintegrasikan dekode visual berbasis difusi dengan backbone multimodal Ovis 2.5 yang lebih kuat, memanfaatkan pipeline pelatihan berpusat pada teks yang menggabungkan pra-pelatihan skala besar dengan penyempurnaan pasca-pelatihan yang dirancang dengan cermat. Meskipun arsitekturnya kompak, Ovis-Image mencapai kinerja render teks yang setara dengan model terbuka yang jauh lebih besar seperti Qwen-Image dan mendekati sistem sumber-tertutup seperti Seedream dan GPT4o. Yang penting, model ini tetap dapat di-deploy pada satu GPU kelas atas dengan memori moderat, sehingga memperkecil kesenjangan antara render teks tingkat frontier dan implementasi praktis. Hasil kami menunjukkan bahwa penggabungan backbone multimodal yang kuat dengan resep pelatihan berfokus-teks yang dirancang dengan cermat sudah cukup untuk mencapai render teks dwibahasa yang andal tanpa harus mengandalkan model berukuran besar atau milik pihak ketiga.*

**Highlight**:

*   **Render teks yang kuat pada skala 7B yang ringkas**: Ovis-Image adalah model teks-ke-gambar 7B yang memberikan kualitas render teks yang setara dengan sistem 20B kelas yang jauh lebih besar seperti Qwen-Image dan kompetitif dengan model sumber-tertutup terkemuka seperti GPT4o dalam skenario yang berpusat pada teks, sambil tetap cukup kecil untuk dijalankan pada perangkat keras yang mudah diakses.
*   **Fidelitas tinggi pada prompt yang padat teks dan sensitif terhadap tata letak**: Model ini unggul pada prompt yang menuntut keselarasan ketat antara konten linguistik dan tipografi yang dirender (misalnya, poster, spanduk, logo, mockup UI, infografis), menghasilkan teks yang mudah dibaca, dieja dengan benar, dan konsisten secara semantik di berbagai jenis huruf, ukuran, dan rasio aspek tanpa mengorbankan kualitas visual keseluruhan.
*   **Efisiensi dan kemampuan penerapan**: Dengan anggaran 7B parameter dan arsitektur yang ramping, Ovis-Image dapat berjalan di satu GPU kelas atas dengan memori moderat, mendukung penggunaan interaktif berlatensi rendah, dan dapat diskalakan untuk penyajian produksi berbasis batch, sehingga menghadirkan kemampuan render teks yang mendekati model frontier ke dalam aplikasi di mana model dengan puluhan miliar parameter tidak praktis.

Pipeline ini disumbangkan oleh Ovis-Image Team. Basis kode aslinya dapat ditemukan [di sini](https://github.com/AIDC-AI/Ovis-Image).

Model yang tersedia:

| Model | dtype yang direkomendasikan |
|:-----:|:-----------------:|
| [`AIDC-AI/Ovis-Image-7B`](https://huggingface.co/AIDC-AI/Ovis-Image-7B) | `torch.bfloat16` |

Lihat [koleksi ini](https://huggingface.co/collections/AIDC-AI/ovis-image) untuk informasi lebih lanjut.

## OvisImagePipeline[[diffusers.OvisImagePipeline]]

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

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

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L129)

**Parameter:**

transformer ([OvisImageTransformer2DModel](/docs/diffusers/v0.43.0/id/api/models/ovisimage_transformer2d#diffusers.OvisImageTransformer2DModel)) : Arsitektur Conditional Transformer (MMDiT) untuk mendenoise latens gambar yang telah dikodekan.

scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/id/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : Penjadwal yang digunakan bersama `transformer` untuk menghilangkan noise pada latens gambar yang telah dikodekan.

vae ([AutoencoderKL](/docs/diffusers/v0.43.0/id/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten.

text_encoder (`Qwen3Model`) : Pengkode teks dari kelas [Qwen3Model](https://huggingface.co/docs/transformers/en/model_doc/qwen3#transformers.Qwen3Model).

tokenizer (`Qwen2TokenizerFast`) : Tokenizer dari kelas [Qwen2TokenizerFast](https://huggingface.co/docs/transformers/en/model_doc/qwen2#transformers.Qwen2TokenizerFast).

Pipeline Ovis-Image untuk generasi teks-ke-gambar.

Referensi: 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)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L457)

**Parameter:**

prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus melewatkan `prompt_embeds` sebagai gantinya.

negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan `negative_prompt_embeds` sebagai gantinya. Diabaikan saat tidak menggunakan guidance (yaitu, diabaikan jika `guidance_scale` tidak lebih besar dari `1`).

guidance_scale (`float`, *opsional*, default 1.0) : True classifier-free guidance (skala panduan) diaktifkan ketika `guidance_scale` > 1 dan `negative_prompt` disediakan.

height (`int`, *opsional*, defaultnya self.unet.config.sample_size * self.vae_scale_factor) : Tinggi gambar yang dihasilkan dalam piksel. Ini diatur ke 1024 secara default untuk hasil terbaik.

width (`int`, *opsional*, defaultnya self.unet.config.sample_size * self.vae_scale_factor) : Lebar gambar yang dihasilkan dalam piksel. Ini diatur ke 1024 secara default untuk hasil terbaik.

num_inference_steps (`int`, *opsional*, defaultnya 50) : Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat.

sigmas (`list[float]`, *opsional*) : Sigmas kustom untuk digunakan dalam proses denoising dengan scheduler yang mendukung argumen `sigmas` di metode `set_timesteps` mereka. Jika tidak didefinisikan, perilaku default saat `num_inference_steps` diteruskan akan digunakan.

num_images_per_prompt (`int`, *opsional*, default 1) : Jumlah gambar yang akan dihasilkan per prompt.

generator (`torch.Generator` atau `list[torch.Generator]`, *opsional*) : Satu atau daftar [generator torch](https://pytorch.org/docs/stable/generated/torch.Generator.html) untuk membuat proses generasi menjadi deterministik.

latents (`torch.FloatTensor`, *opsional*) : Laten berisik yang telah dibuat sebelumnya, diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor laten akan dibuat dengan pengambilan sampel menggunakan `generator` acak yang diberikan.

prompt_embeds (`torch.FloatTensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input `negative_prompt`.

output_type (`str`, *opsional*, defaultnya `"pil"`) : Format output dari gambar yang dihasilkan. Pilih antara [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` atau `np.array`.

return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `~pipelines.flux.FluxPipelineOutput` alih-alih tuple biasa.

joint_attention_kwargs (`dict`, *opsional*) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttentionProcessor` seperti yang didefinisikan di bawah `self.processor` dalam [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).

callback_on_step_end (`Callable`, *opsional*) : Fungsi yang dipanggil di akhir setiap langkah denoising selama inferensi. Fungsi ini dipanggil dengan argumen berikut: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` akan berisi daftar semua tensor sesuai yang ditentukan oleh `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`List`, *opsional*) : Daftar input tensor untuk fungsi `callback_on_step_end`. Tensor yang ditentukan dalam daftar akan diteruskan sebagai argumen `callback_kwargs`. Anda hanya dapat menyertakan variabel yang tercantum dalam atribut `._callback_tensor_inputs` dari kelas pipeline Anda.

max_sequence_length (`int` defaultnya 512) : Panjang maksimum sekuens yang digunakan dengan `prompt`.

**Mengembalikan:** [OvisImagePipelineOutput](/docs/diffusers/v0.43.0/id/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput) atau `tuple`

[OvisImagePipelineOutput](/docs/diffusers/v0.43.0/id/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput) jika `return_dict` bernilai True, selain itu berupa `tuple`. Saat mengembalikan tuple, elemen pertama adalah daftar berisi gambar yang dihasilkan.

Fungsi yang dipanggil saat memanggil pipeline untuk generasi.

Contoh:
```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)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/ovis_image/pipeline_ovis_image.py#L269)

**Parameter:**

prompt (`str` atau `list[str]`, *opsional*) : prompt yang akan dienkod

negative_prompt (`str` atau `list[str]`, *opsional*) : Prompt atau prompt-prompt yang tidak akan memandu generasi gambar. Hanya digunakan ketika `do_classifier_free_guidance` adalah `True`. Jika tidak didefinisikan, string kosong akan digunakan.

do_classifier_free_guidance (`bool`, *opsional*, defaultnya `True`) : Apakah `negative_prompt` juga akan dienkod untuk classifier-free guidance.

device : (`torch.device`): perangkat torch

num_images_per_prompt (`int`) : jumlah gambar yang harus dihasilkan per prompt

max_sequence_length (`int`, *opsional*, default 256) : Panjang maksimum urutan yang digunakan untuk `prompt`.

prompt_embeds (`torch.FloatTensor`, *opsional*) : Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, *misalnya* penimbangan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *opsional*) : Embedding teks negatif yang telah dibuat sebelumnya. Jika tidak disediakan, embedding ini akan dibuat dari `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])
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/ovis_image/pipeline_output.py#L24)

**Parameter:**

images (`list[PIL.Image.Image]` atau `np.ndarray`) : Daftar gambar PIL yang telah didenois dengan panjang `batch_size` atau array numpy dengan bentuk `(batch_size, height, width, num_channels)`. Gambar PIL atau array numpy menyajikan gambar-gambar yang telah didenois dari pipeline difusi.

Kelas output untuk pipeline Ovis-Image.

