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 điều hướng một mô hình khuếch tán được huấn luyện trước bằng một hình ảnh tham chiếu trong khi bạn vẫn giữ nguyên prompt văn bản. Nó đóng băng mô hình cơ sở và thêm một tập hợp nhỏ các lớp cross-attention hình ảnh, giúp việc khớp chủ thể hoặc phong cách từ một bức ảnh trở nên thực tế mà không cần fine-tuning.

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

Checkpoint của IP-Adapter thường có kích thước ~100MB vì chúng lưu trữ trọng số của adapter, không phải toàn bộ mô hình. Hãy tải pipeline cơ sở trước, sau đó tải adapter bằng load_ip_adapter().

IP-Adapters có sẵn cho nhiều mô hình như Flux và Stable Diffusion 3, cùng nhiều mô hình khác. Các ví dụ trong hướng dẫn này sử dụng Stable Diffusion và Stable Diffusion XL.

Sử dụng set_ip_adapter_scale() để kiểm soát mức độ IP-Adapter điều hướng quá trình tạo. 1.0 áp dụng adapter ở cường độ đầy đủ; 0.5 thường cân bằng giữa prompt văn bản và prompt hình ảnh.

Các ví dụ dưới đây cho thấy IP-Adapter trên các tác vụ phổ biến.

text-to-image
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)

Truyền một hình ảnh vào ip_adapter_image cùng với một câu lệnh văn bản để tạo ra một hình ảnh.

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
Hình ảnh IP-Adapter
generated image
hình ảnh được tạo

Các biến thể checkpoint

Nạp Plus khi chi tiết từ ảnh tham chiếu quan trọng nhất. Nạp FaceID khi bạn cần các vector nhận dạng danh tính của InsightFace thay vì các vector ảnh của 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"
)

Nhúng hình ảnh

prepare_ip_adapter_image_embeds() mã hóa các hình ảnh IP-Adapter thành các embedding mà bạn có thể lưu lại và sử dụng lại. Hãy tính toán trước chúng một lần thay vì tải và mã hóa lại cùng những hình ảnh đó mỗi khi bạn chạy 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")

Tải lại các embedding ảnh bằng cách truyền chúng vào tham số ip_adapter_image_embeds. Đặt image_encoder_folder thành None vì bạn không còn cần image encoder để tạo ra các embedding ảnh nữa.

Bạn cũng có thể nạp các vector nhúng hình ảnh từ các nguồn khác như 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]

Che mặt nạ

Binary masking cho phép gán một hình ảnh IP-Adapter vào một khu vực cụ thể của hình ảnh đầu ra, giúp ích cho việc kết hợp nhiều hình ảnh IP-Adapter. Mỗi hình ảnh IP-Adapter yêu cầu một binary mask.

Tải IPAdapterMaskProcessor để tiền xử lý các mặt nạ hình ảnh. Để đạt kết quả tốt nhất, hãy cung cấp height và width đầu ra để đảm bảo các mặt nạ có tỷ lệ khung hình khác nhau được điều chỉnh kích thước phù hợp. Nếu các mặt nạ đầu vào đã khớp với tỷ lệ khung hình của hình ảnh được tạo, bạn không cần đặt height và 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

Cung cấp cả các hình ảnh IP-Adapter và thang tỷ lệ của chúng dưới dạng danh sách. Truyền các mặt nạ đã tiền xử lý vào cross_attention_kwargs trong 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
Hình ảnh IP-Adapter 1
IP-Adapter image 2
Hình ảnh IP-Adapter 2
Generated image with mask
được tạo với mask
Generated image without mask
được tạo mà không có mặt nạ

Công thức

Kết hợp IP-Adapter với các adapter hoặc pipeline khác, chẳng hạn như nhiều adapter, ControlNet, InstantStyle, hoặc LCM ít bước, khi một hình ảnh tham chiếu là chưa đủ.

Nhiều IP-Adapter

Kết hợp nhiều IP-Adapter để tạo hình ảnh với phong cách đa dạng hơn. Ví dụ, bạn có thể sử dụng IP-Adapter Face để tạo khuôn mặt và nhân vật nhất quán, và IP-Adapter Plus để tạo những khuôn mặt đó theo các phong cách cụ thể.

Tải bộ mã hóa hình ảnh với 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,
)

Tải một mô hình cơ sở, trình lập lịch và các IP-Adapter sau.

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

Tải một hình ảnh và một thư mục chứa các hình ảnh của một phong cách nhất định để áp dụng.

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
ảnh khuôn mặt
Style images
ảnh phong cách

Truyền các ảnh phong cách và khuôn mặt dưới dạng danh sách vào 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
hình ảnh được tạo

Kiểm soát cấu trúc

Để kiểm soát cấu trúc, hãy kết hợp IP-Adapter với ControlNet được điều kiện bởi các bản đồ độ sâu, bản đồ cạnh, ước lượng tư thế và nhiều hơn nữa.

Ví dụ dưới đây tải checkpoint ControlNetModel được điều kiện bởi bản đồ độ sâu và kết hợp nó với 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"
)

Truyền bản đồ độ sâu và hình ảnh IP-Adapter vào 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
Hình ảnh IP-Adapter
Depth map
bản đồ độ sâu
Generated image
hình ảnh được tạo

Kiểm soát kiểu dáng và bố cục

Để kiểm soát phong cách và bố cục, hãy kết hợp IP-Adapter với InstantStyle. InstantStyle tách biệt phong cách (màu sắc, kết cấu, cảm giác tổng thể) khỏi nội dung và chỉ áp dụng phong cách trong các khối dành riêng cho phong cách, nhờ đó các vùng nội dung được giữ nguyên vẹn. Điều này mang lại tính nhất quán phong cách mạnh mẽ hơn và khả năng kiểm soát bố cục rõ ràng hơn.

Kích hoạt IP-Adapter chỉ ở các lớp được chọn bằng set_ip_adapter_scale(). Ví dụ bên dưới bật nó ở khối xuống block_2 (bố cục) và khối lên block_0 (phong cách) của mô hình.

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)

Tải ảnh phong cách và tạo ảnh.

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
hình ảnh được tạo

Các hình dưới đây so sánh kích hoạt chỉ phong cách của InstantStyle (lên block_0) với việc bật IP-Adapter ở tất cả các lớp. Chế độ tất cả các lớp thường bám sát prompt hình ảnh hơn và có thể làm giảm tính đa dạng. Hãy ưu tiên thang đo chỉ phong cách khi bạn muốn giữ nguyên bố cục của InstantStyle.

Bạn không cần chỉ định tất cả các lớp trong từ điển scale. Các lớp không được bao gồm sẽ được đặt thành 0, điều này có nghĩa là IP-Adapter bị vô hiệu hóa.

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)
chỉ style (up block_0)
Generated image (all layers)
tất cả các lớp

Tạo tức thì

Kết hợp IP-Adapter với một LoRA LCM để tạo ảnh trong vài bước.

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
hình ảnh được tạo
Update on GitHub