画像生成AI Stable DiffusionをAmazon SageMakerで始める

どうも、まったく絵心のない寺内です。

2022年7月、画像生成AIという触れ込みでMidjourneyというプログラムがオープンベータになりました。テキストを与えると、その内容にあった画像を数秒で生成する機械学習モデルであり、その生成画像のクオリティの高さに様々な業界に衝撃を与えました。MidjourneyはDiscordで使うことができ、無料版は生成できる画像数に制限があります。有料版にすることで、制限数の上限をあげたり、無制限にしたりすることができます。

時を同じくして8月、ロンドンにあるAI企業Stability AIが、Stable Diffusionというソフトウェアをオープンソースで公開し、Midjourneyを超える品質と話題になっています。

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...

「クリエイティブの革命」とも、「AIの民主化」とも言われるStable Diffusionを、ここで体験してみましょう。
Stable DiffusionはPythonで簡単に実行できるようにできていますので、この記事ではAmazon SageMakerを使い実行する手順をご紹介します。

体験サイト

Stable Diffusionはオープンソースですが、体験サイトも存在します。以下のサイトにアクセスし、Promptのテキストボックスに描いてほしい絵や写真の内容を書くと、いい感じの画像を生成してくれます。

ただ体験サイトは利用者も多く、リクエストは待ち行列に入ります。

せっかくのオープンソースですから、自分の環境にインストールして自由に使ってみましょう。

手順の概要

Stable Diffusionは、GitHubのCompVis/stable-diffusion でツールが公開されていますが、肝心のモデル(Model Cardという)は、AI開発者コミュニティのHugging Face で配布されています。そこにはStable DiffusionのModel Cardの詳細な説明もあります。

そのため、まずHugging Faceのアカウントを取得します。そのアカウントで、Stable Diffusionのライセンスに同意することで、ダウンロードできるアクセストークンを入手できます。

ライセンスは、おおよそ以下のような内容です。

  • 生成した画像は自由に使用してよい。ただし違法なもの、有害なものを生成してはいけない。
  • モデルについても商業利用含めて自由に使用してよい。その際は、同様のライセンスとする。

アクセストークンを入手したら、そのトークンでHugging Faceにログインし、NVIDIAのGPUが搭載されたコンピュータでPythonコードを実行すると、Model Cardが自動でダウンロードされます。その後、そのModel Cardを使い画像を生成できようになります。

Hugging Faceへのサインアップ

以下のURLにアクセスし、ステップに従いメールアドレスで登録します。特段、難しいところはないと思います。

https://huggingface.co/join

アクセストークンの入手

Hugging Faceにログインして、Stable DiffusionのModel Cardのページにアクセスします。

CompVis/stable-diffusion-v1-4 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

すると、ライセンスに同意するボタンがありますので、押下して同意します。

そして、アカウントのSettingsを選びます。

Settingsの画面の左のサイドメニューから「Access Tokens」を選ぶと、トークンを作成する画面があります。作成したら、アクセストークンをコピーします。

Amazon SageMakerのインスタンス作成

いよいよAWSにアクセスし、SageMakerのインスタンスを作成します。

SageMakerのサイドメニューから「ノートブックのインスタンス」を選択します。

そして「ノートブックインスタンスの作成」ボタンを押します。設定画面では、以下のパラメータを指定してください。

  • ノートブックインスタンス名: わかりやすい名前をつけます。
  • ノートブックインスタンスのタイプ: NDIVIAのV100を搭載している「ml.p3.2xlarge」を選択します。
  • IAMロール: 新規作成してデフォルトのまま「AmazonSageMakerFullAccess」とS3バケットへのアクセスの権限を得ます。S3は生成した画像を取り出すために使います。

その他の項目は特段変更しないでよいですが、必要に応じて適切に変更してください。

設定が終わったら、ノートブックインスタンスの作成ボタンを押下します。

ノートブックの作成

インスタンスがInServiceになったら、「Jupyter を開く」を押します。その後、「New」で conda_pytorch_p38 を選びノートブックを新規作成します。

Stable Diffusionの実行

このページにあるExamplesの手順でやっていきます。

CompVis/stable-diffusion-v1-4 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

まずノートブック上の環境に pip コマンドで必要なPythonライブラリをインストールします。なおExamplesでは ftfy は記載されていませんが、後で警告がでるので、一緒にインストールしておきます。

!pip install --upgrade diffusers transformers scipy ftfy

