Diffusers documentation

Bria Fibo 2.0

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Bria Fibo 2.0

Fibo 2.0은 Bria에서 개발한 8.1B 파라미터의 flow-matching transformer로, 구조화된 JSON 캡션을 입력받아 이미지를 생성합니다. 텍스트 인코더로는 Qwen3-VL을 사용하며, Perceiver가 Qwen3-VL의 hidden states를 gist tokens으로 압축하여 이미지 토큰과 하나의 스트림으로 결합합니다. 또한 transformer 블록 중 5개는 gated cross-attention을 통해 Qwen3-VL을 직접 참조합니다.

두 개의 체크포인트가 있습니다:

  • briaai/Fibo-2.0-dev는 classifier-free guidance를 지원하는 텍스트-이미지 생성 및 편집용 전체 모델입니다. 이 파이프라인의 기본값인 30 steps와 guidance 5는 이 체크포인트를 위한 것입니다.
  • briaai/Fibo-2.0-edit-turbo는 guidance 없이 4단계로 편집을 수행하도록 distilled된 모델입니다 (guidance_scale=1.0).

가이던스가 켜져 있을 때, 기본 네거티브 프롬프트는 모델이 학습된 널 캡션, 즉 모든 값이 비어 있는 구조화된 캡션입니다.

생성

Fibo 2.0은 구조화된 JSON 캡션으로 학습되어 자유 형식 텍스트에서는 잘 작동하지 않습니다. 캡션을 JSON 문자열로 전달하세요:

import json

import torch
from diffusers import BriaFibo2Pipeline

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")

caption = {
    "short_description": "A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.",
    "objects": [
        {
            "description": "A red vintage bicycle with a wicker basket of lemons on its handlebars.",
            "location": "center",
            "relative_size": "large within frame",
        }
    ],
    "background_setting": "A whitewashed wall with a blue wooden door and potted red geraniums.",
    "lighting": {"conditions": "bright morning sun", "direction": "from the right", "shadows": "long and crisp"},
    "aesthetics": {"composition": "centered", "color_scheme": "red, white and blue", "mood_atmosphere": "calm"},
    "photographic_characteristics": {"depth_of_field": "deep", "focus": "sharp on the bicycle", "camera_angle": "eye level"},
    "style_medium": "photograph",
    "context": "A travel photograph.",
    "artistic_style": "realistic",
}
image = pipe(json.dumps(caption)).images[0]
image.save("bicycle.png")

Pipeline은 학습 시와 동일한 방식으로 캡션을 정리합니다. 비어 있는 값과 학습 캡션에 존재하지 않았던 aesthetic_score 및 preference_score 필드를 제거하고, 캡션을 간결하게 직렬화합니다. 두 가지 짧은 형식도 학습되었으며 그대로 유지됩니다:

# The caption's short description alone, as plain text
image = pipe("A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.").images[0]

# Exactly a "short_description" and a "text_render" list. The list is kept even when it's empty, to say the image
# has no text
caption = {"short_description": "A bakery storefront at dawn with a painted sign.", "text_render": [{"text": "FRESH BREAD"}]}
image = pipe(json.dumps(caption)).images[0]

자유 형식 텍스트를 구조화된 캡션으로 변환하려면 Bria Fibo 페이지의 프롬프트-JSON 모델을 참조하세요.

편집

동일한 파이프라인으로 이미지를 편집할 수 있습니다. 이미지를 image로 전달하고 편집 지시를 프롬프트로 전달하세요:

import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image).images[0]
edited.save("pikachu_snow.png")

더 빠른 편집을 위해 turbo 체크포인트를 로드하고 guidance를 끕니다:

import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-edit-turbo", dtype=torch.bfloat16).to("cuda")
image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image, num_inference_steps=4, guidance_scale=1.0).images[0]
edited.save("pikachu_snow.png")

아래 예제는 pipe와 image를 가진 어느 하나에서 시작합니다. turbo 체크포인트를 사용하는 경우 각 호출에 num_inference_steps=4와 guidance_scale=1.0을 전달하세요.

편집 프롬프트

프롬프트는 "edit_instruction" 키와 결과 캡션을 포함하는 JSON 객체일 수도 있습니다. 이때 캡션은 Fibo 2.0이 편집하도록 학습된 형태 중 하나여야 합니다. 파이프라인은 이를 Fibo 2.0이 편집하도록 학습된 프롬프트로 변환합니다.

