IP-Adapter для переносу стилю зображення
IP-Adapter (Image Prompt Adapter) переносить стиль, зовнішній вигляд або ідентичність з reference-зображення в генерацію без необхідності fine-tuning моделі. Працює як plug-in: reference-зображення → візуальні embedding'и → управління attention.
Встановлення та базове використання
from diffusers import StableDiffusionXLPipeline
from PIL import Image
import torch
import io
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16
).to("cuda")
# Завантаження IP-Adapter SDXL
pipe.load_ip_adapter(
"h94/IP-Adapter",
subfolder="sdxl_models",
weight_name="ip-adapter_sdxl.bin"
)
def generate_with_style_reference(
style_image: bytes,
prompt: str,
ip_adapter_scale: float = 0.6, # 0.0=нема впливу, 1.0=максимальний
steps: int = 30
) -> bytes:
ref_image = Image.open(io.BytesIO(style_image)).convert("RGB")
pipe.set_ip_adapter_scale(ip_adapter_scale)
result = pipe(
prompt=prompt,
ip_adapter_image=ref_image,
num_inference_steps=steps,
guidance_scale=7.5
).images[0]
buf = io.BytesIO()
result.save(buf, format="PNG")
return buf.getvalue()
IP-Adapter Face ID — збереження ідентичності обличчя
from insightface.app import FaceAnalysis
import cv2
# IP-Adapter FaceID зберігає впізнаваність обличчя в різних стилях
pipe.load_ip_adapter(
"h94/IP-Adapter-FaceID",
subfolder=None,
weight_name="ip-adapter-faceid_sdxl.bin",
image_encoder_folder=None
)
app = FaceAnalysis(name="buffalo_l", providers=["CUDAExecutionProvider"])
app.prepare(ctx_id=0, det_size=(640, 640))
def generate_face_in_style(
face_photo: bytes,
prompt: str,
scale: float = 0.7
) -> bytes:
img_np = cv2.imdecode(np.frombuffer(face_photo, np.uint8), cv2.IMREAD_COLOR)
faces = app.get(img_np)
if not faces:
raise ValueError("Обличчя не виявлено в reference зображенні")
face_embedding = torch.from_numpy(faces[0].normed_embedding).unsqueeze(0)
pipe.set_ip_adapter_scale(scale)
result = pipe(
prompt=prompt,
ip_adapter_image=face_embedding,
num_inference_steps=30
).images[0]
buf = io.BytesIO()
result.save(buf, format="PNG")
return buf.getvalue()
Комбінування IP-Adapter з ControlNet
from diffusers import StableDiffusionXLControlNetPipeline, ControlNetModel
controlnet = ControlNetModel.from_pretrained(
"diffusers/controlnet-canny-sdxl-1.0",
torch_dtype=torch.float16
)
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
pipe.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
pipe.set_ip_adapter_scale(0.5)
# Генерація: структура з ControlNet + стиль з IP-Adapter
result = pipe(
prompt=prompt,
image=canny_control_image, # Структура з Canny
ip_adapter_image=style_reference, # Стиль з reference
controlnet_conditioning_scale=0.8,
num_inference_steps=30
).images[0]
Сценарії використання
| Сценарій | IP-Adapter scale | ControlNet |
|---|---|---|
| Перенесення художнього стилю | 0.7–0.9 | Ні |
| Генерація аватарів з обличчям | 0.6–0.8 (FaceID) | Опціонально OpenPose |
| Продукт у стилі бренду | 0.5–0.7 | Canny для форми |
| Персонаж у різних сценах | 0.6–0.8 | Ні |
IP-Adapter в 5–10 разів швидше, ніж навчання LoRA/DreamBooth для завдань, де потрібний style-референс без точного відтворення деталей. Терміни інтеграції в pipeline — 1–2 дні.