上記コマンドをセルに入力したら、Shift+Enterで実行します。しばし時間がかかりますので、終了まで待ってください。

次は huggingface-cli login によるログイン処理ですが、これはやらずプログラムにトークンを埋め込みます。

次にExamplesにあるプログラムを少し手直しします。

  • 9行目の use_auth_token の値は True となっているが、先にHugging Faceのサイトから入手したトークンを埋め込む。
  • 12行目の prompt に生成したい画像の内容を指示する。
  • 16行目の出力ファイル名を適当に変更する。
  • 最後に image コマンドを追記する。

すると、プログラムは以下のようになります。

import torch
from torch import autocast
from diffusers import StableDiffusionPipeline

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda"

pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token='XXXXXXXXXXXXXXXXXXXXX')
pipe = pipe.to(device)

# 土星のような輪を持つリンゴの写真
prompt = "Photo of an apple with rings like Saturn"

with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5).images[0]

image.save("apple.png")
image

これをShift+Enterで実行し、しばらく待つと、Model Cardのダウンロードが始まります。このダウンロードは最初の一度だけです。

さらに待つと、 {'trained_betas'} was not found in config. Values will be initialized to default values. という警告が出ますが、それでもしばらく待ちます。

すると、画像生成が始まり画像が表示されます。

Promptを調整し、気に入った画像ができたらS3に保存しましょう。

セルに以下のコマンドを入れると、S3に画像を転送します。

!aws s3 cp ファイル名 s3://バケット名

以上でStable Diffusionの基本が使えるようになりました。

作例

SF的な写真

以下のようなPromptで出力されたのが、下の画像です。

A full-body, large, burly humanoid robot with lots of parts standing in it, an elaborate photo of a collapsing building in flames against a ‘ghost in shell’ background.

(パーツの多い巨大で屈強な人型ロボットが立っている全身、’ghost in shell’のような背景に崩れ燃えあがるビルディングの精巧な写真)

なかなかおもしろい感じのものができました。燃え上がっているのが背景のビルではなく、ロボットの方になっているのが不思議ですが、言語解析部分はたぶん文法を厳密には見てないのかもしれないですね。

ペンギンのイラスト

イラストも作ってみました。Promptは以下です。

A detailed illustration of an emperor penguin happily dancing on a large red apple floating in space.

(宇宙に浮かぶ大きな赤いリンゴの上で楽しく踊る皇帝ペンギンの精細なイラスト)

リンゴなのか? という感じですが、リンゴの芯のようにも、つぶれた実のようにも見えます。ペンギンの尻尾も長すぎます。

細かく見るとツッコミどころ多いですが、いい感じでできていますね。
まだまだ呪文力が足りません。

Promptについて

画像生成AIに与えるPromptの記述は、イメージしている望む画像を得るためにコツが必要です。コツをまとめたノウハウも流布されてきており、それはあたかも召喚魔術の呪文詠唱ように揶揄されています。そのためPromptのことを「呪文」とも呼ばれています。

このあたりも追求していくとおもしろいと思います。

次の展開

この後の応用として、以下のようなサイトが参考になります。

日本語対応

Stable Diffusionは、基本的に英語のキャプションの付いた画像で学習しています。そこで、日本語キャプションの画像を追加学習させたモデルが以下で公開されています。和風な物品を描画したいような場合には有効かと思います。

rinna/japanese-stable-diffusion · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

アニメ風画像の生成

二次元画像を追加学習し、アニメ風の画像を高品質で出力できるモデルが公開されています。いろいろ活用できそうです。

hakurei/waifu-diffusion · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

SEEDの固定

同じPromptを与えても、同じ画像は出力されません。これは乱数が組み込まれているためです。それではPrompt(呪文)をチューニングしていくときには不便です。そこで以下のサイトを参考に、SEEDを固定化することができます。

【Stable Diffusion】seed固定による同じ画像の作成
「Stable Diffusionで作成される画像が毎回変わるのは困る・・・」「Stable Diffusionのtxt2imgでseedを固定したい」このような場合には、この記事の内容が参考になります。この記事では、seed固定で同じ画像...

GPU不要の軽量版

GPUのいらないCPUのみで実行可能なプログラムが以下で公開されています。より気軽に実行したいときには便利かと思います。

GitHub - bes-dev/stable_diffusion.openvino
Contribute to bes-dev/stable_diffusion.openvino development by creating an account on GitHub.

では楽しいクリエイティブ活動を。

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