완전한 캡션: "edit_instruction" 옆에 있는 캡션의 키들입니다. Bria의 prompt-to-JSON 모델이 편집을 위해 작성하는 형식입니다. 파이프라인은 빈 값과 aesthetic_score, preference_score 필드를 제거합니다. 학습 과정에서 모든 캡션에서 이 필드들이 제거되었기 때문입니다.

import json

prompt = {
    "short_description": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
    "objects": [{"description": "A crocheted yellow Pikachu doll with red cheeks.", "location": "center"}],
    "background_setting": "A snowy pine forest with falling snow.",
    "edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

짧은 설명: "structured_caption" 키에 있는 문자열.

prompt = {
    "structured_caption": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
    "edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

짧은 설명과 그 텍스트: 정확히 "short_description"와 "text_render" 리스트입니다. 리스트는 비어 있더라도 유지되며, 이는 Fibo 2.0에 결과가 텍스트가 없음을 알립니다. "structured_caption" 키에는 이 형태나 전체 캡션도 담을 수 있습니다.

prompt = {
    "short_description": "A crocheted yellow Pikachu doll holding a small wooden sign.",
    "text_render": [{"text": "HELLO"}],
    "edit_instruction": "Give the doll a small wooden sign that reads HELLO",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

여러 이미지

최대 5개의 이미지를 함께 편집할 수 있으며, 예를 들어 한 이미지의 객체를 다른 이미지로 옮기는 작업이 가능합니다. 지시문에서는 <image_1>, <image_2> 순서대로 이미지를 참조합니다.

cat = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
edited = pipe("Put the cat from <image_2> next to the doll in <image_1>", image=[image, cat]).images[0]

출력 크기

height와 width가 지정되지 않으면, 결과는 첫 번째 이미지의 종횡비에 대해 Fibo 2.0이 학습된 크기를 사용하며, 약 1메가픽셀입니다. 단일 이미지는 결과 크기로 잘립니다. 여러 이미지는 각각 자체 종횡비에 대한 학습된 크기로 잘립니다.

edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]

마스크된 편집

mask는 단일 이미지에서 재생성할 영역을 표시하며, 이미지의 크기에 맞춰 검은 배경 위에 흰색으로 표현됩니다. Fibo 2.0은 해당 영역이 회색으로 처리된 이미지의 편집으로 학습되었으며, 파이프라인은 이미지가 인코딩되기 전에 동일한 방식으로 해당 영역을 회색으로 처리합니다. 즉, 128에서 이진화된 마스크를 통해 균일한 (128, 128, 128) 회색을 적용합니다.

from PIL import Image, ImageDraw

mask = Image.new("L", image.size, 0)
ImageDraw.Draw(mask).rectangle((image.width // 2, 0, image.width, image.height // 2), fill=255)
edited = pipe("Add a red balloon floating in the sky", image=image, mask=mask).images[0]

이미지 내 텍스트

캡션이 text_render 항목에서 텍스트를 요구할 때, Fibo 2.0은 Qwen3-VL이 각 텍스트를 개별적으로 확인하는 경우 더 잘 렌더링하는 경향이 있습니다. 파이프라인은 기본적으로 학습 시와 동일한 방식으로 이러한 이미지를 그리며, 이를 비활성화할 수도 있습니다. 위의 베이커리처럼 텍스트가 포함된 캡션의 경우:

prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]

트레이닝 과정에서 Fibo 2.0은 일부 캡션에는 텍스트가 포함된 이미지를, 다른 캡션에는 텍스트가 없는 이미지를 보여주도록 학습되었기 때문에 두 경우 모두 정상적으로 작동합니다.

  • text가 있는 각 text_render 항목에는 이미지가 생성됩니다: 흰색 배경에 검은색으로 Pillow의 내장 폰트 크기 20으로 한 줄에 텍스트를 표시합니다. 256자를 초과하는 텍스트는 256자 단위로 줄바꿈됩니다.
  • fonts 목록에서 해당 글자를 포함하는 첫 번째 폰트로 폰트가 없는 문자를 렌더링합니다. 학습에는 Aileron, 그다음 DejaVu Sans가 사용되었으며, 이 두 폰트는 briaai/Fibo-2.0-dev의 fonts 폴더에 있습니다. fonts가 없으면 Pillow의 내장 폰트가 렌더링하는 대로 해당 문자가 표시되며, 파이프라인에서 경고가 발생합니다.
  • pipeline은 각 항목의 이미지에 대해 image_tokens 필드로 표시하며, Qwen3-VL은 편집할 이미지 뒤에 있는 이미지들을 인식합니다.
  • pipe.text_images_max_noise_level(0.9)보다 노이즈 레벨이 높은 동안 생성은 이미지 없이 캡션으로 첫 단계를 실행합니다. 편집은 모든 단계에서 이미지를 사용합니다.
  • text가 없는 캡션은 이미지를 생성하지 않으며, 학습 시와 마찬가지로 짧은 설명도 마찬가지입니다.

학습에 사용된 폰트로 그립니다:

from huggingface_hub import hf_hub_download

fonts = [
    hf_hub_download("briaai/Fibo-2.0-dev", name, subfolder="fonts")
    for name in ("Aileron-Regular.otf", "DejaVuSans.ttf")
]
image = pipe(prompt, fonts=fonts).images[0]

이미지를 직접 그리려면, 단일 프롬프트에 대해 text가 있는 각 text_render 항목에 대해 순서대로 하나씩 text_images로 전달하세요. 이 이미지들은 파이프라인 자체의 이미지보다 우선합니다. 학습 시와 다르게 그린 이미지는 분포 밖(out of distribution)에 해당합니다.

Attention 백엔드

Transformer는 diffusers의 attention backends 중 하나에서 실행되며, 예를 들어 H100과 같은 Hopper GPU에서 FlashAttention-3를 사용할 수 있습니다:

pipe.transformer.set_attention_backend("_flash_3_varlen_hub")

_flash_3_hub도 단일 프롬프트에 사용할 수 있지만, 마스크를 지원하지 않으므로 서로 길이가 다른 프롬프트의 배치 실행은 불가능합니다(아래 참조).

배칭

여러 프롬프트를 한 번의 호출로 생성할 수 있습니다. 길이가 다른 프롬프트는 패딩되며, 이 패딩은 모든 어텐션 레이어에서 마스크 처리되므로, 이러한 배치에는 마스크를 지원하는 어텐션 백엔드가 필요합니다. 기본 백엔드 또는 flash_varlen과 같은 varlen 백엔드를 사용할 수 있습니다. float32에서는 배치 호출이 개별 호출의 이미지와 동일하게 재현됩니다. bfloat16에서는 패딩된 입력과 패딩되지 않은 입력 간에 어텐션 커널이 다르므로, 배치된 이미지는 세부 사항에서 단일 호출과 다를 수 있습니다.

BriaFibo2Pipeline

클래스 diffusers.BriaFibo2Pipeline

< >

( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )

매개변수

  • transformer (BriaFibo2Transformer2DModel) — 이미지 latents의 노이즈를 제거하는 transformer입니다.
  • scheduler (FlowMatchEulerDiscreteScheduler) — transformer와 함께 latents의 노이즈를 제거하는 데 사용되는 스케줄러.
  • vae (AutoencoderKLFlux2) — 이미지를 latent으로 변환하고 다시 원래 이미지로 복원하는 변분 오토인코더입니다.
  • text_encoder (Qwen3VLForConditionalGeneration) — Qwen3-VL입니다. 이 모델의 hidden states가 transformer를 조건화합니다.
  • processor (Qwen3VLProcessor) — 프롬프트와 편집할 이미지를 Qwen3-VL 입력으로 변환합니다.

Fibo 2.0을 활용한 텍스트-이미지 생성 및 이미지 편집을 위한 Pipeline입니다.

__call__

< >

( prompt: str | list[str] | None = Noneimage: PIL.Image.Image | list[PIL.Image.Image] | None = Nonemask: PIL.Image.Image | None = Nonetext_images: list[PIL.Image.Image] | None = Nonerender_text_images: bool = Truefonts: list[str] | None = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 30guidance_scale: float = 5.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str = 'pil'return_dict: bool = Truecallback_on_step_end: typing.Optional[typing.Callable[[int, int, dict], NoneType]] = Nonecallback_on_step_end_tensor_inputs: list = ['latents'] ) → BriaFibo2PipelineOutput or tuple

매개변수

  • prompt (str 또는 list[str], 선택 사항) — 이미지 생성을 안내하는 프롬프트입니다. 일반적으로 구조화된 JSON 프롬프트이며, Fibo 2.0의 학습 시 사용된 캡션 정화 방식에 따라 정리가 됩니다. 빈 값과 aesthetic_score, preference_score 필드는 제거되고, 컴팩트하게 직렬화됩니다. image와 함께 사용할 경우 편집 지시문, 또는 "edit_instruction" 키와 결과 캡션을 가진 JSON 객체입니다. 이 객체의 다른 키, 또는 캡션이나 짧은 설명을 포함하는 "structured_caption" 키를 가질 수 있습니다.
  • image (PIL.Image.Image 또는 list[PIL.Image.Image], 선택 사항) — 편집할 이미지 또는 함께 편집할 최대 5개의 이미지입니다. 지시문에서 <image_1>, <image_2> 등으로 참조할 수 있습니다. image가 없으면 파이프라인은 프롬프트로부터 이미지를 생성합니다.
  • mask (PIL.Image.Image, 선택 사항) — 단일 이미지를 편집할 때, image에서 재생성할 영역을 나타내며 검은 배경 위에 흰색으로 표시됩니다. 학습 시와 마찬가지로, 이미지가 인코딩되기 전에 128에서 바이너리로 변환된 마스크를 통해 해당 영역이 회색으로 처리됩니다.
  • text_images (list[PIL.Image.Image], 선택 사항) — 캡션이 요청하는 텍스트의 이미지로, text가 있는 각 text_render 항목에 대해 순서대로 하나씩 제공됩니다. 각 항목의 텍스트는 render_text_images가 렌더링하는 방식과 동일하게 개별적으로 그려집니다. Qwen3-VL은 프롬프트와 함께 이 이미지들을 확인하며, 각 캡션 항목에 해당 이미지가 표시되어 Fibo 2.0이 텍스트를 렌더링하는 데 도움이 됩니다. prompt가 단일 JSON 캡션이어야 하며, render_text_images보다 우선합니다. 생성 과정에서는 노이즈 레벨이 text_images_max_noise_level(0.9)보다 높은 초기 단계에서는 이 이미지 없이 실행되며, 편집 과정에서는 모든 단계에서 이 이미지를 사용합니다.
  • render_text_images (bool, 선택 사항, 기본값 True) — 각 캡션의 text_images를 Fibo 2.0의 학습 시와 동일한 방식으로 렌더링할지 여부입니다. 각 텍스트는 흰색 배경에 검은색으로 한 줄씩 표시되며, Pillow의 내장 폰트 크기 20으로 렌더링됩니다. 해당 폰트에 없는 문자는 fonts 목록 중 해당 문자를 포함하는 첫 번째 폰트로 렌더링됩니다. 텍스트가 없는 캡션과 JSON 캡션이 없는 프롬프트(예: 짧은 설명)는 학습 시와 동일하게 이미지가 생성되지 않습니다.
  • fonts (list[str], 선택) — Pillow의 내장 글꼴에 없는 text_images의 문자를 그릴 글꼴의 경로를 순서대로 지정합니다. 학습에서는 Aileron, 그 다음 DejaVu Sans 순서로 그렸으며, 이 글꼴들은 briaai/Fibo-2.0-dev의 fonts 폴더에 있습니다. 이 글꼴이 없으면 해당 문자는 Pillow의 내장 글꼴이 그리는 대로 표시됩니다.
  • height (int, 선택 사항) — 생성된 이미지의 픽셀 단위 높이입니다. 16으로 나누어떨어져야 합니다. 기본값은 1024이며, 편집 모드에서는 첫 번째 이미지의 종횡비에 대해 Fibo 2.0이 학습된 크기, 약 1메가픽셀입니다.
  • width (int, 선택 사항) — 생성된 이미지의 픽셀 단위 너비입니다. 16으로 나누어떨어져야 합니다. 기본값은 height와 동일합니다.
  • num_inference_steps (int, 선택 사항, 기본값 30) — 디노이징 단계 수입니다.
  • guidance_scale (float, 선택 사항, 기본값 5.0) — Classifier-free guidance scale입니다. 1보다 큰 값은 모든 단계에서 negative prompt를 두 번째 패스로 실행하며, 1.0은 guidance를 끕니다.
  • negative_prompt (str 또는 list[str], 선택) — 가이던스가 켜져 있을 때 피해야 할 방향을 안내하는 프롬프트입니다. 기본값은 Fibo 2.0이 학습에 사용했던 null caption, 즉 모든 값이 비어 있는 구조화된 캡션입니다.
  • num_images_per_prompt (int, 선택 사항, 기본값 1) — 프롬프트당 생성할 이미지의 수입니다.
  • generator (torch.Generator 또는 list[torch.Generator], 선택 사항) — 결정적 생성을 위해 시작 노이즈를 추출하는 데 사용되는 Generator입니다.
  • latents (torch.Tensor, 선택 사항) — (batch_size, 32, height // 8, width // 8) 모양의 사전 생성된 시작 노이즈.
  • prompt_embeds (torch.Tensor, 선택 사항) — prompt 대신 사용되는 encode_prompt에서 사전 계산된 텍스트 임베딩입니다.
  • prompt_embeds_mask (torch.Tensor, 선택 사항) — prompt_embeds와 함께 encode_prompt가 반환한 마스크입니다. 패딩이 적용된 경우 필요합니다.
  • negative_prompt_embeds (torch.Tensor, 선택 사항) — negative_prompt 대신 사용되는, negative prompt의 사전 계산된 텍스트 임베딩입니다.
  • negative_prompt_embeds_mask (torch.Tensor, 선택 사항) — negative_prompt_embeds와 함께 encode_prompt가 반환한 마스크입니다. 패딩이 적용된 경우 필요합니다.
  • output_type (str, 선택 사항, 기본값 "pil") — 출력 형식: "pil", "np", "pt" 또는 "latent".
  • return_dict (bool, 선택 사항, 기본값 True) — 일반 튜플 대신 BriaFibo2PipelineOutput을 반환할지 여부.
  • callback_on_step_end (Callable, 선택 사항) — callback_on_step_end(self, step, timestep, callback_kwargs) 형식으로 각 디노이징 단계의 끝에서 호출되는 함수.
  • callback_on_step_end_tensor_inputs (list[str], 선택 사항, 기본값 ["latents"]) — callback_kwargs에서 callback_on_step_end로 전달되는 텐서입니다.

반환값

BriaFibo2PipelineOutput 또는 tuple

생성된 이미지

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

예:

>>> import json

>>> import torch
>>> from diffusers import BriaFibo2Pipeline
>>> from diffusers.utils import load_image

>>> # Fibo 2.0 reads structured JSON captions, serialized compactly the way it was trained
>>> caption = {
...     "short_description": "A red bicycle leaning against a white brick wall on a sunny morning.",
...     "objects": [{"description": "a red city bicycle with a wicker basket", "location": "center"}],
...     "background_setting": "a white brick wall with a green door",
...     "lighting": {"conditions": "bright morning sun", "direction": "from the right"},
...     "style_medium": "photograph",
... }
>>> prompt = json.dumps(caption, separators=(",", ":"), ensure_ascii=False)

>>> # 30 steps with guidance 5, the defaults
>>> pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
>>> image = pipe(prompt).images[0]
>>> image.save("fibo2.png")

>>> # editing: pass the image, and the instruction as the prompt
>>> image = load_image(
...     "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
... )
>>> edited = pipe("Make the background a snowy forest", image=image).images[0]
>>> edited.save("fibo2_edit.png")

encode_prompt

< >

( prompt: str | list[str]image: list[PIL.Image.Image] | None = Nonedevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_mask: typing.Optional[torch.Tensor] = Nonetext_images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = None )

매개변수

  • prompt (str 또는 list[str]) — 인코딩할 프롬프트입니다. image와 함께 사용할 경우 각 프롬프트는 편집 지시문이거나, "edit_instruction" 키와 결과 캡션을 가진 JSON 객체입니다. 다른 키들이나 캡션 또는 짧은 설명을 담고 있는 "structured_caption" 키를 포함할 수 있습니다. 생성 프롬프트는 주어진 그대로 인코딩됩니다. __call__는 먼저 Fibo 2.0 학습 시 사용된 형태의 JSON 캡션을 배치합니다.
  • image (list[PIL.Image.Image], 선택 사항) — Qwen3-VL이 인식하는 편집 대상 이미지입니다. 모든 프롬프트는 이 모든 이미지를 편집합니다.
  • device (torch.device, 선택 사항) — 임베딩을 배치할 장치입니다.
  • num_images_per_prompt (int, 기본값 1) — 프롬프트당 생성할 이미지 수.
  • prompt_embeds (torch.Tensor, 선택 사항) — prompt 대신 사용되는, (batch_size, 6, text_len, 7680) 형태의 사전 계산된 텍스트 임베딩.
  • prompt_embeds_mask (torch.Tensor, 선택 사항) — prompt_embeds의 실제 토큰에 대한 Bool 마스크로, 형태는 (batch_size, text_len)입니다.
  • text_images (list[PIL.Image.Image] 또는 list[list[PIL.Image.Image]], 선택 사항) — 캡션 텍스트의 이미지로, text가 있는 각 text_render 항목에 대해 순서대로 하나씩 제공하거나 프롬프트별로 목록을 제공합니다. 각 항목에는 해당 이미지의 비전 마커가 부여되며, Qwen3-VL은 편집 대상 이미지 뒤에 이 이미지들을 확인합니다.
Update on GitHub