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 — это 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

< >

( 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__

< >

( 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 (str or list[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

< >

( 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 видит эти изображения после любых изображений, подлежащих редактированию.
Update on GitHub