Diffusers documentation
Bria Fibo 2.0
Bria Fibo 2.0
Fibo 2.0 là một transformer flow-matching có 8,1 tỷ tham số từ Bria, tạo ra hình ảnh từ các chú thích JSON có cấu trúc. Bộ mã hóa văn bản của nó là Qwen3-VL: một Perceiver nén các trạng thái ẩn của Qwen3-VL thành các gist token, sau đó chúng được ghép với các image token trong một luồng duy nhất, và năm khối của transformer cũng đọc trực tiếp Qwen3-VL thông qua gated cross-attention.
Có hai checkpoint:
briaai/Fibo-2.0-dev, mô hình đầy đủ cho text-to-image và chỉnh sửa, với classifier-free guidance. Các giá trị mặc định của pipeline, 30 bước với guidance 5, là dành cho checkpoint này.briaai/Fibo-2.0-edit-turbo, được chưng cất để chỉnh sửa trong 4 bước mà không cần hướng dẫn (guidance_scale=1.0).
Khi bật hướng dẫn, prompt âm mặc định là chú thích rỗng mà mô hình được huấn luyện với: chú thích có cấu trúc với mọi giá trị để trống.
Tạo
Fibo 2.0 được huấn luyện trên các chú thích JSON có cấu trúc và sẽ không hoạt động tốt với văn bản tự do. Truyền chú thích dưới dạng chuỗi 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 làm sạch caption theo cách mà quá trình huấn luyện đã thực hiện: nó loại bỏ các giá trị rỗng cùng các trường aesthetic_score và preference_score (không có trong bất kỳ caption huấn luyện nào) và chuỗi hóa caption một cách gọn gàng. Hai dạng ngắn cũng đã được huấn luyện và được giữ nguyên như sau:
# 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]Để chuyển đổi văn bản tự do thành chú thích có cấu trúc, hãy xem các mô hình prompt-to-JSON trên trang Bria Fibo.
Chỉnh sửa
Cùng một pipeline chỉnh sửa hình ảnh. Truyền hình ảnh dưới dạng image và chỉ thị chỉnh sửa dưới dạng prompt:
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")Để chỉnh sửa nhanh hơn, hãy tải checkpoint turbo và tắt 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")Các ví dụ dưới đây tiếp tục từ một trong hai, với pipe và image. Với checkpoint turbo, hãy truyền num_inference_steps=4 và guidance_scale=1.0 cho mỗi lần gọi.
Lời nhắc chỉnh sửa
Prompt cũng có thể là một đối tượng JSON với khóa "edit_instruction" và chú thích của kết quả, theo bất kỳ dạng nào mà Fibo 2.0 được huấn luyện để chỉnh sửa. Pipeline sẽ chuyển đổi nó thành prompt mà Fibo 2.0 được huấn luyện để chỉnh sửa.
Một chú thích đầy đủ: các khóa của chú thích bên cạnh "edit_instruction", như các mô hình prompt-to-JSON của Bria viết cho các chỉnh sửa. Pipeline loại bỏ các giá trị rỗng và các trường aesthetic_score và preference_score, vốn đã bị loại bỏ khỏi mọi chú thích trong quá trình huấn luyện.
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]Mô tả ngắn: một chuỗi trong khóa "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]Mô tả ngắn và văn bản của nó: chính xác là một "short_description" và một danh sách "text_render". Danh sách được giữ lại ngay cả khi trống, điều này cho Fibo 2.0 biết rằng kết quả không có văn bản. Một khóa "structured_caption" có thể chứa dạng này, hoặc một chú thích đầy đủ.
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]Một số hình ảnh
Có thể chỉnh sửa cùng lúc tối đa 5 hình ảnh, ví dụ như đặt một đối tượng từ hình này sang hình khác. Lệnh tham chiếu đến chúng theo thứ tự là <image_1>, <image_2> và tiếp tục như vậy.
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]Kích thước đầu ra
Trừ khi height và width được cung cấp, kết quả sẽ có kích thước mà Fibo 2.0 được huấn luyện cho tỷ lệ khung hình của hình ảnh đầu tiên, khoảng một megapixel. Một hình ảnh đơn lẻ sẽ được cắt xén theo kích thước của kết quả. Nhiều hình ảnh sẽ mỗi hình được cắt xén theo kích thước đã huấn luyện cho tỷ lệ khung hình riêng của chúng.
edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]Chỉnh sửa có mặt nạ
mask đánh dấu vùng của một hình ảnh đơn lẻ cần tạo lại, màu trắng trên nền đen, có kích thước bằng hình ảnh. Fibo 2.0 được huấn luyện trên các chỉnh sửa mà trong đó hình ảnh có vùng đó bị làm mờ, và pipeline cũng làm mờ nó theo cách tương tự trước khi hình ảnh được mã hóa: màu xám phẳng (128, 128, 128), thông qua mask được nhị phân hóa tại ngưỡng 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]Văn bản trong hình ảnh
Khi caption yêu cầu văn bản, trong các mục text_render của nó, Fibo 2.0 có xu hướng hiển thị tốt hơn nếu Qwen3-VL cũng nhìn thấy từng đoạn văn bản được vẽ riêng lẻ. Pipeline vẽ các hình ảnh này theo mặc định, giống như trong quá trình huấn luyện, và chúng có thể được tắt. Đối với một caption có chứa văn bản, chẳng hạn như của tiệm bánh mì ở trên:
prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]Quá trình huấn luyện đã cho Fibo 2.0 xem các hình ảnh này cho một số chú thích có chữ và không cho các chú thích khác, vì vậy nó hoạt động trong cả hai trường hợp.
- Mỗi mục
text_rendercótextsẽ nhận được một hình ảnh: văn bản trên một dòng, màu đen trên nền trắng, dùng phông chữ tích hợp sẵn của Pillow với kích thước 20. Văn bản dài hơn 256 ký tự sẽ được tách thành các dòng 256 ký tự. - Các ký tự mà font thiếu sẽ được vẽ bằng font đầu tiên trong
fontscó chứa chúng. Quá trình huấn luyện đã sử dụng Aileron, sau đó là DejaVu Sans, nằm trong thư mụcfontscủabriaai/Fibo-2.0-dev. Nếu không cófonts, các ký tự như vậy sẽ được vẽ theo cách font tích hợp của Pillow vẽ chúng, và pipeline sẽ phát ra cảnh báo. - Pipeline đánh dấu mỗi mục bằng trường
image_tokenscho hình ảnh của nó, và Qwen3-VL nhìn thấy các hình ảnh sau bất kỳ hình ảnh nào cần chỉnh sửa. - Một lần sinh thực hiện các bước đầu tiên, trong khi mức nhiễu cao hơn
pipe.text_images_max_noise_level(0.9), trên chú thích không có hình ảnh. Một lần chỉnh sửa sử dụng chúng ở mỗi bước. - Một chú thích không có văn bản sẽ không nhận được hình ảnh nào, cũng như một mô tả ngắn, giống như trong quá trình huấn luyện.
Để vẽ chúng bằng các font đã dùng trong quá trình huấn luyện:
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]Để tự vẽ các hình ảnh, hãy truyền chúng dưới dạng text_images, mỗi hình tương ứng với một mục text_render có text, theo thứ tự, cho một prompt duy nhất. Chúng có độ ưu tiên cao hơn so với hình ảnh do pipeline tự tạo. Các hình ảnh được vẽ khác với quá trình huấn luyện sẽ nằm ngoài phân phối.
Các backend chú ý
Transformer chạy trên bất kỳ backend attention nào của diffusers, ví dụ như FlashAttention-3 trên các GPU Hopper như H100:
pipe.transformer.set_attention_backend("_flash_3_varlen_hub")_flash_3_hub cũng hoạt động với một prompt đơn, nhưng nó không nhận mask, vì vậy không thể chạy một batch gồm các prompt có độ dài khác nhau (xem bên dưới).
Batching
Có thể tạo nhiều prompt trong một lần gọi. Các prompt có độ dài khác nhau sẽ được đệm (padding), và phần đệm này sẽ bị che (mask) khỏi mọi lớp attention, do đó một batch như vậy cần một backend attention có hỗ trợ mask: backend mặc định, hoặc một backend varlen như flash_varlen. Ở float32, một batch sẽ tái tạo chính xác các hình ảnh từ các lần gọi riêng lẻ; ở bfloat16, các kernel attention khác nhau giữa đầu vào có đệm và không có đệm, nên các hình ảnh trong batch có thể khác với các lần gọi đơn lẻ ở những chi tiết nhỏ.
BriaFibo2Pipeline
lớp diffusers.BriaFibo2Pipeline
< source >( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )
Tham số
- transformer (BriaFibo2Transformer2DModel) — Transformer khử nhiễu các latents của ảnh.
- scheduler (FlowMatchEulerDiscreteScheduler) —
Trình lập lịch được sử dụng cùng với
transformerđể khử nhiễu các biến tiềm ẩn (latents). - vae (
AutoencoderKLFlux2) — Biến thể tự mã hóa (variational auto-encoder) ánh xạ hình ảnh sang các biến tiềm ẩn (latents) và ngược lại. - text_encoder (
Qwen3VLForConditionalGeneration) — Qwen3-VL. Trạng thái ẩn của nó đóng vai trò điều kiện cho transformer. - processor (
Qwen3VLProcessor) — Biến prompt và các hình ảnh cần chỉnh sửa thành đầu vào cho Qwen3-VL.
Pipeline để tạo ảnh từ văn bản và chỉnh sửa ảnh với Fibo 2.0.
__call__
< source >( 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
Tham số
- prompt (
strhoặclist[str], tùy chọn) — Prompt để hướng dẫn tạo ảnh, thường là một prompt JSON có cấu trúc, được làm sạch theo cách các chú thích (captions) trong quá trình huấn luyện của Fibo 2.0 đã làm sạch: các giá trị rỗng và các trườngaesthetic_scorecùngpreference_scoresẽ bị loại bỏ, sau đó được chuỗi hóa (serialize) ở dạng gọn. Khi dùng cùng vớiimage, đây là chỉ thị chỉnh sửa, hoặc một đối tượng JSON có khóa"edit_instruction"và chú thích của kết quả: các khóa khác của nó, hoặc một khóa"structured_caption"chứa chú thích hoặc một mô tả ngắn. - image (
PIL.Image.Imagehoặclist[PIL.Image.Image], không bắt buộc) — Hình ảnh cần chỉnh sửa, hoặc tối đa 5 hình ảnh để chỉnh sửa cùng nhau, trong đó chỉ thị có thể tham chiếu đến chúng là<image_1>,<image_2>và tương tự. Nếu không cóimage, pipeline sẽ tạo một hình ảnh từ prompt. - mask (
PIL.Image.Image, tùy chọn) — Vùng củaimagecần tái tạo, màu trắng trên nền đen, khi chỉnh sửa một hình ảnh đơn lẻ. Giống như trong quá trình huấn luyện, vùng này sẽ được làm mờ trước khi hình ảnh được mã hóa, thông qua mask được nhị phân hóa tại ngưỡng 128. - text_images (
list[PIL.Image.Image], tùy chọn) — Các hình ảnh của văn bản mà chú thích yêu cầu, mỗi hình tương ứng với một mụctext_rendercó chứatext, theo thứ tự: văn bản của mỗi mục được vẽ riêng biệt, giống như cáchrender_text_imagesvẽ chúng. Qwen3-VL nhìn thấy chúng cùng với prompt, mỗi hình được đánh dấu trong mục chú thích tương ứng, điều này giúp Fibo 2.0 hiển thị văn bản. Yêu cầupromptphải là một chú thích JSON duy nhất và có độ ưu tiên cao hơnrender_text_images. Một quá trình sinh sẽ thực hiện các bước đầu tiên, trong khi mức nhiễu cao hơntext_images_max_noise_level(0.9), mà không sử dụng chúng; một thao tác chỉnh sửa sẽ sử dụng chúng ở mọi bước. - render_text_images (
bool, tùy chọn, mặc định làTrue) — Liệu có vẽtext_imagescủa mỗi caption hay không, theo cách mà quá trình huấn luyện của Fibo 2.0 đã thực hiện: mỗi văn bản trên một dòng, màu đen trên nền trắng, dùng phông chữ tích hợp sẵn của Pillow ở kích thước 20, và các ký tự mà phông đó thiếu sẽ được lấy từ phông đầu tiên trongfontscó chứa chúng. Một caption không có văn bản, và một prompt không có caption JSON, chẳng hạn như một mô tả ngắn, sẽ không nhận được hình ảnh nào, giống như trong quá trình huấn luyện. - fonts (
list[str], tuỳ chọn) — Đường dẫn của các font để vẽ các ký tự củatext_imagesmà font tích hợp sẵn của Pillow không có, theo thứ tự. Quá trình huấn luyện đã vẽ chúng bằng Aileron, sau đó là DejaVu Sans, nằm trong thư mụcfontscủabriaai/Fibo-2.0-dev. Nếu không có chúng, các ký tự như vậy sẽ được vẽ theo cách mà font tích hợp sẵn của Pillow thực hiện. - height (
int, tùy chọn) — Chiều cao của hình ảnh được tạo ra, tính bằng pixel. Phải chia hết cho 16. Mặc định là 1024, hoặc khi chỉnh sửa, là kích thước mà Fibo 2.0 được huấn luyện cho tỷ lệ khung hình của hình ảnh đầu tiên, khoảng một megapixel. - width (
int, tùy chọn) — Chiều rộng của hình ảnh được tạo ra, tính bằng pixel. Phải chia hết cho 16. Mặc định giốngheight. - num_inference_steps (
int, tùy chọn, mặc định là 30) — Số bước khử nhiễu. - guidance_scale (
float, tùy chọn, mặc định là 5.0) — Thang độ hướng dẫn không có bộ phân loại (classifier-free guidance). Các giá trị lớn hơn 1 sẽ chạy prompt tiêu cực như một lượt thứ hai ở mỗi bước, và 1.0 sẽ tắt hướng dẫn. - negative_prompt (
strhoặclist[str], tùy chọn) — Prompt để hướng tránh khi guidance đang bật. Mặc định là null caption mà Fibo 2.0 được huấn luyện với: caption có cấu trúc với mọi giá trị để trống. - num_images_per_prompt (
int, tùy chọn, mặc định là 1) — Số lượng hình ảnh cần tạo cho mỗi prompt. - generator (
torch.Generatororlist[torch.Generator], optional) — Generator(s) used to draw the starting noise, for deterministic generation. - latents (
torch.Tensor, tùy chọn) — Nhiễu khởi đầu đã tạo trước có hình dạng(batch_size, 32, height // 8, width // 8). - prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản đã tính trước từencode_prompt, được sử dụng thay choprompt. - prompt_embeds_mask (
torch.Tensor, tùy chọn) — Mặt nạ màencode_prompttrả về cùng vớiprompt_embeds. Cần thiết khi chúng được đệm (padded). - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các vector nhúng văn bản đã tính trước của prompt tiêu cực, được sử dụng thay chonegative_prompt. - negative_prompt_embeds_mask (
torch.Tensor, tùy chọn) — Mặt nạ màencode_prompttrả về cùng vớinegative_prompt_embeds. Cần thiết khi chúng được đệm (padded). - output_type (
str, tùy chọn, mặc định là"pil") — Định dạng đầu ra:"pil","np","pt"hoặc"latent". - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về mộtBriaFibo2PipelineOutputthay vì một tuple thông thường hay không. - 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 dưới dạngcallback_on_step_end(self, step, timestep, callback_kwargs). - callback_on_step_end_tensor_inputs (
list[str], tùy chọn, mặc định là["latents"]) — Các tensor được truyền vàocallback_on_step_endtrongcallback_kwargs.
Trả về
BriaFibo2PipelineOutput hoặc tuple
các hình ảnh được tạo ra.
Hàm được gọi khi gọi pipeline cho việc sinh.
Ví dụ:
>>> 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
< source >( 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 )
Tham số
- prompt (
strhoặclist[str]) — Prompt hoặc các prompt cần mã hóa. Khi dùng vớiimage, mỗi prompt là một chỉ thị chỉnh sửa, hoặc một đối tượng JSON có khóa"edit_instruction"và chú thích của kết quả: các khóa khác của nó, hoặc một khóa"structured_caption"chứa chú thích hoặc mô tả ngắn. Prompt sinh được mã hóa đúng như đã cho:__call__trước tiên đặt một chú thích JSON theo dạng mà Fibo 2.0 được huấn luyện. - image (
list[PIL.Image.Image], tùy chọn) — Các hình ảnh cần chỉnh sửa, theo cách Qwen3-VL nhìn thấy chúng. Mọi prompt đều chỉnh sửa tất cả các hình ảnh này. - device (
torch.device, tùy chọn) — Thiết bị để đặt các embedding lên. - num_images_per_prompt (
int, mặc định là 1) — Số lượng hình ảnh cần tạo cho mỗi prompt. - prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản đã tính trước có hình dạng(batch_size, 6, text_len, 7680), được sử dụng thay choprompt. - prompt_embeds_mask (
torch.Tensor, tùy chọn) — Mặt nạ Bool của các token thực trongprompt_embeds, có hình dạng(batch_size, text_len). - text_images (
list[PIL.Image.Image]hoặclist[list[PIL.Image.Image]], tùy chọn) — Hình ảnh của văn bản chú thích, một hình ảnh cho mỗi mụctext_rendercótext, theo thứ tự, hoặc một danh sách các hình ảnh đó cho mỗi prompt. Mỗi mục sẽ nhận được dấu hiệu thị giác (vision marker) của hình ảnh tương ứng, và Qwen3-VL sẽ nhìn thấy các hình ảnh này sau bất kỳ hình ảnh nào cần chỉnh sửa.