Diffusers documentation
ControlNet
ControlNet
ControlNet был представлен в статье Adding Conditional Control to Text-to-Image Diffusion Models авторами Lvmin Zhang, Anyi Rao и Maneesh Agrawala.
С помощью модели ControlNet можно передать дополнительное управляющее изображение для настройки и управления генерацией в Stable Diffusion. Например, если вы предоставите карту глубины, модель ControlNet сгенерирует изображение, сохраняющее пространственную информацию из этой карты. Это более гибкий и точный способ управления процессом генерации изображений.
Аннотация из статьи:
Мы представляем ControlNet — архитектуру нейронной сети для добавления пространственного управления условиями к крупным предобученным диффузионным моделям «текст в изображение». ControlNet фиксирует готовые к производству крупные диффузионные модели и повторно использует их глубокие и устойчивые слои кодирования, предобученные на миллиардах изображений, в качестве мощного каркаса для обучения разнообразному набору условных контролей. Нейронная архитектура соединяется с «нулевыми свёртками» (слоями свёртки с нулевой инициализацией), которые постепенно наращивают параметры от нуля и гарантируют, что вредоносный шум не может повлиять на дообучение. Мы тестируем различные условные контроли, например, края, глубину, сегментацию, позу человека и т. д., с Stable Diffusion, используя одно или несколько условий, с промптами или без них. Мы показываем, что обучение ControlNet устойчиво как на малых (<50k), так и на больших (>1m) наборах данных. Обширные результаты демонстрируют, что ControlNet может способствовать более широкому применению для управления диффузионными моделями изображений.
Этот конвейер был предложен пользователем ishan24. ❤️ Исходная кодовая база доступна по адресу NVlabs/Sana, а официальные контрольные точки ControlNet можно найти в профиле Efficient-Large-Model’s на Hub.
SanaControlNetPipeline
класс diffusers.SanaControlNetPipeline
< source >( tokenizer: GemmaTokenizertext_encoder: Gemma2PreTrainedModelvae: AutoencoderDCtransformer: SanaTransformer2DModelcontrolnet: SanaControlNetModelscheduler: DPMSolverMultistepScheduler )
Пайплайн для генерации изображений по тексту с использованием Sana.
__call__
< source >( prompt: str | list[str] = Nonenegative_prompt: str = ''num_inference_steps: int = 20timesteps: list = Nonesigmas: list = Noneguidance_scale: float = 4.5control_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonecontrolnet_conditioning_scale: float | list[float] = 1.0num_images_per_prompt: int | None = 1height: int = 1024width: int = 1024eta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Trueclean_caption: bool = Falseuse_resolution_binning: bool = Trueattention_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 = 300complex_human_instruction: list = ["Given a user prompt, generate an 'Enhanced prompt' that provides detailed visual descriptions suitable for image generation. Evaluate the level of detail in the user prompt:", '- If the prompt is simple, focus on adding specifics about colors, shapes, sizes, textures, and spatial relationships to create vivid and concrete scenes.', '- If the prompt is already detailed, refine and enhance the existing details slightly without overcomplicating.', 'Here are examples of how to transform or refine prompts:', '- User Prompt: A cat sleeping -> Enhanced: A small, fluffy white cat curled up in a round shape, sleeping peacefully on a warm sunny windowsill, surrounded by pots of blooming red flowers.', '- User Prompt: A busy city street -> Enhanced: A bustling city street scene at dusk, featuring glowing street lamps, a diverse crowd of people in colorful clothing, and a double-decker bus passing by towering glass skyscrapers.', 'Please generate only the enhanced description for the prompt below and avoid including any additional commentary or evaluations:', 'User Prompt: '] ) → SanaPipelineOutput or tuple
Параметры
- prompt (
strилиlist[str], необязательный) — Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передатьprompt_embedsвместо него. - negative_prompt (
strorlist[str], необязательный) — Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передатьnegative_prompt_embeds. Игнорируется, если не используется направляющее поле (то есть игнорируется, еслиguidance_scaleменьше1). - num_inference_steps (
int, необязательный, по умолчанию 20) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода. - timesteps (
list[int], необязательный) — Пользовательские шаги для процесса удаления шума в планировщиках, поддерживающих аргументtimestepsв методеset_timesteps. Если не задан, будет использоваться поведение по умолчанию при передачеnum_inference_steps. Значения должны быть в порядке убывания. - sigmas (
list[float], необязательный) — Пользовательские сигмы для процесса удаления шума в планировщиках, поддерживающих аргументsigmasв их методеset_timesteps. Если не задано, будет использоваться поведение по умолчанию при передачеnum_inference_steps. - guidance_scale (
float, необязательный, по умолчанию 4.5) — Масштаб руководства, как определено в Classifier-Free Diffusion Guidance.guidance_scaleопределяется какwиз уравнения 2 статьи Imagen Paper. Масштаб руководства включается при установкеguidance_scale > 1. Более высокий масштаб руководства способствует генерации изображений, тесно связанных с текстомprompt, обычно за счёт снижения качества изображения. - 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. - controlnet_conditioning_scale (
floatилиlist[float], необязательный, по умолчанию 1.0) — Выходы ControlNet умножаются наcontrolnet_conditioning_scaleперед добавлением к остаточному соединению в исходномunet. Если вinitуказано несколько ControlNet, соответствующий масштаб можно задать в виде списка. - num_images_per_prompt (
int, необязательный, по умолчанию 1) — Количество изображений, генерируемых для каждого промпта. - height (
int, необязательный, по умолчанию self.unet.config.sample_size) — Высота генерируемого изображения в пикселях. - width (
int, необязательный, по умолчанию self.unet.config.sample_size) — Ширина генерируемого изображения в пикселях. - eta (
float, необязательный, по умолчанию 0.0) — Соответствует параметру eta (η) в статье DDIM: https://huggingface.co/papers/2010.02502. Применяется только к schedulers.DDIMScheduler, для остальных игнорируется. - generator (
torch.Generatorилиlist[torch.Generator], необязательный) — Один или список генераторов torch для обеспечения детерминированности генерации. - latents (
torch.Tensor, необязательный) — Предварительно сгенерированные зашумлённые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации изображений. Позволяет корректировать один и тот же процесс генерации с помощью различных промптов. Если не заданы, тензор латентов будет сгенерирован путём выборки с использованием переданного случайногоgenerator. - prompt_embeds (
torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргументаprompt. - prompt_attention_mask (
torch.Tensor, необязательный) — Предварительно сгенерированная маска внимания для текстовых эмбеддингов. - negative_prompt_embeds (
torch.Tensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для PixArt-Sigma этот отрицательный промпт должен быть "". Если не предоставлен, negative_prompt_embeds будет сгенерирован из входного аргументаnegative_prompt. - negative_prompt_attention_mask (
torch.Tensor, необязательный) — Предварительно сгенерированная маска внимания для отрицательных текстовых эмбеддингов. - output_type (
str, необязательный, по умолчанию"pil") — Формат вывода сгенерированного изображения. Выберите один из вариантов: PIL:PIL.Image.Imageилиnp.array. - return_dict (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли возвращать~pipelines.stable_diffusion.IFPipelineOutputвместо обычного кортежа. - attention_kwargs —
Словарь kwargs, который при указании передаётся в
AttentionProcessor, определённый вself.processorв модуле diffusers.models.attention_processor. - clean_caption (
bool, необязательный, по умолчаниюTrue) — Определяет, нужно ли очищать подпись перед созданием эмбеддингов. Требует установкиbeautifulsoup4иftfy. Если зависимости не установлены, эмбеддинги будут созданы из исходного промпта. - use_resolution_binning (
bool, по умолчаниюTrue) — Если установлено вTrue, запрашиваемые высота и ширина сначала сопоставляются с ближайшими разрешениями с помощьюASPECT_RATIO_1024_BIN. После декодирования полученных латентов в изображения они масштабируются обратно до запрошенного разрешения. Полезно для генерации изображений, не являющихся квадратными. - 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, по умолчанию300) — Максимальная длина последовательности, используемая сprompt. - complex_human_instruction (
list[str], необязательный) — Инструкции для сложного человеческого внимания: https://github.com/NVlabs/Sana/blob/main/configs/sana_app_config/Sana_1600M_app.yaml#L55.
Возвращает
SanaPipelineOutput или tuple
Если return_dict равно True, возвращается SanaPipelineOutput,
в противном случае возвращается tuple, где первый элемент — это список с сгенерированными изображениями
Функция, вызываемая при обращении к конвейеру для генерации.
Примеры:
>>> import torch
>>> from diffusers import SanaControlNetPipeline
>>> from diffusers.utils import load_image
>>> pipe = SanaControlNetPipeline.from_pretrained(
... "ishan24/Sana_600M_1024px_ControlNetPlus_diffusers",
... variant="fp16",
... torch_dtype={"default": torch.bfloat16, "controlnet": torch.float16, "transformer": torch.float16},
... device_map="balanced",
... )
>>> cond_image = load_image(
... "https://huggingface.co/ishan24/Sana_600M_1024px_ControlNet_diffusers/resolve/main/hed_example.png"
... )
>>> prompt = 'a cat with a neon sign that says "Sana"'
>>> image = pipe(
... prompt,
... control_image=cond_image,
... ).images[0]
>>> image.save("output.png")encode_prompt
< source >( prompt: str | list[str]do_classifier_free_guidance: bool = Truenegative_prompt: str = ''num_images_per_prompt: int = 1device: typing.Optional[torch.device] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneclean_caption: bool = Falsemax_sequence_length: int = 300complex_human_instruction: list[str] | None = Nonelora_scale: float | None = None )
Параметры
- prompt (
strилиlist[str], необязательный) — промпт для кодирования - negative_prompt (
strorlist[str], необязательный) — Промпт, который не должен направлять генерацию изображения. Если не задан, необходимо передатьnegative_prompt_embedsвместо него. Игнорируется, если не используется направляющий сигнал (т. е. игнорируется, еслиguidance_scaleменьше1). Для PixArt-Alpha это должно быть "". - do_classifier_free_guidance (
bool, необязательный, по умолчаниюTrue) — использовать ли classifier free guidance - num_images_per_prompt (
int, необязательный, по умолчанию 1) — количество изображений, которые должны быть сгенерированы для каждого промпта - device — (
torch.device, необязательный): устройство torch, на котором будут размещены полученные эмбеддинги - prompt_embeds (
torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргументаprompt. - negative_prompt_embeds (
torch.Tensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для Sana это должны быть эмбеддинги пустой строки "". - clean_caption (
bool, по умолчаниюFalse) — ЕслиTrue, функция выполнит предобработку и очистку переданного описания перед кодированием. - max_sequence_length (
int, по умолчанию 300) — Максимальная длина последовательности, используемая для промпта. - complex_human_instruction (
list[str], по умолчаниюcomplex_human_instruction) — Еслиcomplex_human_instructionне пуст, функция использует сложную инструкцию Human для промпта.
Кодирует промпт в скрытые состояния текстового энкодера.
SanaPipelineOutput
класс diffusers.pipelines.sana.pipeline_output.SanaPipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
Класс вывода для конвейеров Sana.