# Bria Fibo Edit

Fibo Edit là một mô hình image-to-image với 8B tham số, giới thiệu một hệ thống kiểm soát có cấu trúc mới, hoạt động trên các đầu vào JSON được ghép nối với hình ảnh nguồn để cho phép các quy trình chỉnh sửa mang tính tất định và có thể lặp lại. Với khả năng tạo mặt nạ (masking) bản địa cho độ chính xác chi tiết, nó vượt ra ngoài khuếch tán dựa trên prompt đơn giản để cung cấp sự kiểm soát rõ ràng, có thể diễn giải, được tối ưu hóa cho các môi trường sản xuất. Kiến trúc nhẹ của nó được thiết kế để tùy chỉnh sâu, giúp các nhà nghiên cứu xây dựng các mô hình "Edit" chuyên dụng cho các tác vụ cụ thể theo lĩnh vực, đồng thời mang lại chất lượng thẩm mỹ hàng đầu

Tham khảo [trang](https://huggingface.co/briaai/Fibo-Edit-1.5-base) Bria Fibo Edit trên Hugging Face để tìm hiểu thêm. Một checkpoint đã được chưng cất có sẵn tại [Fibo-Edit-1.5-turbo](https://huggingface.co/briaai/Fibo-Edit-1.5-turbo).

## Cách sử dụng

_Vì mô hình được kiểm soát truy cập, trước khi sử dụng với diffusers, bạn cần truy cập [trang Hugging Face của Bria Fibo Edit](https://huggingface.co/briaai/Fibo-Edit-1.5-base), điền biểu mẫu và chấp nhận điều kiện truy cập. Sau khi được cấp quyền, bạn cần đăng nhập để hệ thống xác nhận bạn đã chấp nhận điều kiện truy cập._

Sử dụng lệnh bên dưới để đăng nhập:

```bash
hf auth login
```

## BriaFiboEditPipeline[[diffusers.BriaFiboEditPipeline]]

#### diffusers.BriaFiboEditPipeline[[diffusers.BriaFiboEditPipeline]]

```python
diffusers.BriaFiboEditPipeline(transformer: BriaFiboTransformer2DModel, scheduler: typing.Union[diffusers.schedulers.scheduling_flow_match_euler_discrete.FlowMatchEulerDiscreteScheduler, diffusers.schedulers.scheduling_utils.KarrasDiffusionSchedulers], vae: AutoencoderKLWan, text_encoder: SmolLM3ForCausalLM, tokenizer: AutoTokenizer)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/bria_fibo/pipeline_bria_fibo_edit.py#L240)

**Tham số:**

transformer (`BriaFiboTransformer2DModel`) : Mô hình transformer cho mô hình hóa khuếch tán 2D.

scheduler (`FlowMatchEulerDiscreteScheduler` hoặc `KarrasDiffusionSchedulers`) : Scheduler được sử dụng cùng với `transformer` để khử nhiễu các latents đã mã hóa.

vae (`AutoencoderKLWan`) : Mô hình Variational Auto-Encoder dùng để mã hóa và giải mã hình ảnh sang và từ các biểu diễn ẩn.

text_encoder (`SmolLM3ForCausalLM`) : Bộ mã hóa văn bản để xử lý các prompt đầu vào.

tokenizer (`AutoTokenizer`) : Tokenizer được sử dụng để xử lý các prompt văn bản đầu vào cho text_encoder.

#### __call__[[diffusers.BriaFiboEditPipeline.__call__]]

```python
__call__(prompt: typing.Union[str, typing.List[str]] = None, image: typing.Union[PIL.Image.Image, typing.List[PIL.Image.Image], NoneType] = None, mask: typing.Union[torch.FloatTensor, PIL.Image.Image, typing.List[PIL.Image.Image], typing.List[torch.FloatTensor], numpy.ndarray, typing.List[numpy.ndarray], NoneType] = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 30, timesteps: typing.List[int] = None, seed: int | None = None, guidance_scale: float = 5, negative_prompt: typing.Union[str, typing.List[str], NoneType] = None, num_images_per_prompt: typing.Optional[int] = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.FloatTensor] = None, output_type: str = 'pil', return_dict: bool = True, joint_attention_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int, typing.Dict], NoneType]] = None, callback_on_step_end_tensor_inputs: typing.List[str] = ['latents'], max_sequence_length: int = 3000, do_patching = False, _auto_resize: bool = True)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/bria_fibo/pipeline_bria_fibo_edit.py#L599)

