画像をプロンプト代わりに使えるIP-Adapterのインストール

画像をプロンプト代わりに使えるIP-Adapterのインストール ツール

「すでにある画像をベースにして画像生成を行いたい」
「IP-Adapterがインストールできない・・・」

このような場合には、この記事の内容が参考になります。
この記事では、IP-Adapterについて解説しています。

本記事の内容

  • IP-Adapterとは?
  • IP-Adapterのインストール
  • IP-Adapterの動作確認

それでは、上記に沿って解説していきます。

IP-Adapterとは?

GitHub - tencent-ailab/IP-Adapter: The image prompt adapter is designed to enable a pretrained text-to-image diffusion model to generate images with image prompt.
The image prompt adapter is designed to enable a pretrained text-to-image diffusion model to generate images with image prompt. - GitHub - tencent-ailab/IP-Ada...

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用のモデルです。

そのモデルは、以下のページからダウンロードできます。

h94/IP-Adapter at main
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

「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の動作確認を説明しました。

タイトルとURLをコピーしました