Diffusers documentation

IP-Adapter

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

IP-Adapter

IP-Adapter mengarahkan model difusi yang telah dilatih sebelumnya menggunakan gambar referensi sambil tetap mempertahankan prompt teks. Metode ini membekukan model dasar dan menambahkan seperangkat kecil lapisan cross-attention gambar, yang membuatnya praktis untuk mencocokkan subjek atau gaya dari foto tanpa perlu fine-tuning.

text prompt                         reference image
    |                                     |
 text encoder                        image encoder
    |                                     |
    v                                     v
 text cross-attn  (frozen)          IP-Adapter cross-attn
    \                                     /
     \                                   /
      +-------->  denoiser  <-----------+
                  (frozen base)

Checkpoint IP-Adapter biasanya berukuran ~100MB karena menyimpan bobot adapter, bukan model lengkap. Muat pipeline dasar terlebih dahulu, kemudian muat adapter dengan load_ip_adapter().

IP-Adapters tersedia untuk banyak model seperti Flux dan Stable Diffusion 3, serta lainnya. Contoh dalam panduan ini menggunakan Stable Diffusion dan Stable Diffusion XL.

Gunakan set_ip_adapter_scale() untuk mengontrol seberapa kuat IP-Adapter mengarahkan generasi. 1.0 menerapkan adapter dengan kekuatan penuh; 0.5 biasanya menyeimbangkan prompt teks dan gambar.

Contoh di bawah ini menunjukkan IP-Adapter pada tugas-tugas umum.

teks-ke-gambar
image-to-image
inpainting
video
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)

Lewatkan gambar ke ip_adapter_image bersama dengan prompt teks untuk menghasilkan gambar.

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
Gambar IP-Adapter
generated image
gambar yang dihasilkan

Varian checkpoint

Muat Plus ketika detail dari gambar referensi paling penting. Muat FaceID ketika Anda memerlukan embedding identitas InsightFace alih-alih embedding gambar CLIP.

IP-Adapter Plus
IP-Adapter FaceID
import torch
from transformers import CLIPVisionModelWithProjection
from diffusers import AutoPipelineForText2Image

image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "h94/IP-Adapter",
    subfolder="models/image_encoder",
    dtype=torch.float16
)

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    image_encoder=image_encoder,
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

pipeline.load_ip_adapter(
  "h94/IP-Adapter",
  subfolder="sdxl_models",
  weight_name="ip-adapter-plus_sdxl_vit-h.safetensors"
)

Embedding gambar

prepare_ip_adapter_image_embeds() mengodekan gambar IP-Adapter menjadi embeddings yang dapat Anda simpan dan gunakan kembali. Hitung sebelumnya sekali alih-alih memuat dan mengodekan gambar yang sama setiap kali Anda menjalankan 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"
)

image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_bear_1.png")
image_embeds = pipeline.prepare_ip_adapter_image_embeds(
    ip_adapter_image=image,
    ip_adapter_image_embeds=None,
    device="cuda",
    num_images_per_prompt=1,
    do_classifier_free_guidance=True,
)

torch.save(image_embeds, "image_embeds.ipadpt")

Muat ulang embedding gambar dengan meneruskannya ke parameter ip_adapter_image_embeds. Atur image_encoder_folder ke None karena Anda tidak lagi memerlukan image encoder untuk menghasilkan embedding gambar.

Anda juga dapat memuat embedding gambar dari sumber lain seperti ComfyUI.

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",
  image_encoder_folder=None,
  weight_name="ip-adapter_sdxl.bin"
)
pipeline.set_ip_adapter_scale(0.8)
image_embeds = torch.load("image_embeds.ipadpt")
pipeline(
    prompt="a polar bear sitting in a chair drinking a milkshake",
    ip_adapter_image_embeds=image_embeds,
    negative_prompt="deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality",
    num_inference_steps=100,
).images[0]

Masking

Masking biner memungkinkan penugasan gambar IP-Adapter ke area tertentu pada gambar output, sehingga berguna untuk menyusun beberapa gambar IP-Adapter. Setiap gambar IP-Adapter memerlukan mask biner.