**Tham số:**

prompt (`str` hoặc `List[str]`) : Prompt hoặc các prompt để hướng dẫn việc tạo ảnh.

image (`PIL.Image.Image` hoặc `List[PIL.Image.Image]`, *tùy chọn*) : Một hoặc nhiều hình ảnh tham chiếu để định hướng cho việc tạo hình ảnh. Một danh sách được hiểu là nhiều tham chiếu (không phải một lô): mỗi tham chiếu được mã hóa VAE theo tỷ lệ khung hình riêng của nó và được đặt trên mặt phẳng thời gian RoPE riêng 1, 2, ... . Nếu không được định nghĩa, pipeline sẽ tạo hình ảnh từ đầu.

mask (`PipelineMaskInput`, *tùy chọn*) : Mặt nạ tùy chọn xác định vùng của `image` cần chỉnh sửa. Các pixel được che bởi mặt nạ sẽ được tạo lại trong khi phần còn lại của hình ảnh được giữ nguyên.

height (`int`, *optional*, mặc định là self.unet.config.sample_size * self.vae_scale_factor) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel. Giá trị mặc định là 1024 để đạt kết quả tốt nhất.

width (`int`, *optional*, mặc định là self.unet.config.sample_size * self.vae_scale_factor) : Độ rộng tính bằng pixel của hình ảnh được tạo ra. Mặc định được đặt là 1024 để đạt kết quả tốt nhất.

num_inference_steps (`int`, *optional*, mặc định là 30) : Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn, với cái giá là suy luận chậm hơn.

seed (`int`, *optional*) : Một hạt giống (seed) được sử dụng để đảm bảo quá trình sinh ra là tất định (deterministic).

timesteps (`List[int]`, *optional*) : Các bước thời gian (timesteps) tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch (scheduler) hỗ trợ tham số `timesteps` trong phương thức `set_timesteps` của chúng. Nếu không được định nghĩa, hành vi mặc định khi `num_inference_steps` được truyền vào sẽ được sử dụng. Phải được sắp xếp theo thứ tự giảm dần.

