# Ovis-Image

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

Ovis-Image는 엄격한 계산 제약 조건 하에서 효율적으로 작동하도록 설계된, 고품질 텍스트 렌더링에 특화하여 최적화된 7B 텍스트-이미지 모델입니다.

Alibaba Group의 Guo-Hua Wang, Liangfu Cao, Tianyu Cui, Minghao Fu, Xiaohao Chen, Pengxin Zhan, Jianshan Zhao, Lan Li, Bowen Fu, Jiaqi Liu, Qing-Guo Chen이 작성한 [Ovis-Image Technical Report](https://arxiv.org/abs/2511.22982)

해당 논문의 초록은 다음과 같습니다:

*고품질 텍스트 렌더링에 특화되어 엄격한 계산 제약 하에서도 효율적으로 작동하도록 최적화된 7B 텍스트-이미지 모델 Ovis-Image를 소개합니다. Ovis-Image는 이전 Ovis-U1 프레임워크를 기반으로, 더 강력한 Ovis 2.5 멀티모달 백본과 확산 기반 시각 디코더를 통합하며, 대규모 사전 학습과 정교하게 설계된 사후 학습 정제를 결합한 텍스트 중심 학습 파이프라인을 활용합니다. 컴팩트한 아키텍처에도 불구하고, Ovis-Image는 Qwen-Image와 같은 훨씬 더 큰 오픈 모델과 동등한 수준의 텍스트 렌더링 성능을 달성하며, Seedream과 GPT4o와 같은 클로즈드 소스 시스템에 근접합니다. 특히, 이 모델은 중간 수준의 메모리를 가진 단일 고성능 GPU에서 배포 가능하여, 최첨단 수준의 텍스트 렌더링과 실용적 배포 사이의 격차를 줄입니다. 우리의 결과는, 과도하게 크거나 독점적인 모델에 의존하지 않고도, 강력한 멀티모달 백본과 신중하게 설계된 텍스트 중심 학습 레시피를 결합하는 것만으로도 신뢰할 수 있는 이중 언어 텍스트 렌더링을 달성하기에 충분함을 보여줍니다.*

**주요 내용**:

*   **컴팩트한 7B 규모에서 강력한 텍스트 렌더링**: Ovis-Image는 Qwen-Image와 같은 훨씬 더 큰 20B급 시스템과 동등한 수준의 텍스트 렌더링 품질을 제공하며, 텍스트 중심 시나리오에서 GPT4o와 같은 선두급 폐쇄형 모델과 경쟁할 수 있을 만큼의 성능을 갖추면서도 널리 접근 가능한 하드웨어에서 실행할 수 있을 만큼 작은 7B 텍스트-이미지 모델입니다.
*   **텍스트가 많고 레이아웃에 민감한 프롬프트에서 높은 충실도**: 언어적 내용과 렌더링된 타이포그래피 간의 정밀한 정렬이 요구되는 프롬프트(예: 포스터, 배너, 로고, UI 목업, 인포그래픽)에서 모델이 뛰어난 성능을 발휘합니다. 다양한 폰트, 크기, 종횡비에서 가독성이 높고 철자가 정확하며 의미적으로 일관된 텍스트를 생성하되, 전반적인 시각적 품질을 해치지 않습니다.
*   **효율성 및 배포 용이성**: 7B 파라미터 예산과 간결한 아키텍처를 갖춘 Ovis-Image는 중간 수준의 메모리를 가진 단일 고성능 GPU에 적합하며, 낮은 지연 시간의 인터랙티브 사용과 배치 프로덕션 서빙으로의 확장을 지원합니다. 이를 통해 수십억 개 이상의 파라미터를 가진 모델이 비현실적인 애플리케이션에서 프런티어에 근접한 텍스트 렌더링을 제공합니다.

이 파이프라인은 Ovis-Image Team이 기여했습니다. 원본 코드베이스는 [여기](https://github.com/AIDC-AI/Ovis-Image)에서 찾을 수 있습니다.

사용 가능한 모델:

| 모델 | 권장 dtype |
|:-----:|:-----------------:|
| [`AIDC-AI/Ovis-Image-7B`](https://huggingface.co/AIDC-AI/Ovis-Image-7B) | `torch.bfloat16` |

자세한 내용은 [이](https://huggingface.co/collections/AIDC-AI/ovis-image) 컬렉션을 참조하세요.

## OvisImagePipeline[[diffusers.OvisImagePipeline]]

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

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

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

**매개변수:**

transformer ([OvisImageTransformer2DModel](/docs/diffusers/main/ko/api/models/ovisimage_transformer2d#diffusers.OvisImageTransformer2DModel)) : 인코딩된 이미지 레이턴트를 디노이즈하기 위한 조건부 Transformer (MMDiT) 아키텍처.

scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/ko/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : `transformer`와 함께 사용하여 인코딩된 이미지 라텐트를 디노이즈하는 데 사용되는 스케줄러입니다.

vae ([AutoencoderKL](/docs/diffusers/main/ko/api/models/autoencoderkl#diffusers.AutoencoderKL)) : 이미지를 잠재 표현으로 인코딩하고 잠재 표현에서 이미지로 디코딩하는 Variational Auto-Encoder (VAE) 모델입니다.

text_encoder (`Qwen3Model`) : [Qwen3Model](https://huggingface.co/docs/transformers/en/model_doc/qwen3#transformers.Qwen3Model) 클래스의 텍스트 인코더.

tokenizer (`Qwen2TokenizerFast`) : [Qwen2TokenizerFast](https://huggingface.co/docs/transformers/en/model_doc/qwen2#transformers.Qwen2TokenizerFast) 클래스의 토크나이저.

텍스트-이미지 생성을 위한 Ovis-Image 파이프라인.

Reference: https://github.com/AIDC-AI/Ovis-Image

#### __호출__[[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 = ['latents'], max_sequence_length: int = 256)
```

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

**매개변수:**

prompt (`str` 또는 `list[str]`, *선택 사항*) : 이미지 생성을 안내할 프롬프트입니다. 정의되지 않은 경우 `prompt_embeds`를 대신 전달해야 합니다.

negative_prompt (`str` 또는 `list[str]`, *선택 사항*) : 이미지 생성을 유도하지 않을 프롬프트입니다. 정의되지 않은 경우 대신 `negative_prompt_embeds`를 전달해야 합니다. 가이던스를 사용하지 않는 경우 무시됩니다(즉, `guidance_scale`이 `1`보다 크지 않으면 무시됩니다).

guidance_scale (`float`, *선택 사항*, 기본값 1.0) : `guidance_scale` > 1이고 `negative_prompt`가 제공되면 True classifier-free guidance(guidance scale)가 활성화됩니다.

height (`int`, *선택 사항*, 기본값은 self.unet.config.sample_size * self.vae_scale_factor) : 생성된 이미지의 픽셀 단위 높이입니다. 최적의 결과를 위해 기본값은 1024로 설정됩니다.

width (`int`, *선택 사항*, 기본값은 self.unet.config.sample_size * self.vae_scale_factor) : 생성된 이미지의 픽셀 단위 너비입니다. 최적의 결과를 위해 기본값은 1024로 설정됩니다.

num_inference_steps (`int`, *선택 사항*, 기본값 50) : 디노이징 단계의 수입니다. 디노이징 단계가 많을수록 일반적으로 추론 속도가 느려지는 대신 더 높은 품질의 이미지를 생성합니다.

sigmas (`list[float]`, *선택 사항*) : `set_timesteps` 메서드에 `sigmas` 인수를 지원하는 스케줄러의 노이즈 제거 과정에 사용할 커스텀 시그마입니다. 정의되지 않은 경우, `num_inference_steps`가 전달될 때의 기본 동작이 사용됩니다.

num_images_per_prompt (`int`, *선택 사항*, 기본값 1) : 프롬프트당 생성할 이미지의 수.

generator (`torch.Generator` 또는 `list[torch.Generator]`, *선택 사항*) : 생성을 결정적으로 만들기 위한 [torch generator](https://pytorch.org/docs/stable/generated/torch.Generator.html) 하나 또는 목록.

latents (`torch.FloatTensor`, *선택 사항*) : 이미지 생성의 입력으로 사용할 가우시안 분포에서 샘플링된 사전 생성된 노이즈된 latents입니다. 동일한 생성을 다른 프롬프트로 조정하는 데 사용할 수 있습니다. 제공되지 않으면, 제공된 랜덤 `generator`를 사용하여 샘플링하여 latents 텐서가 생성됩니다.

prompt_embeds (`torch.FloatTensor`, *선택 사항*) : 미리 생성된 텍스트 임베딩입니다. 텍스트 입력을 쉽게 조정하는 데 사용할 수 있으며, *예를 들어* 프롬프트 가중치 설정에 활용할 수 있습니다. 제공되지 않으면 `prompt` 입력 인자로부터 텍스트 임베딩이 생성됩니다.

negative_prompt_embeds (`torch.FloatTensor`, *선택*) : 미리 생성된 부정 텍스트 임베딩입니다. 텍스트 입력을 쉽게 조정하는 데 사용할 수 있으며, *예를 들어* 프롬프트 가중치 설정에 활용할 수 있습니다. 제공되지 않으면 `negative_prompt` 입력 인수에서 negative_prompt_embeds가 생성됩니다.

output_type (`str`, *선택 사항*, 기본값 `"pil"`) : 이미지 생성의 출력 형식입니다. [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` 또는 `np.array` 중 하나를 선택합니다.

return_dict (`bool`, *선택 사항*, 기본값 `True`) : 일반 튜플 대신 `~pipelines.flux.FluxPipelineOutput`을 반환할지 여부.

joint_attention_kwargs (`dict`, *선택 사항*) : 지정된 경우 [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py)의 `self.processor` 아래에서 정의된 `AttentionProcessor`로 전달되는 kwargs 사전입니다.

callback_on_step_end (`Callable`, *선택 사항*) : 추론 중 각 디노이징 단계의 끝에서 호출되는 함수입니다. 이 함수는 다음 인수를 받아 호출됩니다: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs`에는 `callback_on_step_end_tensor_inputs`로 지정된 모든 텐서 목록이 포함됩니다.

callback_on_step_end_tensor_inputs (`List`, *선택 사항*) : `callback_on_step_end` 함수의 텐서 입력 목록입니다. 목록에 지정된 텐서는 `callback_kwargs` 인수로 전달됩니다. 파이프라인 클래스의 `._callback_tensor_inputs` 속성에 나열된 변수만 포함할 수 있습니다.

max_sequence_length (`int` 기본값은 512) : `prompt`에 사용할 최대 시퀀스 길이입니다.

**반환값:** [OvisImagePipelineOutput](/docs/diffusers/main/ko/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput) 또는 `tuple`

`return_dict`이 True인 경우 [OvisImagePipelineOutput](/docs/diffusers/main/ko/api/pipelines/ovis_image#diffusers.pipelines.ovis_image.OvisImagePipelineOutput), 그렇지 않으면 `tuple`입니다. tuple을 반환할 경우 첫 번째 요소는 생성된 이미지 목록입니다.

생성을 위해 파이프라인을 호출할 때 호출되는 함수.

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

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

**매개변수:**

prompt (`str` 또는 `list[str]`, *선택 사항*) : 인코딩할 프롬프트

negative_prompt (`str` 또는 `list[str]`, *선택 사항*) : 이미지 생성을 안내하지 않을 프롬프트입니다. `do_classifier_free_guidance`가 `True`인 경우에만 사용됩니다. 정의되지 않으면 빈 문자열이 사용됩니다.

do_classifier_free_guidance (`bool`, *선택 사항*, 기본값 `True`) : classifier-free guidance를 위해 `negative_prompt`도 인코딩할지 여부.

device : (`torch.device`): torch 디바이스

num_images_per_prompt (`int`) : 프롬프트당 생성할 이미지 수

max_sequence_length (`int`, *선택 사항*, 기본값 256) : `prompt`에 사용할 최대 시퀀스 길이입니다.

prompt_embeds (`torch.FloatTensor`, *선택 사항*) : 미리 생성된 텍스트 임베딩입니다. 텍스트 입력을 쉽게 조정하는 데 사용할 수 있으며, *예를 들어* 프롬프트 가중치 설정에 활용할 수 있습니다. 제공되지 않으면 `prompt` 입력 인자로부터 텍스트 임베딩이 생성됩니다.

negative_prompt_embeds (`torch.FloatTensor`, *선택 사항*) : 미리 생성된 부정 텍스트 임베딩입니다. 제공되지 않으면 `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)
```

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

**매개변수:**

images (`list[PIL.Image.Image]` 또는 `np.ndarray`) : 길이가 `batch_size`인 노이즈 제거된 PIL 이미지 목록 또는 `(batch_size, height, width, num_channels)` 모양의 numpy 배열입니다. PIL 이미지 또는 numpy 배열은 diffusion 파이프라인의 노이즈 제거된 이미지를 나타냅니다.

Ovis-Image 파이프라인의 출력 클래스입니다.

