# Bria Fibo 2.0

Fibo 2.0 é um transformer de flow-matching com 8,1 bilhões de parâmetros da [Bria](https://huggingface.co/briaai) que gera imagens a partir de legendas JSON estruturadas. Seu codificador de texto é o [Qwen3-VL](https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct): um Perceiver condensa os estados ocultos do Qwen3-VL em tokens de resumo que se juntam aos tokens de imagem em um único fluxo, e cinco dos blocos do transformer também leem o Qwen3-VL diretamente por meio de atenção cruzada com gate.

Há dois checkpoints:

- [`briaai/Fibo-2.0-dev`](https://huggingface.co/briaai/Fibo-2.0-dev), o modelo completo para texto-para-imagem e edição, com classifier-free guidance. Os padrões do pipeline, 30 passos com guidance 5, são para este checkpoint.
- [`briaai/Fibo-2.0-edit-turbo`](https://huggingface.co/briaai/Fibo-2.0-edit-turbo), destilado para edição em 4 etapas sem orientação (`guidance_scale=1.0`).

Com a orientação ativada, o prompt negativo padrão é a legenda nula com a qual o modelo foi treinado: a legenda estruturada com todos os valores deixados vazios.

## Gerando

Fibo 2.0 é treinado em legendas JSON estruturadas e não funcionará bem com texto livre. Passe a legenda como uma string JSON:

```py
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")
```

O pipeline limpa a legenda da mesma forma que o treinamento: remove valores vazios e os campos `aesthetic_score` e `preference_score`, que não existiam em nenhuma legenda de treinamento, e serializa a legenda de forma compacta. Duas formas curtas também foram treinadas e são mantidas como estão:

```py
# 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]
```

Para transformar texto livre em uma legenda estruturada, consulte os modelos de prompt para JSON na página [Bria Fibo](https://huggingface.co/briaai/FIBO).

## Edição

O mesmo pipeline edita imagens. Passe a imagem como `image` e a instrução de edição como o prompt:

```py
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")
```

Para edições mais rápidas, carregue o checkpoint turbo e desative o guidance:

```py
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")
```

Os exemplos abaixo partem de um dos dois, com seu `pipe` e `image`. Com o checkpoint turbo, passe `num_inference_steps=4` e `guidance_scale=1.0` para cada chamada.

### O prompt de edição

O prompt também pode ser um objeto JSON com a chave `"edit_instruction"` e uma legenda do resultado, em qualquer um dos formatos com os quais o Fibo 2.0 foi treinado para editar. O pipeline o converte no prompt com o qual o Fibo 2.0 foi treinado para editar.

Legenda completa: as chaves da legenda ao lado de `"edit_instruction"`, conforme os modelos prompt-to-JSON da Bria escrevem para edições. O pipeline remove valores vazios e os campos `aesthetic_score` e `preference_score`, que o treinamento removeu de todas as legendas.

```py
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]
```

Uma breve descrição: uma string em uma chave `"structured_caption"`.

```py
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]
```

Uma breve descrição e seu texto: exatamente uma `"short_description"` e uma lista `"text_render"`. A lista é mantida mesmo quando está vazia, o que informa ao Fibo 2.0 que o resultado não possui texto. Uma chave `"structured_caption"` pode conter esse formato, ou também uma legenda completa.

```py
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]
```

### Várias imagens

Até 5 imagens podem ser editadas juntas, por exemplo, para colocar um objeto de uma em outra. A instrução se refere a elas em ordem como `<image_1>`, `<image_2>` e assim por diante.

```py
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]
```

### Tamanho da saída

A menos que `height` e `width` sejam fornecidos, o resultado assume o tamanho em que o Fibo 2.0 foi treinado para a proporção de aspecto da primeira imagem, cerca de um megapixel. Uma única imagem é recortada para o tamanho do resultado. Várias imagens são recortadas individualmente para o tamanho treinado correspondente à proporção de aspecto de cada uma.

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

### Edições mascaradas

`mask` marca a região de uma única imagem a ser regenerada, em branco sobre preto, no tamanho da imagem. O Fibo 2.0 foi treinado em edições cuja imagem tem essa região acinzentada, e o pipeline a acinzentar da mesma forma antes de a imagem ser codificada: cinza plano (128, 128, 128), através da máscara feita binária em 128.

```py
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]
```

## Texto em imagens

Quando a legenda pede por texto, em suas entradas `text_render`, o Fibo 2.0 tende a renderizá-lo melhor se o Qwen3-VL também vir cada texto desenhado individualmente. O pipeline desenha essas imagens por padrão, da mesma forma que no treinamento, e elas podem ser desativadas. Para uma legenda com texto, como a da padaria acima:

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

O treinamento mostrou ao Fibo 2.0 essas imagens para algumas legendas com texto e não para outras, então funciona de qualquer forma.

- Cada entrada `text_render` que possui `text` recebe uma imagem: o texto em uma linha, preto sobre branco, na fonte embutida do Pillow, tamanho 20. Um texto com mais de 256 caracteres é dividido em linhas de 256.
- Caracteres que a fonte não possui são desenhados com a primeira das `fonts` que os contém. O treinamento usou Aileron e, em seguida, DejaVu Sans, que estão na pasta `fonts` de [`briaai/Fibo-2.0-dev`](https://huggingface.co/briaai/Fibo-2.0-dev). Sem `fonts`, esses caracteres são desenhados como a fonte embutida do Pillow os desenha, e o pipeline emite um aviso.
- O pipeline marca cada entrada com um campo `image_tokens` para sua imagem, e o Qwen3-VL vê as imagens após quaisquer imagens a serem editadas.
- Uma geração executa seus primeiros passos, enquanto o nível de ruído estiver acima de `pipe.text_images_max_noise_level` (0.9), na legenda sem as imagens. Uma edição as utiliza em cada passo.
- Uma legenda sem texto não recebe imagens, assim como uma descrição curta, como no treinamento.

Para desenhá-los com as fontes usadas no treinamento:

```py
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]
```

Para desenhar as imagens você mesmo, passe-as como `text_images`, uma para cada entrada de `text_render` que possui `text`, em ordem, para um único prompt. Elas têm precedência sobre as do próprio pipeline. Imagens desenhadas de forma diferente da do treinamento estão fora da distribuição.

## Backends de atenção

O transformer é executado em qualquer um dos [backends de atenção](../../optimization/attention_backends) do diffusers, por exemplo, FlashAttention-3 em GPUs Hopper, como a H100:

```py
pipe.transformer.set_attention_backend("_flash_3_varlen_hub")
```

`_flash_3_hub` também funciona para um único prompt, mas não aceita máscaras, portanto não consegue executar um lote de prompts de comprimentos diferentes (veja abaixo).

## Lote

Vários prompts podem ser gerados em uma única chamada. Prompts de diferentes comprimentos são preenchidos (padded), e o preenchimento é mascarado em todas as camadas de atenção, portanto, um lote (batch) assim requer um backend de atenção que aceite uma máscara: o padrão, ou um backend varlen, como `flash_varlen`. Em float32, um lote reproduz as imagens das chamadas separadas; em bfloat16, os kernels de atenção diferem entre entradas preenchidas e não preenchidas, de modo que as imagens em lote podem diferir das chamadas individuais em detalhes finos.

## BriaFibo2Pipeline[[diffusers.BriaFibo2Pipeline]]

#### diffusers.BriaFibo2Pipeline[[diffusers.BriaFibo2Pipeline]]

```python
diffusers.BriaFibo2Pipeline(transformer: BriaFibo2Transformer2DModel, scheduler: FlowMatchEulerDiscreteScheduler, vae: AutoencoderKLFlux2, text_encoder: Qwen3VLForConditionalGeneration, processor: Qwen3VLProcessor)
```

[Fonte](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/bria_fibo2/pipeline_bria_fibo2.py#L171)

**Parâmetros:**

transformer ([BriaFibo2Transformer2DModel](/docs/diffusers/v0.43.0/pt/api/models/transformer_bria_fibo2#diffusers.BriaFibo2Transformer2DModel)) : O transformer que remove o ruído dos latentes da imagem.

scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/pt/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : Agendador usado com `transformer` para desruidar os latentes.

vae (`AutoencoderKLFlux2`) : Autoencoder variacional que mapeia imagens para latentes e vice-versa.

text_encoder (`Qwen3VLForConditionalGeneration`) : Qwen3-VL. Seus estados ocultos condicionam o transformer.

processor (`Qwen3VLProcessor`) : Converte o prompt e as imagens a serem editadas em entradas do Qwen3-VL.

Pipeline para geração de texto para imagem e edição de imagem com Fibo 2.0.

#### __call__[[diffusers.BriaFibo2Pipeline.__call__]]

```python
__call__(prompt: str | list[str] | None = None, image: PIL.Image.Image | list[PIL.Image.Image] | None = None, mask: PIL.Image.Image | None = None, text_images: list[PIL.Image.Image] | None = None, render_text_images: bool = True, fonts: list[str] | None = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 30, guidance_scale: float = 5.0, negative_prompt: str | list[str] | None = None, num_images_per_prompt: int = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_mask: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_mask: typing.Optional[torch.Tensor] = None, output_type: str = 'pil', return_dict: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int, dict], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'])
```

[Fonte](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/bria_fibo2/pipeline_bria_fibo2.py#L571)

**Parâmetros:**

prompt (`str` ou `list[str]`, *opcional*) : O prompt para orientar a geração da imagem, geralmente um prompt JSON estruturado, que é limpo conforme as legendas limpas do treinamento do Fibo 2.0: valores vazios e os campos `aesthetic_score` e `preference_score` são descartados, e ele é serializado de forma compacta. Com `image`, a instrução de edição, ou um objeto JSON com uma chave `"edit_instruction"` e a legenda do resultado: suas outras chaves, ou uma chave `"structured_caption"` contendo a legenda ou uma breve descrição.

image (`PIL.Image.Image` ou `list[PIL.Image.Image]`, *opcional*) : A imagem a ser editada, ou até 5 imagens a serem editadas juntas, às quais a instrução pode se referir como `<image_1>`, `<image_2>` e assim por diante. Sem `image`, o pipeline gera uma imagem a partir do prompt.

mask (`PIL.Image.Image`, *opcional*) : A região de `image` a ser regenerada, em branco sobre preto, ao editar uma única imagem. Assim como no treinamento, a região é esmaecida antes de a imagem ser codificada, por meio da máscara binarizada em 128.

text_images (`list[PIL.Image.Image]`, *opcional*) : Imagens do texto que a legenda solicita, uma para cada entrada de `text_render` que possui `text`, na ordem: o texto de cada entrada desenhado individualmente, conforme desenhado por `render_text_images`. O Qwen3-VL as visualiza junto com o prompt, cada uma marcada em sua entrada de legenda, o que ajuda o Fibo 2.0 a renderizar o texto. Exige `prompt` como uma única legenda em JSON e tem precedência sobre `render_text_images`. Uma geração executa seus primeiros passos, enquanto o nível de ruído estiver acima de `text_images_max_noise_level` (0.9), sem elas; uma edição as utiliza em cada passo.

render_text_images (`bool`, *opcional*, padrão `True`) : Se deve desenhar as `text_images` de cada legenda, da mesma forma que o treinamento do Fibo 2.0 as desenhava: cada texto em uma linha, preto sobre branco, na fonte embutida do Pillow com tamanho 20, e os caracteres que essa fonte não possui na primeira das `fonts` que os tiver. Uma legenda sem texto, e um prompt sem uma legenda em JSON, como uma descrição curta, não recebem imagens, assim como no treinamento.

fonts (`list[str]`, *opcional*) : Caminhos das fontes para desenhar os caracteres de `text_images` que a fonte embutida do Pillow não possui, em ordem. O treinamento os desenhou em Aileron e, em seguida, em DejaVu Sans, que estão na pasta `fonts` de `briaai/Fibo-2.0-dev`. Sem elas, tais caracteres são desenhados da mesma forma que a fonte embutida do Pillow os desenha.

height (`int`, *opcional*) : A altura em pixels da imagem gerada. Deve ser divisível por 16. O valor padrão é 1024, ou, ao editar, o tamanho Fibo 2.0 foi treinado para a proporção de aspecto da primeira imagem, cerca de um megapixel.

width (`int`, *opcional*) : A largura em pixels da imagem gerada. Deve ser divisível por 16. Padrão semelhante ao de `height`.

num_inference_steps (`int`, *opcional*, padrão 30) : O número de etapas de desruidamento.

guidance_scale (`float`, *opcional*, padrão 5.0) : Escala de orientação sem classificador. Valores acima de 1 executam o prompt negativo como uma segunda passagem em cada etapa, e 1.0 desativa a orientação.

negative_prompt (`str` ou `list[str]`, *opcional*) : O prompt para guiar a geração para longe de quando o guidance está ativado. O padrão é a legenda nula com a qual o Fibo 2.0 foi treinado: a legenda estruturada com todos os valores vazios.

num_images_per_prompt (`int`, *opcional*, padrão 1) : O número de imagens a serem geradas por prompt.

generator (`torch.Generator` ou `list[torch.Generator]`, *opcional*) : Gerador(es) usados para extrair o ruído inicial, para geração determinística.

latents (`torch.Tensor`, *opcional*) : Ruído inicial pré-gerado com forma `(batch_size, 32, height // 8, width // 8)`.

prompt_embeds (`torch.Tensor`, *opcional*) : Incorporações de texto pré-computadas de `encode_prompt`, usadas no lugar de `prompt`.

prompt_embeds_mask (`torch.Tensor`, *opcional*) : A máscara `encode_prompt` retornada junto com `prompt_embeds`. Necessária quando eles são preenchidos (padded).

negative_prompt_embeds (`torch.Tensor`, *opcional*) : Incorporações de texto pré-computadas do prompt negativo, usadas no lugar de `negative_prompt`.

negative_prompt_embeds_mask (`torch.Tensor`, *opcional*) : A máscara `encode_prompt` retornada com `negative_prompt_embeds`. Necessária quando eles são preenchidos.

output_type (`str`, *opcional*, padrão `"pil"`) : O formato de saída: `"pil"`, `"np"`, `"pt"` ou `"latent"`.

return_dict (`bool`, *opcional*, padrão `True`) : Se deve retornar um `BriaFibo2PipelineOutput` em vez de uma tupla simples.

callback_on_step_end (`Callable`, *opcional*) : Uma função chamada no final de cada etapa de desruidamento como `callback_on_step_end(self, step, timestep, callback_kwargs)`.

callback_on_step_end_tensor_inputs (`list[str]`, *opcional*, padrão `["latents"]`) : Os tensores passados para `callback_on_step_end` em `callback_kwargs`.

**Retorna:** `BriaFibo2PipelineOutput` ou `tuple`

as imagens geradas.

Função invocada ao chamar o pipeline para geração.

Exemplos:
```py
>>> 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[[diffusers.BriaFibo2Pipeline.encode_prompt]]

```python
encode_prompt(prompt: str | list[str], image: list[PIL.Image.Image] | None = None, device: typing.Optional[torch.device] = None, num_images_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_mask: typing.Optional[torch.Tensor] = None, text_images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = None)
```

[Fonte](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/bria_fibo2/pipeline_bria_fibo2.py#L351)

**Parâmetros:**

prompt (`str` ou `list[str]`) : O prompt ou os prompts a serem codificados. Com `image`, cada prompt é uma instrução de edição ou um objeto JSON com uma chave `"edit_instruction"` e a legenda do resultado: suas outras chaves, ou uma chave `"structured_caption"` contendo a legenda ou uma breve descrição. Um prompt de geração é codificado como fornecido: `__call__` primeiro coloca uma legenda JSON no formato com o qual o Fibo 2.0 foi treinado.

image (`list[PIL.Image.Image]`, *opcional*) : As imagens a serem editadas, conforme vistas pelo Qwen3-VL. Cada prompt edita todas elas.

device (`torch.device`, *opcional*) : O dispositivo em que as embeddings serão colocadas.

num_images_per_prompt (`int`, padrão 1) : Número de imagens a serem geradas por prompt.

prompt_embeds (`torch.Tensor`, *opcional*) : Incorporações de texto pré-computadas com forma `(batch_size, 6, text_len, 7680)`, usadas no lugar de `prompt`.

prompt_embeds_mask (`torch.Tensor`, *opcional*) : Máscara Bool dos tokens reais em `prompt_embeds`, de forma `(batch_size, text_len)`.

text_images (`list[PIL.Image.Image]` ou `list[list[PIL.Image.Image]]`, *opcional*) : Imagens do texto da legenda, uma para cada entrada de `text_render` que possui `text`, em ordem, ou uma lista delas por prompt. Cada entrada recebe o marcador de visão da sua imagem, e o Qwen3-VL vê as imagens após quaisquer imagens a serem editadas.

**Retorna:**

Os embeddings de texto, e sua máscara, ou `None` quando nenhum prompt foi preenchido.