guidance_scale (`float`, *optional*, mặc định là 5.0) : Thang độ dẫn hướng như được định nghĩa trong [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` được định nghĩa là `w` của phương trình 2. trong [Imagen Paper](https://huggingface.co/papers/2205.11487). Thang độ dẫn hướng được kích hoạt bằng cách đặt `guidance_scale > 1`. Thang độ dẫn hướng cao hơn khuyến khích tạo ra các hình ảnh gắn kết chặt chẽ với `prompt` văn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn.

negative_prompt (`str` hoặc `List[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu `guidance_scale` nhỏ hơn `1`).

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

generator (`torch.Generator` hoặc `List[torch.Generator]`, *tùy chọn*) : Một hoặc một danh sách [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) để làm cho quá trình sinh trở nên tất định.

latents (`torch.FloatTensor`, *tùy chọn*) : Các latents nhiễu đã được tạo trước, được lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo ảnh. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo ra bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

output_type (`str`, *tùy chọn*, mặc định là `"pil"`) : Định dạng đầu ra của hình ảnh được tạo. Chọn giữa [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` hoặc `np.array`.

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một `~pipelines.stable_diffusion_xl.StableDiffusionXLPipelineOutput` thay vì một tuple thông thường hay không.

joint_attention_kwargs (`dict`, *tùy chọn*) : Một từ điển kwargs mà nếu được chỉ định sẽ được truyền đến `AttentionProcessor` như đã định nghĩa dưới `self.processor` trong [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).

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 trong quá trình suy luận. Hàm này được gọi với các đối số sau: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` sẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởi `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`List`, *tùy chọn*) : Danh sách các đầu vào tensor cho hàm `callback_on_step_end`. Các tensor được chỉ định trong danh sách sẽ được truyền dưới dạng tham số `callback_kwargs`. Bạn chỉ có thể bao gồm các biến được liệt kê trong thuộc tính `._callback_tensor_inputs` của lớp pipeline của bạn.

max_sequence_length (`int` mặc định là 3000) : Độ dài tối đa của chuỗi để sử dụng với `prompt`.

do_patching (`bool`, *tùy chọn*, mặc định là `False`) : Có sử dụng patching hay không.

_auto_resize (`bool`, *tùy chọn*, mặc định là `True`) : Có nên làm tròn độ phân giải đầu ra mặc định (lấy từ hình ảnh tham chiếu đầu tiên) sang các độ phân giải được ưu tiên hay không.

**Trả về:** `~pipelines.flux.BriaFiboPipelineOutput` hoặc `tuple`

`~pipelines.flux.BriaFiboPipelineOutput` nếu `return_dict` là True, ngược lại là một `tuple`. Khi trả về tuple, phần tử đầu tiên là một danh sách chứa các hình ảnh đã tạo.

Hàm được gọi khi gọi pipeline cho việc sinh.

Ví dụ:
```python
import torch
from PIL import Image

from diffusers import BriaFiboEditPipeline
from diffusers.modular_pipelines import ModularPipelineBlocks

# This prompt-to-JSON block calls Gemini and needs GEMINI_API_KEY in the environment.
vlm_pipe = ModularPipelineBlocks.from_pretrained("briaai/FIBO-edit-gemini-prompt-to-JSON", trust_remote_code=True)
vlm_pipe = vlm_pipe.init_pipeline()

pipe = BriaFiboEditPipeline.from_pretrained(
    "briaai/Fibo-Edit-1.5-base",
    torch_dtype=torch.bfloat16,
)
pipe.to("cuda")

image = Image.open("owl.png")
json_prompt = vlm_pipe(image=image, prompt="Make the owl into a cat").values["json_prompt"]

result = pipe(prompt=json_prompt, image=image, num_inference_steps=30, guidance_scale=5)

# Multiple reference images: pass a list. Each reference conditions the edit at its
# own aspect ratio; the output resolution follows the first reference.
owl, forest = Image.open("owl.png"), Image.open("forest.png")
json_prompt = vlm_pipe(
    image=[owl, forest], prompt="Place the owl from the first image in the forest from the second image"
).values["json_prompt"]
result = pipe(
    prompt=json_prompt,
    image=[owl, forest],
    num_inference_steps=30,
    guidance_scale=5,
)

# The distilled Turbo checkpoint edits in 4 steps without classifier-free guidance.
pipe = BriaFiboEditPipeline.from_pretrained("briaai/Fibo-Edit-1.5-turbo", torch_dtype=torch.bfloat16)
pipe.to("cuda")
result = pipe(prompt=json_prompt, image=[owl, forest], num_inference_steps=4, guidance_scale=1)
```

#### encode_prompt[[diffusers.BriaFiboEditPipeline.encode_prompt]]

```python
encode_prompt(prompt: typing.Union[str, typing.List[str]], device: typing.Optional[torch.device] = None, num_images_per_prompt: int = 1, guidance_scale: float = 5, negative_prompt: typing.Union[str, typing.List[str], NoneType] = None, max_sequence_length: int = 3000, lora_scale: bool | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/bria_fibo/pipeline_bria_fibo_edit.py#L365)

**Tham số:**

prompt (`str` hoặc `List[str]`, *tùy chọn*) : prompt cần được mã hóa

device : (`torch.device`): thiết bị torch

num_images_per_prompt (`int`) : số lượng hình ảnh cần được tạo cho mỗi prompt

guidance_scale (`float`) : Thang độ dẫn hướng cho classifier free guidance.

negative_prompt (`str` hoặc `List[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu `guidance_scale` nhỏ hơn `1`).

#### prepare_reference_latents[[diffusers.BriaFiboEditPipeline.prepare_reference_latents]]

```python
prepare_reference_latents(image: Image, num_channels_latents: int, dtype: dtype, device: device, do_patching: bool = False, reference_index: int = 1)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/bria_fibo/pipeline_bria_fibo_edit.py#L992)

VAE-encode một tham chiếu PIL ở kích thước riêng của nó và đóng gói nó thành một luồng token ngữ cảnh chỉnh sửa.

