StableDiffusionには、テキスト+画像から新たな画像を生成するimg2imgがあります。
img2imgを試す方法はいろいろありますが、今回はColaboratory上で実行する方法を紹介します。
img2imgを使う2つの方法
Google Colaboratory上でimg2imgを利用するには、主に以下のアプローチがあります。
- StableDiffusion公式のimg2imgスクリプトを使う
- DiffusersのImg2imgPipelineを使う
StableDiffusion公式のimg2imgスクリプトを使う
StableDiffusionのGitHubには、img2imgを実行するためのスクリプトがあります。
使い方はカンタンで、テキスト(プロンプト)や画像のパスをコマンドライン引数に指定してimg2img.pyを実行するだけ。
Colaboratoryで実行する手順は以下の記事が詳しいので、ぜひ参考にしてみてください。
ただ、この方法のデメリットは1回の画像出力に非常に時間がかかってしまうこと。
変換のたびにPythonプロセスを生成するので、モデルのロードといった初期化処理が毎回必要になります。
DiffusersのImg2ImgPipelineを使う
拡散モデルライブラリ「Diffusers」にはImg2ImgPipelineがあります。
Img2ImgPipelineのメリットは、テキストからの画像生成するときと同じようなコードで画像生成できる点です。
テキストからの画像生成は、Colaboratoryの以下ノートブックを利用する人が多いと思います。
このノートブックを数行変更するだけで、画像から画像生成ができるようになります。
以下は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 ../
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")
変換元ファイルの準備
次は画像ファイル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ならランダムで選ばれる。 |
strength | 0~1の間で指定。 1に近づくと多数のバリエーションが出現しやすくなる。 |
guidance_scale | プロンプトへの順守レベル。 7~8.5が推奨値。 数字を大きくすると、プロンプトをより尊重した画像が作られる。 |
変換元と同じ雰囲気を持つ、笑顔の女性になりました。
img2imgの用途
img2imgはテキストと画像を元に、新しい画像を生み出す手法です。
この手法の用途は2つくらいあります。
ラフなイメージを元に画像化する
ラフなイメージ画像を元にして、精細な画像を生成する用途です。
以下サイトでは、風景の下書きからファンタジーアニメ映像を作り出していますね。
ラフ画を使うので、アウトプットのイメージが明確な場合にうまく機能しそうです。
text2imgで出力された画像を微調整する
次は画像を微調整する用途です。
テキストから画像生成する方法は簡単に始められるとはいえ、理想の画像が出力されるまでに途方もない試行錯誤が必要です。
そこで、テキストから画像生成するときにある程度のレベルでストップし、そこから先の調整はimg2imgに任せるという方法がとれます。
具体例で説明します。
表情を微調整する
同じモデルのまま、表情を微調整できます。
元々の画像はテキストから画像生成したもので、生成時と同じシードをimg2imgでも使っています。
似た雰囲気のモデルを作る
他の用途として、似た雰囲気のモデルを作り出せます。
初回生成時と同じプロンプトを使っています。
まとめ
以上、StableDiffusionのimg2imgをColaboratoryで実行する方法を紹介しました。
img2imgを使うと画像生成の用途をさらに広げることができます。
テキストからの画像生成と一緒に使ってみましょう。