Muat IPAdapterMaskProcessor untuk memproses pramasker gambar. Untuk hasil terbaik, berikan height dan width keluaran untuk memastikan mask dengan rasio aspek yang berbeda berukuran sesuai. Jika mask masukan sudah sesuai dengan rasio aspek gambar yang dihasilkan, Anda tidak perlu mengatur height dan width.

import torch
from diffusers import AutoPipelineForText2Image
from diffusers.image_processor import IPAdapterMaskProcessor
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"

mask1 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_mask_mask1.png")
mask2 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_mask_mask2.png")

processor = IPAdapterMaskProcessor()
masks = processor.preprocess([mask1, mask2], height=1024, width=1024)
mask 1
mask 1
mask 2
mask 2

Sediakan gambar IP-Adapter dan skala mereka sebagai daftar. Teruskan mask yang telah dipreproses ke cross_attention_kwargs di pipeline.

face_image1 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_mask_girl1.png")
face_image2 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_mask_girl2.png")

pipeline.load_ip_adapter(
  "h94/IP-Adapter",
  subfolder="sdxl_models",
  weight_name=["ip-adapter-plus-face_sdxl_vit-h.safetensors"]
)
pipeline.set_ip_adapter_scale([[0.7, 0.7]])

ip_images = [[face_image1, face_image2]]
masks = [masks.reshape(1, masks.shape[0], masks.shape[2], masks.shape[3])]

pipeline(
  prompt="2 girls",
  ip_adapter_image=ip_images,
  negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality",
  cross_attention_kwargs={"ip_adapter_masks": masks}
).images[0]
IP-Adapter image 1
Gambar IP-Adapter 1
IP-Adapter image 2
IP-Adapter gambar 2
Generated image with mask
dihasilkan dengan mask
Generated image without mask
dihasilkan tanpa mask

Resep

Gabungkan IP-Adapter dengan adapter atau pipeline lain, seperti beberapa adapter, ControlNet, InstantStyle, atau LCM few-step, ketika satu gambar referensi tidak cukup.

Beberapa IP-Adapter

Gabungkan beberapa IP-Adapter untuk menghasilkan gambar dengan gaya yang lebih beragam. Misalnya, Anda dapat menggunakan IP-Adapter Face untuk menghasilkan wajah dan karakter yang konsisten, serta IP-Adapter Plus untuk menghasilkan wajah tersebut dalam gaya tertentu.

Muat encoder gambar dengan CLIPVisionModelWithProjection.

import torch
from diffusers import AutoPipelineForText2Image, DDIMScheduler
from transformers import CLIPVisionModelWithProjection
from diffusers.utils import load_image

image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "h94/IP-Adapter",
    subfolder="models/image_encoder",
    dtype=torch.float16,
)

Muat model dasar, penjadwal, dan IP-Adapter berikut.

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16,
    image_encoder=image_encoder,
)
pipeline.scheduler = DDIMScheduler.from_config(pipeline.scheduler.config)
pipeline.load_ip_adapter(
  "h94/IP-Adapter",
  subfolder="sdxl_models",
  weight_name=["ip-adapter-plus_sdxl_vit-h.safetensors", "ip-adapter-plus-face_sdxl_vit-h.safetensors"]
)
pipeline.set_ip_adapter_scale([0.7, 0.3])
# enable_model_cpu_offload to reduce memory usage
pipeline.enable_model_cpu_offload()

Muat sebuah gambar dan folder yang berisi gambar-gambar dengan gaya tertentu untuk diterapkan.

face_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/women_input.png")
style_folder = "https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/style_ziggy"
style_images = [load_image(f"{style_folder}/img{i}.png") for i in range(10)]
Face image
gambar wajah
Style images
gaya gambar

Lewatkan gambar gaya dan wajah sebagai daftar ke ip_adapter_image.

generator = torch.Generator(device="cpu").manual_seed(0)

pipeline(
    prompt="wonderwoman",
    ip_adapter_image=[style_images, face_image],
    negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality",
).images[0]
Generated image
gambar yang dihasilkan

Kontrol struktural

Untuk kontrol struktural, kombinasikan IP-Adapter dengan ControlNet yang dikondisikan pada peta kedalaman, peta tepi, estimasi pose, dan lainnya.

Contoh di bawah ini memuat checkpoint ControlNetModel yang dikondisikan pada peta kedalaman dan menggabungkannya dengan IP-Adapter.

import torch
from diffusers.utils import load_image
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel

