「すでにある画像をベースにして画像生成を行いたい」
「IP-Adapterがインストールできない・・・」
このような場合には、この記事の内容が参考になります。
この記事では、IP-Adapterについて解説しています。
本記事の内容
- IP-Adapterとは?
- IP-Adapterのインストール
- IP-Adapterの動作確認
それでは、上記に沿って解説していきます。
IP-Adapterとは?
IP-Adapterとは、画像生成AIの補助ツールになります。
画像生成自体は、Stable Diffusionで行います。
その際、テキストだけでは伝える情報として限界があります。
例えば、「犬が街の中を歩いている」をプロンプトにするとします。
この場合、あなたのイメージする犬があるはずです。
それを言葉で表現して、さらに英語に変換する必要があります。
そうなってくると、なかなか自分のイメージを伝え切ることはできません。
そんな中で、次のような画像をヒントに渡せればどうでしょうか?
そして、プロンプトは以下を入力するだけです。
walk, in the city
その結果、次のような画像が生成されるようになります。
ヒントとして渡した画像の犬が街を歩いています。
この画像は、実際にIP-Adapterを用いて生成した画像です。
他にも、二つの画像を用いて以下のようなことが可能となります。
共通しているのは、テキストではなく画像を主な入力データとして用いるところになりますね。
そして、ControlNetも利用可能となっています。
また、以下の両方をサポートしています。
- SD 1.5
- SDXL 1.0
SDXL 1.0に対応しているのは、大きいポイントになります。
どうしても世間の注目は、SDXLに向かっていますからね。
以上、IP-Adapterについて説明しました。
次は、IP-Adapterのインストールを説明します。
IP-Adapterのインストール
追記 2023年9月11日
web UIでもIP-Adapterを利用できます。
IP-Adapterのインストールについて説明していきます。
インストールは、Python仮想環境を利用しましょう。
検証は、次のバージョンのPythonで行います。
> python -V Python 3.10.4
まずは、IP-Adapterをダウンロードします。
git clone https://github.com/tencent-ailab/IP-Adapter.git cd IP-Adapter
そして、リポジトリルートに移動しましょう。
通常であれば、ここにrequirements.txtかenvironment.yamlを確認できます。
しかし、IP-Adapterにはそのようなファイルが存在していません。
ということで、コードをもとに必要なモノを導き出します。
- PyTorch
- Diffusers
- Transformers
- Accelerate
とりあえず、上記があれば今回の動作確認は可能です。
Accelerateはなくても動きますが、処理時間を劇的に短縮してくれます。
すべて最新版をインストールしておきます。
python -m pip install --upgrade pip setuptools pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install diffusers pip install transformers pip install accelerate
Diffusersは、0.19.3以降である必要があります。
でも、最新版を入れておけば問題ありません。
あと、モデルをダウンロードしないといけません。
ここで言うモデルは、IP-Adapter用のモデルです。
そのモデルは、以下のページからダウンロードできます。
「models」は、SD 1.5用です。
「sdxl_models」は、SDXL 1.0用になります。
とりあえず、両方ダウンロードしておきましょう。
手動で落としても良いですが、gitコマンドを使えば簡単にダウンロードできます。
git clone https://huggingface.co/h94/IP-Adapter
ダウンロードできたら、リポジトリルート直下に保存します。
以上、IP-Adapterのインストールを説明しました。
次は、IP-Adapterの動作確認を説明します。
IP-Adapterの動作確認
デモプログラムは、Jupyter Notebookファイルで用意されています。
上記ファイルをそのまま起動させたい場合は、以下を利用しましょう。
面倒だなという方は、以下のファイルをリポジトリルートに保存しましょう。
ip_adapter_multimodal_prompts_demo.ipynbを参考に作成しています。
test_sd15.py
import torch from diffusers import StableDiffusionPipeline, StableDiffusionImg2ImgPipeline, StableDiffusionInpaintPipelineLegacy, DDIMScheduler, AutoencoderKL from PIL import Image from ip_adapter import IPAdapter base_model_path = "runwayml/stable-diffusion-v1-5" vae_model_path = "stabilityai/sd-vae-ft-mse" image_encoder_path = "models/image_encoder/" ip_ckpt = "models/ip-adapter_sd15.bin" device = "cuda" noise_scheduler = DDIMScheduler( num_train_timesteps=1000, beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", clip_sample=False, set_alpha_to_one=False, steps_offset=1, ) vae = AutoencoderKL.from_pretrained(vae_model_path).to(dtype=torch.float16) # load SD pipeline pipe = StableDiffusionPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16, scheduler=noise_scheduler, vae=vae, feature_extractor=None, safety_checker=None ) # read image prompt image = Image.open("assets/images/woman.png") resize_image = image.resize((256, 256)) # load ip-adapter ip_model = IPAdapter(pipe, image_encoder_path, ip_ckpt, device) # generate image variations generate_image = ip_model.generate(pil_image=image, num_samples=1, num_inference_steps=50, seed=1000, prompt="best quality, high quality, wearing a cap on the beach", scale=0.6 ) generate_image[0].save("generate_image.png")
上記を実行すれば、generate_image.pngがリポジトリルートに作成されます。
以下の画像では、左がwoman.pngで右がgenerate_image.pngになります。
ただ、実はなかなか上手くキャップを表現できませんでした。
scaleやseedを調整して、上手く出せたモノを選んでいます。
それでも、ビーチを表現できていません。
同じことをSDXL 1.0ベースのモデルで行ってみましょう。
test_sdxl10.py
import torch from diffusers import StableDiffusionXLPipeline from PIL import Image from ip_adapter import IPAdapterXL base_model_path = "stabilityai/stable-diffusion-xl-base-1.0" image_encoder_path = "sdxl_models/image_encoder" ip_ckpt = "sdxl_models/ip-adapter_sdxl.bin" device = "cuda" # load SDXL pipeline pipe = StableDiffusionXLPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16, add_watermarker=False ) # load ip-adapter ip_model = IPAdapterXL(pipe, image_encoder_path, ip_ckpt, device) # read image prompt image = Image.open("assets/images/woman.png") resize_image = image.resize((512, 512)) resize_image.save("resize_image.png") # generate image variations with only image prompt num_samples = 1 images = ip_model.generate(pil_image=resize_image, num_samples=num_samples, num_inference_steps=50, seed=45, prompt="best quality, high quality, wearing a cap on the beach", scale=0.6 ) images[0].save("generate_image.png")
SDXL 1.0の場合だと、ほぼ100%でキャップ(みたいなモノ)は被ってくれます。
そして、ビーチもちゃんと表現しています。
こうやって比較してみると、SDXL 1.0の性能の高さを感じますね。
SDXLと言えば、画質が良いことばかりに目が行きがちになります。
でも、プロンプト(今回は画像も)の解釈や表現に関してもSDXLはレベルが高いですね。
あと、SD 1.5・SDXL 1.0のどちらにおいても他のカスタムモデルを利用できます。
以下は、SDXL 1.0用のモデルで生成した画像になります。
左から、次のモデルを利用しています。
- Copax TimeLessXL
- DynaVision XL
- NightVision XL
- Realities Edge XL
上記のモデルについては、以下の記事で説明しています。
以上、IP-Adapterの動作確認を説明しました。