StableDiffusionには、テキスト+画像から新たな画像を生成するimg2imgがあります。
img2imgを試す方法はいろいろありますが、今回はColaboratory上で実行する方法を紹介します。
img2imgを使う2つの方法
Google Colaboratory上でimg2imgを利用するには、主に以下のアプローチがあります。
- StableDiffusion公式のimg2imgスクリプトを使う
- DiffusersのImg2imgPipelineを使う
StableDiffusion公式のimg2imgスクリプトを使う
StableDiffusionのGitHubには、img2imgを実行するためのスクリプトがあります。
使い方はカンタンで、テキスト(プロンプト)や画像のパスをコマンドライン引数に指定してimg2img.pyを実行するだけ。
Colaboratoryで実行する手順は以下の記事が詳しいので、ぜひ参考にしてみてください。
![](https://egatech.net/wp-content/uploads/cocoon-resources/blog-card-cache/cf63477904220125e95a1a12ce8d16c8.png)
ただ、この方法のデメリットは1回の画像出力に非常に時間がかかってしまうこと。
変換のたびにPythonプロセスを生成するので、モデルのロードといった初期化処理が毎回必要になります。
DiffusersのImg2ImgPipelineを使う
拡散モデルライブラリ「Diffusers」にはImg2ImgPipelineがあります。
Img2ImgPipelineのメリットは、テキストからの画像生成するときと同じようなコードで画像生成できる点です。
テキストからの画像生成は、Colaboratoryの以下ノートブックを利用する人が多いと思います。
![](https://egatech.net/wp-content/uploads/cocoon-resources/blog-card-cache/84894bb4d07bf999dfa899add06ea92f.png)
このノートブックを数行変更するだけで、画像から画像生成ができるようになります。
以下は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
![](http://egatech.net/wp-content/uploads/2022/08/front-face-young-beautiful-japanese-woman_157145546793477_n50.png)
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が推奨値。 数字を大きくすると、プロンプトをより尊重した画像が作られる。 |
変換元と同じ雰囲気を持つ、笑顔の女性になりました。
![](https://egatech.net/wp-content/uploads/2022/08/img2img-4832811384531372-strength0.75-scale7.5-smile.png)
img2imgの用途
img2imgはテキストと画像を元に、新しい画像を生み出す手法です。
この手法の用途は2つくらいあります。
ラフなイメージを元に画像化する
ラフなイメージ画像を元にして、精細な画像を生成する用途です。
以下サイトでは、風景の下書きからファンタジーアニメ映像を作り出していますね。
ラフ画を使うので、アウトプットのイメージが明確な場合にうまく機能しそうです。
text2imgで出力された画像を微調整する
次は画像を微調整する用途です。
テキストから画像生成する方法は簡単に始められるとはいえ、理想の画像が出力されるまでに途方もない試行錯誤が必要です。
そこで、テキストから画像生成するときにある程度のレベルでストップし、そこから先の調整はimg2imgに任せるという方法がとれます。
具体例で説明します。
表情を微調整する
同じモデルのまま、表情を微調整できます。
元々の画像はテキストから画像生成したもので、生成時と同じシードをimg2imgでも使っています。
![](https://egatech.net/wp-content/uploads/2022/08/img2img-157145546793477-strength0.75-scale7.5-smile.png)
![](https://egatech.net/wp-content/uploads/2022/08/img2img-157145546793477-strength0.75-scale10.0-smile.png)
似た雰囲気のモデルを作る
他の用途として、似た雰囲気のモデルを作り出せます。
初回生成時と同じプロンプトを使っています。
![](https://egatech.net/wp-content/uploads/2022/08/img2img-sameprompt-1267023728703536-strength0.75-scale7.5.png)
![](https://egatech.net/wp-content/uploads/2022/08/img2img-sameprompt-1783323653892010-strength0.75-scale7.5.png)
![](https://egatech.net/wp-content/uploads/2022/08/img2img-sameprompt-7047036633931545-strength0.75-scale7.5.png)
まとめ
以上、StableDiffusionのimg2imgをColaboratoryで実行する方法を紹介しました。
img2imgを使うと画像生成の用途をさらに広げることができます。
テキストからの画像生成と一緒に使ってみましょう。