Diffusers documentation
FluxControlInpaint
FluxControlInpaint
FluxControlInpaintPipeline — это реализация Inpainting для моделей Flux.1 Depth/Canny. Это пайплайн, который позволяет выполнять inpaint изображений с использованием моделей Flux.1 Depth/Canny. Пайплайн принимает на вход изображение и маску и возвращает изображение после inpaint.
FLUX.1 Depth and Canny [dev] — это трансформатор rectified flow с 12 миллиардами параметров, способный генерировать изображение на основе текстового описания, сохраняя структуру заданного входного изображения. Это не модель ControlNet.
| Тип управления | Разработчик | Ссылка |
|---|---|---|
| Глубина | Black Forest Labs | Ссылка |
| Canny | Black Forest Labs | Ссылка |
Запуск Flux на потребительском оборудовании может быть довольно дорогим. Однако вы можете применить ряд оптимизаций, чтобы ускорить его работу и снизить потребление памяти. Подробнее об этом читайте в этом разделе. Кроме того, для повышения эффективности использования памяти Flux можно квантовать, что, однако, приведёт к увеличению задержки инференса. Дополнительную информацию смотрите в этой статье. С исчерпывающим списком ресурсов можно ознакомиться в этом gist.
import torch
from diffusers import FluxControlInpaintPipeline
from diffusers.models.transformers import FluxTransformer2DModel
from transformers import T5EncoderModel
from diffusers.utils import load_image, make_image_grid
from image_gen_aux import DepthPreprocessor # https://github.com/huggingface/image_gen_aux
from PIL import Image
import numpy as np
pipe = FluxControlInpaintPipeline.from_pretrained(
"black-forest-labs/FLUX.1-Depth-dev",
dtype=torch.bfloat16,
)
# use following lines if you have GPU constraints
# ---------------------------------------------------------------
transformer = FluxTransformer2DModel.from_pretrained(
"sayakpaul/FLUX.1-Depth-dev-nf4", subfolder="transformer", dtype=torch.bfloat16
)
text_encoder_2 = T5EncoderModel.from_pretrained(
"sayakpaul/FLUX.1-Depth-dev-nf4", subfolder="text_encoder_2", dtype=torch.bfloat16
)
pipe.transformer = transformer
pipe.text_encoder_2 = text_encoder_2
pipe.enable_model_cpu_offload()
# ---------------------------------------------------------------
pipe.to("cuda") # or "mps", "xpu", "cpu"
prompt = "a blue robot singing opera with human-like expressions"
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/robot.png")
head_mask = np.zeros_like(image)
head_mask[65:580,300:642] = 255
mask_image = Image.fromarray(head_mask)
processor = DepthPreprocessor.from_pretrained("LiheYoung/depth-anything-large-hf")
control_image = processor(image)[0].convert("RGB")
output = pipe(
prompt=prompt,
image=image,
control_image=control_image,
mask_image=mask_image,
num_inference_steps=30,
strength=0.9,
guidance_scale=10.0,
generator=torch.Generator().manual_seed(42),
).images[0]
make_image_grid([image, control_image, mask_image, output.resize(image.size)], rows=1, cols=4).save("output.png")FluxControlInpaintPipeline
класс diffusers.FluxControlInpaintPipeline
< source >( scheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: CLIPTextModeltokenizer: CLIPTokenizertext_encoder_2: T5EncoderModeltokenizer_2: T5Tokenizertransformer: FluxTransformer2DModel )
Параметры
- transformer (FluxTransformer2DModel) — Архитектура условного Transformer (MMDiT) для удаления шума из закодированных латентов изображения.
- scheduler (FlowMatchEulerDiscreteScheduler) —
планировщик, используемый в связке с
transformerдля удаления шума из закодированных латентов изображения. - vae (AutoencoderKL) — Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.
- text_encoder (
CLIPTextModel) — CLIP, а именно вариант clip-vit-large-patch14. - text_encoder_2 (
T5EncoderModel) — T5, а именно вариант google/t5-v1_1-xxl. - tokenizer (
CLIPTokenizer) — токенизатор класса CLIPTokenizer. - tokenizer_2 (
T5TokenizerFast) — Второй токенизатор класса T5TokenizerFast.
Конвейер Flux для восстановления изображений с использованием Flux-dev-Depth/Canny.
Ссылка: https://blackforestlabs.ai/announcing-black-forest-labs/
__call__
< source >( prompt: str | list[str] = Noneprompt_2: str | list[str] | None = Noneimage: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonecontrol_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonemask_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonemasked_image_latents: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Noneheight: int | None = Nonewidth: int | None = Nonestrength: float = 0.6num_inference_steps: int = 28sigmas: list[float] | None = Noneguidance_scale: float = 7.0num_images_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.FloatTensor] = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truejoint_attention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = Nonecallback_on_step_end_tensor_inputs: list = ['latents']max_sequence_length: int = 512 ) → ~pipelines.flux.FluxPipelineOutput or tuple
Параметры
- prompt (
strилиlist[str], необязательный) — Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передатьprompt_embedsвместо него. - prompt_2 (
strилиlist[str], необязательный) — Промпт или промпты, которые будут переданы вtokenizer_2иtext_encoder_2. Если не задан, вместо него будет использоватьсяprompt - image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image]илиlist[np.ndarray]) —Image, массив numpy или тензор, представляющие пакет изображений, который будет использоваться в качестве начальной точки. Для массивов numpy и тензоров pytorch ожидаемый диапазон значений составляет[0, 1]. Если передан тензор или список тензоров, ожидаемая форма должна быть(B, C, H, W)или(C, H, W). Если передан массив numpy или список массивов, ожидаемая форма должна быть(B, H, W, C)или(H, W, C). Также можно передавать латенты изображений в качествеimage, но при прямой передаче латентов они не кодируются повторно. - control_image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image],list[np.ndarray],list[list[torch.Tensor]],list[list[np.ndarray]]илиlist[list[PIL.Image.Image]]): Условие входа ControlNet, задающее направление дляunetпри генерации. Если тип указан какtorch.Tensor, значение передаётся в ControlNet без изменений. Также допускается изображение в форматеPIL.Image.Image. Размеры выходного изображения по умолчанию совпадают с размерамиimage. Если переданы высота и/или ширина,imageмасштабируется соответственно. Если вinitуказано несколько ControlNet, изображения необходимо передавать в виде списка, чтобы каждый элемент списка мог быть корректно сгруппирован в батч для входа в один ControlNet. - mask_image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image]илиlist[np.ndarray]) —Image, массив numpy или тензор, представляющие пакет изображений для маскированияimage. Белые пиксели в маске перекрашиваются, а чёрные сохраняются. Еслиmask_image— это изображение PIL, оно преобразуется в один канал (яркость) перед использованием. Если это массив numpy или тензор pytorch, он должен содержать один цветовой канал (L) вместо трёх, поэтому ожидаемая форма для тензора pytorch —(B, 1, H, W),(B, H, W),(1, H, W),(H, W). А для массива numpy —(B, H, W, 1),(B, H, W),(H, W, 1)или(H, W). - masked_image_latents (
torch.Tensor,list[torch.Tensor]) —Tensor, представляющий пакет изображений для маскированияimage, сгенерированного VAE. Если не указано, тензор маскированных латентов будет сгенерирован с помощьюmask_image. - height (
int, необязательный, по умолчанию self.unet.config.sample_size * self.vae_scale_factor) — Высота генерируемого изображения в пикселях. По умолчанию установлено значение 1024 для достижения наилучших результатов. - width (
int, необязательный, по умолчанию self.unet.config.sample_size * self.vae_scale_factor) — Ширина генерируемого изображения в пикселях. По умолчанию установлено значение 1024 для достижения наилучших результатов. - strength (
float, необязательный, по умолчанию 1.0) — Определяет степень трансформации исходногоimage. Значение должно находиться в диапазоне от 0 до 1.imageиспользуется как стартовая точка, и чем вышеstrength, тем больше шума добавляется. Количество шагов денойзинга зависит от количества шума, добавленного изначально. Когдаstrengthравно 1, добавляется максимальное количество шума, и процесс денойзинга выполняется в течение полного числа итераций, указанного вnum_inference_steps. Значение 1 по сути игнорируетimage. - num_inference_steps (
int, необязательный, по умолчанию 50) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода. - sigmas (
list[float], необязательный) — Пользовательские сигмы для процесса удаления шума в планировщиках, поддерживающих аргументsigmasв их методеset_timesteps. Если не задано, будет использоваться поведение по умолчанию при передачеnum_inference_steps. - guidance_scale (
float, необязательный, по умолчанию 7.0) — Масштаб руководства, определенный в Classifier-Free Diffusion Guidance.guidance_scaleопределяется какwиз уравнения 2 статьи Imagen Paper. Масштаб руководства включается при установкеguidance_scale > 1. Более высокий масштаб руководства способствует генерации изображений, тесно связанных с текстомprompt, обычно за счет снижения качества изображения. - num_images_per_prompt (
int, необязательный, по умолчанию 1) — Количество изображений, генерируемых для каждого промпта. - generator (
torch.Generatorилиlist[torch.Generator], необязательный) — Один или список генераторов torch для обеспечения детерминированности генерации. - latents (
torch.FloatTensor, необязательный) — Предварительно сгенерированные зашумлённые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации изображений. Позволяет корректировать один и тот же процесс генерации с помощью различных промптов. Если не заданы, тензор латентов будет сгенерирован путём выборки с использованием переданного случайногоgenerator. - prompt_embeds (
torch.FloatTensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргументаprompt. - pooled_prompt_embeds (
torch.FloatTensor, необязательный) — Предварительно сгенерированные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, например для взвешивания промпта. Если не предоставлено, пул-эмбеддинги текста будут сгенерированы из входного аргументаprompt. - output_type (
str, необязательный, по умолчанию"pil") — Формат вывода сгенерированного изображения. Выберите один из вариантов: PIL:PIL.Image.Imageилиnp.array. - return_dict (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли возвращать~pipelines.flux.FluxPipelineOutputвместо обычного кортежа. - joint_attention_kwargs (
dict, необязательный) — Словарь kwargs, который при указании передается вAttentionProcessor, определенный вself.processorв модуле diffusers.models.attention_processor. - callback_on_step_end (
Callable, необязательный) — Функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargsбудет содержать список всех тензоров, как указано вcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, необязательный) — Список тензорных входных данных для функцииcallback_on_step_end. Тензоры, указанные в списке, будут переданы в качестве аргументаcallback_kwargs. Вы сможете включать только переменные, перечисленные в атрибуте._callback_tensor_inputsвашего класса пайплайна. - max_sequence_length (
int, по умолчанию 512) — максимальная длина последовательности, используемая сprompt.
Возвращает
~pipelines.flux.FluxPipelineOutput или tuple
~pipelines.flux.FluxPipelineOutput, если return_dict
равно True, иначе tuple. При возврате кортежа первым элементом является список с сгенерированными
изображениями.
Функция, вызываемая при обращении к конвейеру для генерации.
Примеры:
import torch
from diffusers import FluxControlInpaintPipeline
from diffusers.models.transformers import FluxTransformer2DModel
from transformers import T5EncoderModel
from diffusers.utils import load_image, make_image_grid
from image_gen_aux import DepthPreprocessor # https://github.com/huggingface/image_gen_aux
from PIL import Image
import numpy as np
pipe = FluxControlInpaintPipeline.from_pretrained(
"black-forest-labs/FLUX.1-Depth-dev",
torch_dtype=torch.bfloat16,
)
# use following lines if you have GPU constraints
# ---------------------------------------------------------------
transformer = FluxTransformer2DModel.from_pretrained(
"sayakpaul/FLUX.1-Depth-dev-nf4", subfolder="transformer", torch_dtype=torch.bfloat16
)
text_encoder_2 = T5EncoderModel.from_pretrained(
"sayakpaul/FLUX.1-Depth-dev-nf4", subfolder="text_encoder_2", torch_dtype=torch.bfloat16
)
pipe.transformer = transformer
pipe.text_encoder_2 = text_encoder_2
pipe.enable_model_cpu_offload()
# ---------------------------------------------------------------
pipe.to("cuda")
prompt = "a blue robot singing opera with human-like expressions"
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/robot.png")
head_mask = np.zeros_like(image)
head_mask[65:580, 300:642] = 255
mask_image = Image.fromarray(head_mask)
processor = DepthPreprocessor.from_pretrained("LiheYoung/depth-anything-large-hf")
control_image = processor(image)[0].convert("RGB")
output = pipe(
prompt=prompt,
image=image,
control_image=control_image,
mask_image=mask_image,
num_inference_steps=30,
strength=0.9,
guidance_scale=10.0,
generator=torch.Generator().manual_seed(42),
).images[0]
make_image_grid([image, control_image, mask_image, output.resize(image.size)], rows=1, cols=4).save(
"output.png"
)encode_prompt
< source >( prompt: str | list[str]prompt_2: str | list[str] | None = Nonedevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1prompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonemax_sequence_length: int = 512lora_scale: float | None = None )
Параметры
- prompt (
strилиlist[str], необязательный) — промпт для кодирования - prompt_2 (
strилиlist[str], необязательный) — Промпт или промпты, которые передаются вtokenizer_2иtext_encoder_2. Если не задан, во всех text-encoders используетсяprompt - device — (
torch.device): устройство torch - num_images_per_prompt (
int) — количество изображений, которые должны быть сгенерированы для каждого промпта - prompt_embeds (
torch.FloatTensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргументаprompt. - pooled_prompt_embeds (
torch.FloatTensor, необязательный) — Предварительно сгенерированные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, например для взвешивания промпта. Если не предоставлено, пул-эмбеддинги текста будут сгенерированы из входного аргументаprompt. - lora_scale (
float, необязательный) — Масштаб LoRA, который будет применён ко всем слоям LoRA текстового кодировщика, если слои LoRA загружены.
FluxPipelineOutput
класс diffusers.pipelines.flux.pipeline_output.FluxPipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
Параметры
- images (
list[PIL.Image.Image]илиtorch.Tensorилиnp.ndarray) — список денойзированных изображений PIL длинойbatch_sizeили массив numpy или тензор torch с формой(batch_size, height, width, num_channels). Изображения PIL или массив numpy представляют денойзированные изображения диффузионного пайплайна. Тензоры Torch могут представлять либо денойзированные изображения, либо промежуточные латенты, готовые к передаче в декодер.
Класс вывода для пайплайнов генерации изображений Flux.