【StableDiffusion】img2imgをGoogle Colabで実行する方法

StableDiffusion

StableDiffusionには、テキスト+画像から新たな画像を生成するimg2imgがあります。

img2imgを試す方法はいろいろありますが、今回はColaboratory上で実行する方法を紹介します。

img2imgを使う2つの方法

Google Colaboratory上でimg2imgを利用するには、主に以下のアプローチがあります。

  • StableDiffusion公式のimg2imgスクリプトを使う
  • DiffusersのImg2imgPipelineを使う

StableDiffusion公式のimg2imgスクリプトを使う

StableDiffusionのGitHubには、img2imgを実行するためのスクリプトがあります。

stable-diffusion/scripts/img2img.py at main · CompVis/stable-diffusion
A latent text-to-image diffusion model. Contribute to CompVis/stable-diffusion development by creating an account on Git...

使い方はカンタンで、テキスト(プロンプト)や画像のパスをコマンドライン引数に指定してimg2img.pyを実行するだけ。

Colaboratoryで実行する手順は以下の記事が詳しいので、ぜひ参考にしてみてください。

Stable Diffusionのサンプルコード(text2img/img2img)をGoogle Colabで動かす方法

ただ、この方法のデメリットは1回の画像出力に非常に時間がかかってしまうこと。

変換のたびにPythonプロセスを生成するので、モデルのロードといった初期化処理が毎回必要になります。

DiffusersのImg2ImgPipelineを使う

拡散モデルライブラリ「Diffusers」にはImg2ImgPipelineがあります。

Img2ImgPipelineのメリットは、テキストからの画像生成するときと同じようなコードで画像生成できる点です。

テキストからの画像生成は、Colaboratoryの以下ノートブックを利用する人が多いと思います。

Google Colab

このノートブックを数行変更するだけで、画像から画像生成ができるようになります。

以下はImg2ImgPipelineをColaboratoryで使う手順を説明します。

DiffusersのImg2ImgPipelineをColab上で動作させる手順

Colaboratory上でImg2imgPipelineを使う手順です。

ライブラリの準備

diffusersなど各種ライブラリをインストールします。

!pip install diffusers==0.2.3
!pip install transformers scipy ftfy
!pip install "ipywidgets>=7,<8"

GitHubのdiffusersのコードをCloneします。これは、StableDiffusionImg2ImgPipelineのソースを参照するためのものです。

!git clone https://github.com/huggingface/diffusers.git -b v0.2.3
%cd diffusers
!git reset --hard 511bd3aaf2772d09ffe6bfaeca2709682184f920
%cd ../

image_to_image.pyが削除されてしまったので一旦過去のファイルを復活させています。

HuggingFaceにログインします。アクセストークンを入力します。

from huggingface_hub import notebook_login
notebook_login()

そのほか必要なライブラリを実行環境にインポートします。

from torch import autocast
import torch


from PIL import Image

%cd diffusers/examples/inference/
from image_to_image import StableDiffusionImg2ImgPipeline, preprocess
%cd ../../../

パイプラインの準備

次はパイプラインを準備します。

pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    use_auth_token=True
)
pipe = pipe.to("cuda")

text2img変換の時は、StableDiffusionImg2ImgPipelineでなくStableDiffusionPipelineを使っていました。

変換元ファイルの準備

次は画像ファイルexample.pngを準備して、Googleドライブの最上位ディレクトリに配置しておきます。

Googleドライブと接続します。

from google.colab import drive
drive.mount('/content/drive')

Googleドライブのexample.png を開き、256×256ピクセルにリサイズします。

init_image = Image.open("/content/drive/MyDrive/example.png")
init_image = init_image.resize((256, 256))
init_image

img2imgの実行

準備ができたので画像生成をやってみましょう。

prompt = "front face young beautiful japanese woman, smile"
seed = 0
strength = 0.75
guidance_scale = 7.5

generator = torch.Generator("cuda")
if seed != 0:
  generator.manual_seed(seed)
  current_seed = seed
else:
  current_seed = generator.seed()

print(f("seed: {current_seed}"))

preprocessed_image = preprocess(init_image)

with autocast("cuda"):
  image = pipe(prompt, generator=generator, strength=strength, guidance_scale=guidance_scale, init_image=preprocessed_image)["sample"][0]
  
image

コードの先頭4行で指定する変数は以下の4つです。

変数説明
promptプロンプト
seedシード値。0ならランダムで選ばれる。
strength0~1の間で指定。
1に近づくと多数のバリエーションが出現しやすくなる。
guidance_scaleプロンプトへの順守レベル。
7~8.5が推奨値。
数字を大きくすると、プロンプトをより尊重した画像が作られる。

変換元と同じ雰囲気を持つ、笑顔の女性になりました。

img2imgの用途

img2imgはテキストと画像を元に、新しい画像を生み出す手法です。

この手法の用途は2つくらいあります。

ラフなイメージを元に画像化する

ラフなイメージ画像を元にして、精細な画像を生成する用途です。

以下サイトでは、風景の下書きからファンタジーアニメ映像を作り出していますね。

GitHub - CompVis/stable-diffusion: A latent text-to-image diffusion model
A latent text-to-image diffusion model. Contribute to CompVis/stable-diffusion development by creating an account on Git...

ラフ画を使うので、アウトプットのイメージが明確な場合にうまく機能しそうです。

text2imgで出力された画像を微調整する

次は画像を微調整する用途です。

テキストから画像生成する方法は簡単に始められるとはいえ、理想の画像が出力されるまでに途方もない試行錯誤が必要です。

そこで、テキストから画像生成するときにある程度のレベルでストップし、そこから先の調整はimg2imgに任せるという方法がとれます。

具体例で説明します。

表情を微調整する

同じモデルのまま、表情を微調整できます。

元々の画像はテキストから画像生成したもので、生成時と同じシードをimg2imgでも使っています。

似た雰囲気のモデルを作る

他の用途として、似た雰囲気のモデルを作り出せます。

初回生成時と同じプロンプトを使っています。

まとめ

以上、StableDiffusionのimg2imgをColaboratoryで実行する方法を紹介しました。

img2imgを使うと画像生成の用途をさらに広げることができます。

テキストからの画像生成と一緒に使ってみましょう。