はじめに
IP-Adapter を Stable Diffusion Web UI の拡張機能としてではなく公式のGitHub通りに動かしてみました。IP-Adapterは画像をプロンプトのように扱うモデルです。画像をモデルに与えることで生成画像を制御します。冒頭の画像は左の人物に対してサングラスをかけるように指示を出して作成した画像(右側)です。環境
Windows 11 CUDA 11.7 Python 3.11.5
Python環境構築
pip install torch==2.0.1+cu117 --index-url https://download.pytorch.org/whl/cu117 pip install diffusers[torch] pip install transformers
リポジトリのクローンとモデルのダウンロード
git clone https://github.com/tencent-ailab/IP-Adapter
こちらから「sdxl_models」フォルダ以下をダウンロードして「IP-Adapter」フォルダ内に保存します。
実行
イメージのみ(プロンプトなし)
Pythonスクリプト
import os import torch from diffusers import StableDiffusionXLPipeline from diffusers.utils import load_image from ip_adapter import IPAdapterXL base_model_path = "model/firsttunnerxl_v10_ema" pipe = StableDiffusionXLPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16 ) ip_model = IPAdapterXL( pipe, image_encoder_path="sdxl_models/image_encoder", ip_ckpt="sdxl_models/ip-adapter_sdxl.bin", device="cuda" ) ref_image = load_image("image/woman.png").resize((512, 512)) os.makedirs("results", exist_ok=True) scale = 0.6 image = ip_model.generate( pil_image=ref_image, num_samples=1, #default: 4 scale=scale, #default: 1.0 num_inference_steps=30, seed=420 )[0] image.save(f"results/scale{scale}.png")
結果
一番左が元画像です。右3枚が今回作成した画像です。左からscaleを0.6→0.8→1.0と変更しています。
一応同一人物が描かれるはずですが結果は微妙かもしれません。
イメージ+プロンプト
Pythonスクリプト
import os import torch from diffusers import StableDiffusionXLPipeline from diffusers.utils import load_image from ip_adapter import IPAdapterXL base_model_path = "model/firsttunnerxl_v10_ema" pipe = StableDiffusionXLPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16 ) ip_model = IPAdapterXL( pipe, image_encoder_path="sdxl_models/image_encoder", ip_ckpt="sdxl_models/ip-adapter_sdxl.bin", device="cuda" ) ref_image = load_image("image/woman.png").resize((512, 512)) os.makedirs("results", exist_ok=True) scale = 0.6 image = ip_model.generate( pil_image=ref_image, num_samples=1, #default: 4 scale=scale, #default: 1.0 num_inference_steps=30, seed=420, prompt="best quality, high quality, wearing sunglasses" )[0] image.save(f"results/scale{scale}.png")