Diffusers documentation
Bria Fibo 2.0
Bria Fibo 2.0
Fibo 2.0 est un transformer flow-matching de 8,1 milliards de paramètres de Bria qui génère des images à partir de légendes JSON structurées. Son encodeur de texte est Qwen3-VL : un Perceiver condense les états cachés de Qwen3-VL en jetons de résumé qui rejoignent les jetons d’image dans un seul flux, et cinq des blocs du transformer lisent également Qwen3-VL directement via une attention croisée à porte.
Il y a deux points de contrôle :
briaai/Fibo-2.0-dev, le modèle complet pour la génération d’images à partir de texte et l’édition, avec guidance sans classifieur. Les valeurs par défaut du pipeline, 30 étapes avec un guidance de 5, correspondent à ce point de contrôle.briaai/Fibo-2.0-edit-turbo, distillé pour l'édition en 4 étapes sans guidage (guidance_scale=1.0).
Avec le guidage activé, le prompt négatif par défaut est la légende nulle avec laquelle le modèle a été entraîné : la légende structurée dont toutes les valeurs sont laissées vides.
Génération
Fibo 2.0 est entraîné sur des légendes JSON structurées et ne fonctionnera pas bien avec du texte libre. Passez la légende sous forme de chaîne 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")Le pipeline nettoie la légende de la même manière que lors de l’entraînement : il supprime les valeurs vides ainsi que les champs aesthetic_score et preference_score, qui n’étaient présents dans aucune légende d’entraînement, et sérialise la légende de manière compacte. Deux formes courtes ont également été entraînées et sont conservées telles quelles :
# 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]Pour convertir un texte libre en légende structurée, consultez les modèles prompt-to-JSON sur la page Bria Fibo.
Édition
Le même pipeline modifie les images. Passez l'image en tant que image et l'instruction de modification en tant que 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")Pour des modifications plus rapides, chargez le point de contrôle turbo et désactivez le guidage :
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")Les exemples ci-dessous reprennent l’un ou l’autre, avec son pipe et son image. Avec le checkpoint turbo, passez num_inference_steps=4 et guidance_scale=1.0 à chaque appel.
Le prompt de modification
Le prompt peut également être un objet JSON avec une clé "edit_instruction" et une légende du résultat, dans l'une des formes avec lesquelles Fibo 2.0 a été entraîné à effectuer des modifications. Le pipeline le convertit en le prompt avec lequel Fibo 2.0 a été entraîné à effectuer des modifications.
Légende complète : les clés de la légende, à côté de "edit_instruction", telles que les modèles prompt-vers-JSON de Bria les écrivent pour les modifications. Le pipeline supprime les valeurs vides ainsi que les champs aesthetic_score et preference_score, que l’entraînement a retirés de toutes les légendes.
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]Une brève description : une chaîne de caractères dans la clé "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]Une brève description et son texte : exactement une "short_description" et une liste "text_render". La liste est conservée même lorsqu’elle est vide, ce qui indique à Fibo 2.0 que le résultat ne contient pas de texte. Une clé "structured_caption" peut contenir ce format, ou bien une légende complète.
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]Plusieurs images
Jusqu'à 5 images peuvent être éditées ensemble, par exemple pour placer un objet d'une image dans une autre. L'instruction les désigne dans l'ordre sous la forme <image_1>, <image_2>, et ainsi de suite.
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]Taille de la sortie
À moins que height et width ne soient fournis, le résultat adopte la taille pour laquelle Fibo 2.0 a été entraîné, correspondant au ratio d’aspect de la première image, soit environ un mégapixel. Une image unique est recadrée à la taille du résultat. Plusieurs images sont chacune recadrées à la taille d’entraînement correspondant à leur propre ratio d’aspect.
edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]Modifications masquées
mask marque la région d’une image unique à régénérer, en blanc sur fond noir, aux dimensions de l’image. Fibo 2.0 a été entraîné sur des modifications dont l’image présente cette région grisée, et le pipeline la grise de la même manière avant que l’image soit encodée : gris plat (128, 128, 128), via le masque rendu binaire à 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]Texte dans les images
Lorsque la légende demande du texte, dans ses entrées text_render, Fibo 2.0 a tendance à le rendre mieux si Qwen3-VL voit également chaque texte dessiné séparément. Le pipeline dessine ces images par défaut, comme c’était le cas lors de l’entraînement, et ils peuvent être désactivés. Pour une légende contenant du texte, comme celle de la boulangerie ci-dessus :
prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]L'entraînement a montré à Fibo 2.0 ces images pour certaines légendes avec du texte et pas pour d'autres, donc cela fonctionne dans les deux cas.
- Chaque entrée
text_renderqui possèdetextreçoit une image : le texte sur une seule ligne, en noir sur fond blanc, avec la police intégrée de Pillow, en taille 20. Un texte de plus de 256 caractères est découpé en lignes de 256. - Les caractères manquants dans la police sont dessinés avec la première police de
fontsqui les contient. L’entraînement a utilisé Aileron, puis DejaVu Sans, qui se trouvent dans le dossierfontsdebriaai/Fibo-2.0-dev. Sansfonts, ces caractères sont dessinés comme le ferait la police intégrée de Pillow, et le pipeline émet un avertissement. - Le pipeline marque chaque entrée avec un champ
image_tokenspour son image, et Qwen3-VL voit les images après les images à modifier. - Une génération effectue ses premières étapes, tant que le niveau de bruit est supérieur à
pipe.text_images_max_noise_level(0.9), sur la légende sans les images. Une édition les utilise à chaque étape. - Une légende sans texte ne génère aucune image, tout comme une description courte, comme lors de l'entraînement.
Pour les dessiner avec les polices utilisées pour l'entraînement :
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]Pour dessiner les images vous-même, passez-les en tant que text_images, une par entrée text_render qui possède text, dans l’ordre, pour un prompt unique. Elles prennent le pas sur celles du pipeline. Les images dessinées différemment de l’entraînement sont hors distribution.
Backends d'attention
Le transformateur fonctionne avec l'un des backends d'attention de diffusers, par exemple FlashAttention-3 sur des GPU Hopper tels que le H100 :
pipe.transformer.set_attention_backend("_flash_3_varlen_hub")_flash_3_hub fonctionne également pour un seul prompt, mais il n’accepte pas de masques, il ne peut donc pas exécuter un lot de prompts de longueurs différentes (voir ci-dessous).
Batching
Plusieurs prompts peuvent être générés en un seul appel. Les prompts de longueurs différentes sont complétés (padding), et ce padding est masqué dans chaque couche d'attention, si bien qu'un tel lot nécessite un backend d'attention qui gère un masque : le backend par défaut, ou un backend varlen tel que flash_varlen. En float32, un lot reproduit les images des appels individuels ; en bfloat16, les noyaux d'attention diffèrent entre les entrées avec et sans padding, de sorte que les images générées en lot peuvent différer des appels unitaires dans les détails fins.
BriaFibo2Pipeline
classe diffusers.BriaFibo2Pipeline
< source >( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )
Paramètres
- transformer (BriaFibo2Transformer2DModel) — Le transformer qui débruite les latents de l'image.
- scheduler (FlowMatchEulerDiscreteScheduler) —
Planificateur utilisé avec
transformerpour débruyer les latents. - vae (
AutoencoderKLFlux2) — Auto-encodeur variationnel qui mappe les images vers des latents et inversement. - text_encoder (
Qwen3VLForConditionalGeneration) — Qwen3-VL. Ses états cachés conditionnent le transformeur. - processor (
Qwen3VLProcessor) — Convertit le prompt et les images à modifier en entrées Qwen3-VL.
Pipeline pour la génération d'images à partir de texte et l'édition d'images avec 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
Paramètres
- prompt (
stroulist[str], facultatif) — Le prompt pour guider la génération d’image, généralement un prompt JSON structuré, nettoyé selon les légendes nettoyées lors de l’entraînement de Fibo 2.0 : les valeurs vides ainsi que les champsaesthetic_scoreetpreference_scoresont supprimés, et le résultat est sérialisé de manière compacte. Avecimage, l’instruction d’édition, ou un objet JSON avec une clé"edit_instruction"et la légende du résultat : ses autres clés, ou une clé"structured_caption"contenant la légende ou une brève description. - image (
PIL.Image.Imageoulist[PIL.Image.Image], facultatif) — L’image à modifier, ou jusqu’à 5 images à modifier ensemble, auxquelles l’instruction peut faire référence sous la forme<image_1>,<image_2>et ainsi de suite. Sansimage, le pipeline génère une image à partir du prompt. - mask (
PIL.Image.Image, facultatif) — La région deimageà régénérer, en blanc sur fond noir, lors de l’édition d’une image unique. Comme lors de l’entraînement, la région est grisée avant l’encodage de l’image, via le masque rendu binaire à 128. - text_images (
list[PIL.Image.Image], facultatif) — Images du texte demandé par la légende, une par entrée detext_rendercontenanttext, dans l’ordre : le texte de chaque entrée est dessiné séparément, comme le faitrender_text_images. Qwen3-VL les voit avec le prompt, chacune étant marquée dans son entrée de légende, ce qui aide Fibo 2.0 à rendre le texte. Nécessitepromptsous forme d’une légende JSON unique, et prend le pas surrender_text_images. Une génération exécute ses premières étapes, tant que le niveau de bruit est supérieur àtext_images_max_noise_level(0,9), sans elles ; une édition les utilise à chaque étape. - render_text_images (
bool, facultatif, par défautTrue) — Indique s’il faut dessiner lestext_imagesde chaque légende, de la même manière que lors de l’entraînement de Fibo 2.0 : chaque texte sur une seule ligne, en noir sur fond blanc, avec la police intégrée de Pillow en taille 20, et les caractères manquants dans cette police sont pris dans la première desfontsqui les contient. Une légende sans texte, et un prompt sans légende JSON, comme une courte description, ne reçoivent aucune image, comme lors de l’entraînement. - fonts (
list[str], facultatif) — Chemins des polices à utiliser pour dessiner les caractères detext_imagesque la police intégrée de Pillow ne possède pas, dans l’ordre. L’entraînement les a dessinés avec Aileron, puis DejaVu Sans, qui se trouvent dans le dossierfontsdebriaai/Fibo-2.0-dev. Sans elles, ces caractères sont dessinés comme le ferait la police intégrée de Pillow. - height (
int, facultatif) — La hauteur en pixels de l’image générée. Doit être divisible par 16. Valeur par défaut : 1024, ou, lors d’une édition, la taille à laquelle Fibo 2.0 a été entraîné pour le ratio d’aspect de la première image, soit environ un mégapixel. - width (
int, facultatif) — La largeur en pixels de l’image générée. Doit être divisible par 16. Valeur par défaut identique àheight. - num_inference_steps (
int, facultatif, valeur par défaut 30) — Le nombre d'étapes de débruitage. - guidance_scale (
float, facultatif, valeur par défaut 5.0) — Échelle de guidage sans classifieur. Les valeurs supérieures à 1 exécutent le prompt négatif comme un second passage à chaque étape, et 1.0 désactive le guidage. - negative_prompt (
stroulist[str], facultatif) — Le prompt à éviter lorsque le guidage est activé. Par défaut, il s’agit de la légende nulle avec laquelle Fibo 2.0 a été entraîné : la légende structurée dont toutes les valeurs sont vides. - num_images_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Générateur(s) utilisé(s) pour tirer le bruit initial, pour une génération déterministe. - latents (
torch.Tensor, facultatif) — Bruit de départ pré-généré de forme(batch_size, 32, height // 8, width // 8). - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte précalculés issus deencode_prompt, utilisés à la place deprompt. - prompt_embeds_mask (
torch.Tensor, facultatif) — Le masque renvoyé parencode_promptavecprompt_embeds. Nécessaire lorsqu’ils sont complétés (padding). - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte précalculés du prompt négatif, utilisés à la place denegative_prompt. - negative_prompt_embeds_mask (
torch.Tensor, facultatif) — Le masque renvoyé parencode_promptavecnegative_prompt_embeds. Nécessaire lorsqu’ils sont complétés (padding). - output_type (
str, facultatif, par défaut"pil") — Le format de sortie :"pil","np","pt"ou"latent". - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unBriaFibo2PipelineOutputplutôt qu'un simple tuple. - callback_on_step_end (
Callable, facultatif) — Une fonction appelée à la fin de chaque étape de débruitage sous la formecallback_on_step_end(self, step, timestep, callback_kwargs). - callback_on_step_end_tensor_inputs (
list[str], facultatif, par défaut["latents"]) — Les tenseurs passés àcallback_on_step_enddanscallback_kwargs.
Retourne
BriaFibo2PipelineOutput ou tuple
les images générées.
Fonction appelée lors de l'appel du pipeline pour la génération.
Exemples :
>>> 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 )
Paramètres
- prompt (
stroulist[str]) — Le prompt ou les prompts à encoder. Avecimage, chaque prompt est une instruction de modification, ou un objet JSON avec une clé"edit_instruction"et la légende du résultat : ses autres clés, ou une clé"structured_caption"contenant la légende ou une brève description. Un prompt de génération est encodé tel quel :__call__place d’abord une légende JSON dans le format avec lequel Fibo 2.0 a été entraîné. - image (
list[PIL.Image.Image], optional) — The images to edit, as Qwen3-VL sees them. Every prompt edits all of them. - device (
torch.device, facultatif) — L'appareil sur lequel placer les embeddings. - num_images_per_prompt (
int, par défaut 1) — Nombre d'images à générer par invite. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte précalculés de forme(batch_size, 6, text_len, 7680), utilisés à la place deprompt. - prompt_embeds_mask (
torch.Tensor, facultatif) — Masque booléen des jetons réels dansprompt_embeds, de forme(batch_size, text_len). - text_images (
list[PIL.Image.Image]oulist[list[PIL.Image.Image]], facultatif) — Images du texte de la légende, une par entrée detext_renderqui possèdetext, dans l’ordre, ou une liste de celles-ci par invite. Chaque entrée reçoit le marqueur visuel de son image, et Qwen3-VL voit les images après toutes les images à modifier.