controlnet = ControlNetModel.from_pretrained(
  "lllyasviel/control_v11f1p_sd15_depth",
  dtype=torch.float16
)

pipeline = StableDiffusionControlNetPipeline.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5",
    controlnet=controlnet,
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_ip_adapter(
  "h94/IP-Adapter",
  subfolder="models",
  weight_name="ip-adapter_sd15.bin"
)

Lewatkan peta kedalaman dan gambar IP-Adapter ke pipeline.

depth_map = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/depth.png")
ip_adapter_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/statue.png")
pipeline(
  prompt="best quality, high quality",
  image=depth_map,
  ip_adapter_image=ip_adapter_image,
  negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality",
).images[0]
IP-Adapter image
Gambar IP-Adapter
Depth map
peta kedalaman
Generated image
gambar yang dihasilkan

Kontrol gaya dan tata letak

Untuk kontrol gaya dan tata letak, kombinasikan IP-Adapter dengan InstantStyle. InstantStyle memisahkan gaya (warna, tekstur, kesan keseluruhan) dari konten dan menerapkan gaya hanya pada blok yang spesifik untuk gaya, sehingga area konten tetap utuh. Hal ini memberikan konsistensi gaya yang lebih kuat dan kontrol tata letak yang lebih jelas.

Aktifkan IP-Adapter hanya pada lapisan tertentu dengan set_ip_adapter_scale(). Contoh di bawah ini mengaktifkannya pada block_2 (layout) bagian down dan block_0 (style) bagian up dari model.

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"
)

scale = {
    "down": {"block_2": [0.0, 1.0]},
    "up": {"block_0": [0.0, 1.0, 0.0]},
}
pipeline.set_ip_adapter_scale(scale)

Muat gambar gaya dan hasilkan gambar.

style_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg")

pipeline(
    prompt="a cat, masterpiece, best quality, high quality",
    ip_adapter_image=style_image,
    negative_prompt="text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry",
    guidance_scale=5,
).images[0]
Style image
style image
Generated image
gambar yang dihasilkan

Gambar-gambar di bawah ini membandingkan aktivasi gaya-only InstantStyle (hanya block_0) dengan mengaktifkan IP-Adapter di semua lapisan. Pengaturan semua lapisan biasanya mengikuti prompt gambar lebih kuat dan dapat mengurangi keragaman. Pilih skala gaya-only jika Anda menginginkan perilaku pelestarian tata letak dari InstantStyle.

Anda tidak perlu menentukan semua lapisan dalam kamus scale. Lapisan yang tidak disertakan diatur ke 0, yang berarti IP-Adapter dinonaktifkan.

scale = {
    "up": {"block_0": [0.0, 1.0, 0.0]},
}
pipeline.set_ip_adapter_scale(scale)

pipeline(
    prompt="a cat, masterpiece, best quality, high quality",
    ip_adapter_image=style_image,
    negative_prompt="text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry",
    guidance_scale=5,
).images[0]
Generated image (style only)
hanya-gaya (blok_0 atas)
Generated image (all layers)
semua lapisan

Generasi instan

Gabungkan IP-Adapter dengan LCM LoRA untuk generasi beberapa langkah.

import torch
from diffusers import DiffusionPipeline, LCMScheduler
from diffusers.utils import load_image

pipeline = DiffusionPipeline.from_pretrained(
  "sd-dreambooth-library/herge-style",
  dtype=torch.float16
)
pipeline.load_ip_adapter(
  "h94/IP-Adapter",
  subfolder="models",
  weight_name="ip-adapter_sd15.bin"
)
pipeline.load_lora_weights("latent-consistency/lcm-lora-sdv1-5")
pipeline.scheduler = LCMScheduler.from_config(pipeline.scheduler.config)
pipeline.enable_model_cpu_offload()

pipeline.set_ip_adapter_scale(0.4)
ip_adapter_image = load_image("https://user-images.githubusercontent.com/24734142/266492875-2d50d223-8475-44f0-a7c6-08b51cb53572.png")
pipeline(
    prompt="herge_style woman in armor, best quality, high quality",
    ip_adapter_image=ip_adapter_image,
    num_inference_steps=4,
    guidance_scale=1,
).images[0]
Generated image
gambar yang dihasilkan
Update on GitHub