Stable Diffusion: как использовать референс персонажа — подключить IP-Adapter в Diffusers, передать картинку в ip_adapter_image и настроить силу через set_ip_adapter_scale. Адаптер замораживает базовую модель и добавляет слои image cross-attention, поэтому сходство с референсом достигается без дообучения. Точную копию персонажа референс не гарантирует.
Что переносит IP-Adapter и почему копия не гарантирована
В документации Diffusers IP-Adapter описан как лёгкий адаптер, который направляет предобученную диффузионную модель с помощью референсного изображения, сохраняя текстовый промпт. Базовая модель остаётся замороженной, добавляется небольшой набор слоёв image cross-attention. Это делает адаптер практичным для переноса субъекта или стиля с фотографии без fine-tuning.
Схема из документации: текстовый промпт идёт через text encoder, референс — через image encoder, затем text cross-attention (замороженный) и IP-Adapter cross-attention сходятся на денойзере, который тоже заморожен. Веса IP-Adapter обычно занимают около 100 МБ, потому что содержат только веса адаптера. Порядок работы: сначала загрузить базовый pipeline, потом адаптер через load_ip_adapter().
README проекта от Tencent AI Lab описывает IP-Adapter как эффективный и лёгкий адаптер на 22M параметров, который даёт результат, сопоставимый с дообученной моделью image prompt. Адаптер обобщается на кастомные модели, дообученные от той же базовой, и работает вместе с текстовым промптом для мультимодальной генерации.
Что это значит на практике. Адаптер переносит признаки референса — визуальные характеристики, которые улавливает image encoder. Точную геометрию лица, родинку, конкретную причёску он не воспроизводит как копию. Сходство зависит от качества референса, силы адаптера, промпта и базовой модели. Документация Diffusers называет варианты чекпоинтов: Plus выбирают, когда важны детали референса, FaceID — когда нужны identity-эмбеддинги InsightFace вместо CLIP image embeddings.
Референс направляет генерацию. Планируйте несколько вариантов и сравнивайте сходство персонажа с исходным изображением.
| Что переносит адаптер | Что остаётся на промпте и модели |
|---|---|
| Признаки субъекта или стиля с референса | Композиция сцены, фон, поза |
| Влияние через image cross-attention | Детализация, которую задаёт базовая модель |
| Совместимость с текстовым промптом | Точная идентичность персонажа |
Подбор совместимых адаптера, базовой модели и image encoder
Совместимость берётся из одного официального примера. Документация Diffusers показывает связку: базовая модель stabilityai/stable-diffusion-xl-base-1.0, адаптер из репозитория h94/IP-Adapter, подпапка sdxl_models, вес ip-adapter_sdxl.bin. Для варианта Plus в том же примере используется ip-adapter-plus_sdxl_vit-h.safetensors и image encoder CLIPVisionModelWithProjection из подпапки models/image_encoder.
Ключевое правило: семейство энкодера и вес адаптера должны соответствовать базовой модели. Веса SDXL лежат в sdxl_models, веса SD1.5 — в models. В примере с ControlNet для SD1.5 документация использует базовую stable-diffusion-v1-5/stable-diffusion-v1-5 и вес ip-adapter_sd15.bin из подпапки models. Смешивать эти наборы не стоит.
README Tencent AI Lab фиксирует историю версий: 8 сентября 2023 года вышло обновление IP-Adapter для SDXL 1.0, 23 августа 2023 года — версия с fine-grained features, 30 августа 2023 года — вариант с изображением лица как промптом. В новой версии от 8 сентября 2023 года авторы перешли на CLIP-ViT-H вместо OpenCLIP-ViT-bigG-14: по их экспериментам заметной разницы не нашлось, а меньшая модель снижает расход памяти на инференсе.
Для FaceID README перечисляет экспериментальные версии: FaceID, FaceID-Plus, FaceID-PlusV2, FaceID для SDXL, FaceID-PlusV2 для SDXL и IP-Adapter-FaceID-Portrait. Документация Diffusers указывает, что FaceID нужен, когда требуются identity-эмбеддинги InsightFace.
| Задача | Базовая модель | Вес адаптера | Image encoder |
|---|---|---|---|
| Общий референс SDXL | stable-diffusion-xl-base-1.0 | ip-adapter_sdxl.bin | по умолчанию в pipeline |
| Детали референса | stable-diffusion-xl-base-1.0 | ip-adapter-plus_sdxl_vit-h.safetensors | CLIPVisionModelWithProjection |
| Лицо, SDXL | stable-diffusion-xl-base-1.0 | ip-adapter-plus-face_sdxl_vit-h.safetensors | CLIPVisionModelWithProjection |
| SD1.5 с ControlNet | stable-diffusion-v1-5 | ip-adapter_sd15.bin | по умолчанию в pipeline |
Последовательность Diffusers: pipeline, адаптер, изображение
Документированный порядок из страницы Diffusers. Сначала создаётся pipeline из базовой модели, затем загружается адаптер, затем задаётся сила, затем передаётся изображение вместе с промптом.
import torch
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
pipeline.load_ip_adapter(
"h94/IP-Adapter",
subfolder="sdxl_models",
weight_name="ip-adapter_sdxl.bin"
)
pipeline.set_ip_adapter_scale(0.8)
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_diner.png")
pipeline(
prompt="a polar bear sitting in a chair drinking a milkshake",
ip_adapter_image=image,
negative_prompt="deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality",
).images[0]
Референс передаётся в параметр ip_adapter_image вместе с текстовым промптом. Документация показывает этот вызов на примере SDXL и веса ip-adapter_sdxl.bin.
Отдельный документированный шаг — предвычисление эмбеддингов. Метод prepare_ip_adapter_image_embeds() кодирует изображения IP-Adapter в эмбеддинги, которые можно сохранить и переиспользовать. Документация предлагает считать их один раз вместо повторной загрузки и кодирования тех же изображений при каждом запуске pipeline. При повторной загрузке эмбеддингов параметр image_encoder_folder выставляется в None, потому что image encoder для генерации эмбеддингов больше не нужен. Документация также упоминает загрузку эмбеддингов из других источников, например ComfyUI.
Для нескольких референсов документация описывает бинарные маски: IPAdapterMaskProcessor препроцессит маски, а результат передаётся в cross_attention_kwargs с ключом ip_adapter_masks. Каждому изображению IP-Adapter нужна своя бинарная маска.
set_ip_adapter_scale и ограничения квадратного кропа
set_ip_adapter_scale() управляет тем, насколько сильно IP-Adapter направляет генерацию. Документация Diffusers приводит значения: 1.0 применяет адаптер на полной силе, 0.5 обычно балансирует текстовый и image промпты. В примере с SDXL на странице стоит 0.8.
README Tencent AI Lab даёт свою рекомендацию: при использовании только image prompt можно поставить scale=1.0 и text_prompt="" либо общий текстовый промпт вроде «best quality». При понижении scale генерируется больше разнообразных изображений, но они могут быть менее согласованы с image prompt. Для мультимодальных промптов README советует подбирать scale, а в большинстве случаев scale=0.5 даёт хорошие результаты. Для SD 1.5 авторы рекомендуют community-модели.
Масштаб можно задавать по слоям. Документация показывает словарь с блоками down и up, например {"down": {"block_2": [0.0, 1.0]}, "up": {"block_0": [0.0, 1.0, 0.0]}}. Слои, не указанные в словаре, получают 0, то есть IP-Adapter в них отключён. В примере InstantStyle адаптер включается в down block_2 (layout) и up block_0 (style). Документация отмечает: включение адаптера во все слои обычно сильнее следует image prompt и может снижать разнообразие.
Ограничение кропа. README Tencent AI Lab объясняет: изображение по умолчанию центрально кадрируется в image processor CLIP, поэтому IP-Adapter лучше всего работает с квадратными изображениями. Для неквадратных теряется информация за пределами центра. Авторы предлагают просто изменить размер до 224×224 и приводят сравнение crop и resize. Этот вывод относится к описанному в README image processor CLIP.
| Параметр | Значение из источника | Что меняет |
|---|---|---|
| set_ip_adapter_scale | 1.0 | Полная сила адаптера |
| set_ip_adapter_scale | 0.5 | Баланс текста и изображения |
| set_ip_adapter_scale | 0.8 | Пример на странице Diffusers для SDXL |
| scale по слоям | down block_2, up block_0 | Включение адаптера в выбранных слоях |
| Неквадратный референс | resize до 224×224 | Сохранение информации за пределами центра |
Промпт для новой сцены и карточка сравнения
Задача промпта — перенести персонажа с референса в новую сцену, меняя ровно один документированный параметр за прогон. Ниже учебный пример: он не является измеренным результатом.
Персонаж с референсного изображения в новой сцене: [ваша сцена].
Сохрани черты лица, причёску и цвет волос с референса.
Стиль: [ваш стиль]. Освещение: [ваше освещение]. Ракурс: [ваш ракурс].
Не меняй личность персонажа, меняй только окружение и позу.
Что менять под себя: сцену, стиль, освещение и ракурс. Один прогон — одно изменение документированного параметра, например set_ip_adapter_scale с 0.8 на 0.5. Остальные входные данные фиксируются: тот же референс, та же базовая модель, тот же вес адаптера, тот же seed.
Карточка сравнения для записи результатов:
| Поле | Прогон A | Прогон B |
|---|---|---|
| Референс | тот же файл | тот же файл |
| Базовая модель | stable-diffusion-xl-base-1.0 | stable-diffusion-xl-base-1.0 |
| Вес адаптера | ip-adapter_sdxl.bin | ip-adapter_sdxl.bin |
| set_ip_adapter_scale | 0.8 | 0.5 |
| Промпт | тот же | тот же |
| Seed | тот же | тот же |
| Сходство лица | ваша оценка | ваша оценка |
| Фон и композиция | ваша оценка | ваша оценка |
| Целостность деталей | ваша оценка | ваша оценка |
Такой формат отделяет влияние промпта от влияния референса: меняется одна строка, остальное зафиксировано. Для нескольких референсов документация Diffusers описывает передачу списка изображений и списка масок, а также комбинацию нескольких IP-Adapter с разными весами, например set_ip_adapter_scale([0.7, 0.3]). Документация приводит рецепт: IP-Adapter Face для согласованных лиц и IP-Adapter Plus для генерации этих лиц в конкретных стилях.
Проверка результата и действия при неудаче
Проверка идёт по трём осям. Сходство лица: сравните черты с референсом при том же ракурсе. Независимость фона: убедитесь, что фон соответствует новой сцене из промпта. Целостность деталей: проверьте руки, пропорции, мелкие элементы. Документация Diffusers в примерах использует negative prompt с перечислением deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality.
Если результат неудовлетворителен, есть документированные рычаги. Изменить set_ip_adapter_scale в сторону 1.0 для более сильного следования референсу или в сторону 0.5 для баланса с текстом. Сменить вес адаптера: Plus, когда важны детали референса, FaceID, когда нужны identity-эмбеддинги InsightFace. Передать квадратный референс или изменить размер до 224×224, если исходное изображение неквадратное. Задать масштаб по слоям, чтобы включить адаптер только в нужных блоках. Добавить ControlNet для структурного контроля: документация показывает комбинацию с depth map и edge map.
Гарантированного лечения нет. README Tencent AI Lab прямо оговаривает: при понижении scale изображения разнообразнее, но менее согласованы с image prompt. Документация Diffusers отмечает, что включение адаптера во все слои может снижать разнообразие. Для сходства лица требуется подобрать референс, промпт и силу адаптера. Ведите карточку сравнения и меняйте по одному параметру за прогон.
Частые вопросы
Что такое stable diffusion референс и зачем он нужен?
Референс — изображение, которое передаётся в IP-Adapter через параметр ip_adapter_image вместе с текстовым промптом. Адаптер направляет предобученную модель с помощью этого изображения, сохраняя текстовый промпт. Базовая модель при этом остаётся замороженной.
Почему референс не даёт точной копии персонажа?
IP-Adapter переносит признаки, которые улавливает image encoder. Точная геометрия лица при этом не гарантируется. Сходство зависит от качества референса, силы адаптера, промпта и базовой модели. README Tencent AI Lab отмечает, что при понижении scale изображения разнообразнее, но менее согласованы с image prompt.
Какие веса и image encoder совместимы с SDXL?
Документация Diffusers показывает для SDXL базовую модель stabilityai/stable-diffusion-xl-base-1.0, подпапку sdxl_models и вес ip-adapter_sdxl.bin. Для варианта Plus используется ip-adapter-plus_sdxl_vit-h.safetensors и CLIPVisionModelWithProjection из подпапки models/image_encoder.
Что делает set_ip_adapter_scale?
Параметр управляет силой влияния адаптера на генерацию. Документация приводит значения: 1.0 — полная сила, 0.5 — баланс текста и изображения. Масштаб можно задавать по слоям словарём с блоками down и up, а неуказанные слои получают 0.
Почему неквадратный референс теряет детали?
README Tencent AI Lab объясняет: изображение по умолчанию центрально кадрируется в image processor CLIP, поэтому информация за пределами центра теряется. Авторы предлагают изменить размер до 224×224 и приводят сравнение crop и resize. Это свойство описанного CLIP processor.
