【トークンなし】Stable DiffusionをGoogle Colabで動かす方法。複数画像の生成も。【diffusers】

踊る猫 プログラミング

以前、Google Colaboratoryを使って無料の画像生成AI「Stable Diffusion」を動かす方法について、ブログ記事と動画で解説しました。しかし、2023年1月現在、その方法が使えなくなっているので、改めて利用方法を紹介します。

新しい方法ではトークンが不要です。また、使用するモデルも簡単に切り替えできるようです。

YouTube動画でもトークンなしVer.の使い方を解説しています。
説明に動きがあった方が分かりやすいと思うので、一緒にご覧ください。

【トークン不要化】GoogleColabで画像生成AI「StableDiffusion」を使う方法!「GoogleDriveへの自動保存」「複数画像生成」も!【Diffusers】【2023年版】

使用コード

Google Colaboratoryに下記のコードを入力してください。YouTube動画のほうでは、Google Colaboratoryプロジェクトの作成方法などについても詳しく説明しています。

Google Colab のサンプルコードも載せておきます。自分で入力するのが面倒な人はどうぞ。
https://colab.research.google.com/drive/1f0R-Obi14Yh6ohspen6vSBqvvyRrRH5j?usp=sharing

Stable Diffusionのインストール

パッケージをインストールします。

#stable diffusionのインストール
!pip install --upgrade diffusers[torch] transformers

パイプラインの準備

パイプラインの準備です。model_idを変更することで別のモデルを試すこともできます

from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch

# パイプラインの準備
model_id = "stabilityai/stable-diffusion-2-1"
pipe = StableDiffusionPipeline.from_pretrained(
    model_id, 
    scheduler=EulerDiscreteScheduler.from_pretrained(
        model_id, 
        subfolder="scheduler"
    ), 
    torch_dtype=torch.float16
).to("cuda")
pipe.enable_attention_slicing()

画像の生成

画像を生成します。promptに生成したい画像のキーワードを入力して実行してください。

# 画像の生成
prompt = "dancing cat"
image = pipe(prompt, height=512, width=512).images[0]
image

このような画像が生成されます。(人によって画像は違います)

踊る猫
踊る猫(のちに紹介するシード値の設定で、シードを0にしたもの)

実行前に…

ハードウェアアクセラレータの設定

Google Colaboratory で GPU を使用するように設定します。

Google Colaboratoryを開き、メニューの
編集>ノートブックの設定

ノートブックの設定
編集>ノートブックの設定

と進み、ハードウェアアクセラレータをGPUに設定して保存します。

GPU
GPUを選択>右下の「保存」をクリック

注意点

トークン不要

トークンについては取得不要です。以前の記事やYouTube動画で解説したトークンを取得する方法については飛ばしてもらって構いません。

画像のダウンロード

画像をダウンロードする際は、画像を右クリックしてWindowsの場合は「名前を付けて画像を保存」を押せば、ファイル名などを決めた後、自分のPCにダウンロードすることができます。

名前を付けて画像を保存

画像ファイルは画像を生成しなおすと、上書きされてしまいますので、画像を消したくないという場合はダウンロードをしておきましょう。

Google ドライブへの自動保存

# ドライブのマウント
from google.colab import drive
drive.mount('/content/drive')

# 出力先の指定
import os
os.chdir('/content/drive/MyDrive/生成画像')
# 画像の生成
prompt = "dancing_cat"
image = pipe(prompt, height=512, width=512).images[0]

# 画像を保存(ファイル名はdancing_cat.png)
image.save(f"踊る猫.png")

image

画像の生成のプログラムをこちらに書き換えると、生成画像が Google ドライブに自動保存されます。上のセルを実行すると、Google ドライブへのアクセスを要求されますので、許可を押してください。

AIのパラメータ変更

学習のステップ数、画像のサイズなどを変更します。
imageに代入するpipeの引数を、以下のように変えるとできます。

image = pipe(prompt,                     # キーワード
             height=512,                 # 画像の高さ
             width=512,                  # 画像の幅
             guidance_scale=7.5,         # テキストとの類似度
             num_inference_steps=50,     # 画像生成に費やすステップ数
             generator=torch.Generator("cuda").manual_seed(0), # 乱数シードジェネレータ
             ).images[0]

複数画像の同時生成

2023-6-14追記
トークンありのときに紹介した、複数画像を同時に生成する方法を、トークンなしのバージョンで行う方法です。

from PIL import Image

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows*cols

    w, h = imgs[0].size
    grid = Image.new('RGB', size=(cols*w, rows*h))
    grid_w, grid_h = grid.size

    for i, img in enumerate(imgs):
        grid.paste(img, box=(i%cols*w, i//cols*h))
    return grid
from torch import autocast
import datetime

#3枚の画像を1×3の形に並べて生成します。
num_rows = 1
num_cols = 3

prompt_single = "dancing cat"
prompt = [prompt_single] * num_cols

all_images = []
for i in range(num_rows):
  # images = pipe(prompt, height=512, width=512).images
  images = pipe(prompt,                     # キーワード
             height=512,                 # 画像の高さ
             width=512,                  # 画像の幅
             guidance_scale=7.5,         # テキストとの類似度
             num_inference_steps=50,     # 画像生成に費やすステップ数
             generator=torch.Generator("cuda").manual_seed(0), # 乱数シードジェネレータ
             ).images
  all_images.extend(images)

# 画像を保存(ファイル名は「踊る猫_dancing cat_2022-2-22_22-22-22」などのようになる)
now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
filename = "踊る猫"
i = 1
for image in all_images:
  image.save(f"{filename}_{prompt_single}_{now.strftime('%Y-%m-%d_%H-%M-%S')}_({i}).png")
  i += 1

grid = image_grid(all_images, rows=num_rows, cols=num_cols)
grid

複数の画像をグリッド状に並べて表示します。

  • num_rows と num_cols
  • prompt_single
  • filename

を変更してください。

num_rowsが行数(縦の数)、num_colsが列数(横の数)です。3×3ぐらいがおすすめ

prompt_singleにプロンプトを記述します。(dancing_catなど)

filenameにファイル名を記載します。(踊る猫など)

生成しなおす場合は、最後のセル(prompt_singleなどが書かれたセル)を再度実行してください。

また、画像のサイズや乱数の種なども、単体の画像生成と同じように変更することができます。

参考

Google Colab で Stable Diffusion 2.1 を試す - diffusers版:https://note.com/npaka/n/n1f4e2bcad037

Stable Diffusion を Google Colabで実行する際に便利なコード:https://zenn.dev/6uclz1/articles/d7736b06d24f1a

コメント

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