Diffusers documentation
Bria Fibo 2.0
Bria Fibo 2.0
Fibo 2.0 — это flow-matching трансформер с 8,1 млрд параметров от Bria, который генерирует изображения по структурированным JSON-описаниям. Его текстовый энкодер — Qwen3-VL: Perceiver сжимает скрытые состояния Qwen3-VL в gist-токены, которые объединяются с токенами изображения в едином потоке, а пять блоков трансформера также напрямую читают Qwen3-VL через gated cross-attention.
Существуют две контрольные точки:
briaai/Fibo-2.0-dev— полная модель для генерации изображений по тексту и редактирования, с поддержкой classifier-free guidance. Значения по умолчанию в пайплайне, 30 шагов с guidance 5, рассчитаны именно на этот чекпоинт.briaai/Fibo-2.0-edit-turbo, дистиллированная для редактирования за 4 шага без гайданса (guidance_scale=1.0).
При включённом руководстве (guidance) по умолчанию используется отрицательный промпт, равный пустой подписи, с которой обучалась модель: структурированная подпись, в которой все значения оставлены пустыми.
Генерация
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")Пайплайн очищает подпись так же, как это делалось при обучении: он удаляет пустые значения и поля 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]Чтобы преобразовать свободный текст в структурированное описание, см. модели prompt-to-JSON на странице Bria Fibo.
Редактирование
Та же конвейерная линия редактирует изображения. Передайте изображение как 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 в каждый вызов.
Промпт для редактирования
Промпт также может быть объектом JSON с ключом "edit_instruction" и подписью результата, в любом из форматов, с которыми обучалась Fibo 2.0 для редактирования. Пайплайн преобразует его в промпт, с которым обучалась Fibo 2.0 для редактирования.
Полная подпись: ключи подписи, расположенные рядом с "edit_instruction", как это делают модели prompt-to-JSON от Bria для редактирования. Конвейер отбрасывает пустые значения, а также поля 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 для соотношения сторон первого изображения, примерно один мегапиксель. Одно изображение обрезается до размера результата. Несколько изображений обрезаются каждый до обученного размера для собственного соотношения сторон.
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_render, содержащаяtext, получает изображение: текст в одну строку, чёрным по белому, в стандартном шрифте Pillow размером 20. Текст длиннее 256 символов разбивается на строки по 256 символов. - Символы, отсутствующие в шрифте, отрисовываются с помощью первого шрифта из списка
fonts, в котором они есть. Для обучения использовались Aileron, а затем DejaVu Sans, которые находятся в папкеfontsрепозиторияbriaai/Fibo-2.0-dev. Еслиfontsне задан, такие символы отрисовываются встроенным шрифтом Pillow, а конвейер выводит предупреждение. - Пайплайн помечает каждую запись полем
image_tokensдля её изображения, а Qwen3-VL видит изображения после любых изображений, предназначенных для редактирования. - Генерация выполняет первые шаги, пока уровень шума выше
pipe.text_images_max_noise_level(0.9), на основе подписи без изображений. Редактирование использует их на каждом шаге. - Подпись без текста не даст изображений, как и короткое описание, как и при обучении.
Чтобы отрисовать их с использованием шрифтов, применявшихся при обучении:
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_images, по одному на каждый элемент text_render, содержащий text, в порядке следования для одного промпта. Они имеют приоритет над изображениями, создаваемыми самим пайплайном. Изображения, отрисованные иначе, чем во время обучения, выходят за пределы распределения.
Бэкенды внимания
Трансформер работает с любым из бэкендов внимания diffusers, например, с FlashAttention-3 на Hopper GPU, таких как H100:
pipe.transformer.set_attention_backend("_flash_3_varlen_hub")_flash_3_hub также работает с одним промптом, но не принимает маски, поэтому не может обрабатывать пакет промптов разной длины (см. ниже).
Пакетная обработка
Несколько промптов можно сгенерировать за один вызов. Промпты разной длины дополняются (padding), и эти дополнения маскируются во всех слоях внимания, поэтому для такой партии необходим бэкенд внимания, поддерживающий маску: по умолчанию или varlen-бэкенд, например flash_varlen. В float32 партия воспроизводит изображения отдельных вызовов; в bfloat16 ядра внимания различаются для дополненных и не дополненных входов, поэтому изображения из партии могут отличаться от результатов одиночных вызовов в мелких деталях.
BriaFibo2Pipeline
класс diffusers.BriaFibo2Pipeline
< source >( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )
Параметры
- transformer (BriaFibo2Transformer2DModel) — трансформер, который выполняет денойзинг латентов изображения.
- scheduler (FlowMatchEulerDiscreteScheduler) —
планировщик, используемый вместе с
transformerдля удаления шума из латентов. - vae (
AutoencoderKLFlux2) — Вариационный автоэнкодер, который отображает изображения в латентные представления и обратно. - text_encoder (
Qwen3VLForConditionalGeneration) — Qwen3-VL. Его скрытые состояния задают условия для трансформера. - processor (
Qwen3VLProcessor) — Преобразует промпт и изображения для редактирования во входные данные Qwen3-VL.
Pipeline для генерации изображений по тексту и редактирования изображений с 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
Параметры
- prompt (
strилиlist[str], необязательный) — Промпт для управления генерацией изображения, как правило, структурированный JSON-промпт, который очищается так же, как подписи в процессе обучения Fibo 2.0: пустые значения, а также поляaesthetic_scoreиpreference_scoreудаляются, после чего объект сериализуется в компактном виде. Вместе сimage— инструкция по редактированию либо JSON-объект с ключом"edit_instruction"и подписью результата: его остальные ключи, либо ключ"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_render, содержащийtext, в порядке следования: текст каждого элемента отрисован отдельно, как это делает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], необязательный) — Пути к шрифтам для отрисовки символов изtext_images, отсутствующих в встроенном шрифте Pillow, в указанном порядке. Во время обучения они отрисовывались с помощью Aileron, а затем DejaVu Sans, которые находятся в папкеfontsрепозиторияbriaai/Fibo-2.0-dev. Без них такие символы отрисовываются так, как это делает встроенный шрифт Pillow. - height (
int, необязательный) — Высота генерируемого изображения в пикселях. Должна делиться на 16. По умолчанию 1024, а при редактировании — размер, на котором Fibo 2.0 обучался для соотношения сторон первого изображения, примерно один мегапиксель. - width (
int, необязательный) — Ширина генерируемого изображения в пикселях. Должна делиться нацело на 16. По умолчанию — как уheight. - num_inference_steps (
int, необязательный, по умолчанию 30) — Количество шагов удаления шума. - guidance_scale (
float, необязательный, по умолчанию 5.0) — Масштаб классификаторно-свободного руководства (classifier-free guidance). Значения, превышающие 1, запускают отрицательный промпт как второй проход на каждом шаге, а 1.0 отключает руководство. - negative_prompt (
strorlist[str], необязательный) — Промпт, задающий направление, от которого следует отклоняться при включённом управлении. По умолчанию используется пустая подпись, с которой обучалась модель Fibo 2.0: структурированная подпись со всеми пустыми значениями. - num_images_per_prompt (
int, необязательный, по умолчанию 1) — Количество изображений, генерируемых для каждого промпта. - generator (
torch.Generatorилиlist[torch.Generator], необязательный) — Генератор(ы), используемые для получения начального шума, для детерминированной генерации. - latents (
torch.Tensor, необязательный) — Предварительно сгенерированный начальный шум формы(batch_size, 32, height // 8, width // 8). - prompt_embeds (
torch.Tensor, необязательный) — Предварительно вычисленные текстовые эмбеддинги изencode_prompt, используемые вместоprompt. - prompt_embeds_mask (
torch.Tensor, необязательный) — Маска, которуюencode_promptвозвращает вместе сprompt_embeds. Необходима, если они дополнены (padded). - negative_prompt_embeds (
torch.Tensor, необязательный) — Предварительно вычисленные текстовые эмбеддинги отрицательного промпта, используются вместоnegative_prompt. - negative_prompt_embeds_mask (
torch.Tensor, необязательный) — Маска, которуюencode_promptвозвращает вместе сnegative_prompt_embeds. Необходима, если они дополнены (padded). - 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_on_step_endвcallback_kwargs.
Возвращает
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
< 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 )
Параметры
- prompt (
strилиlist[str]) — Промпт или промпты для кодирования. При использованииimageкаждый промпт является инструкцией по редактированию или JSON-объектом с ключом"edit_instruction"и подписью результата: его другие ключи или ключ"structured_caption", содержащий подпись или краткое описание. Промпт генерации кодируется в том виде, в каком он задан:__call__сначала помещает JSON-подпись в том формате, с которым обучалась Fibo 2.0. - image (
list[PIL.Image.Image], необязательный) — Изображения для редактирования, как их видит Qwen3-VL. Каждая инструкция редактирует все изображения. - device (
torch.device, необязательный) — Устройство, на котором размещаются эмбеддинги. - num_images_per_prompt (
int, по умолчанию 1) — Количество изображений, генерируемых на один промпт. - prompt_embeds (
torch.Tensor, необязательный) — Предварительно вычисленные текстовые эмбеддинги формы(batch_size, 6, text_len, 7680), используемые вместоprompt. - prompt_embeds_mask (
torch.Tensor, необязательный) — Bool-маска реальных токенов вprompt_embedsс формой(batch_size, text_len). - text_images (
list[PIL.Image.Image]илиlist[list[PIL.Image.Image]], необязательный) — Изображения текста подписи, по одному на каждый элементtext_render, содержащийtext, в заданном порядке, либо список таких изображений для каждого запроса. Каждому элементу присваивается маркер визуального канала его изображения, и Qwen3-VL видит эти изображения после любых изображений, подлежащих редактированию.