神戸のデータ活用塾!KDL Data Blog

KDLが誇るデータ活用のプロフェッショナル達が書き連ねるブログです。

【やってみた】Stable Diffusionで画像生成!

こんにちは。神戸デジタル・ラボの原口です。今回は彗星の如く登場した文章から画像を生成するAIモデル「Stable Diffusion」を試します。

Stable Diffusionとは

Stable Diffusionはドイツのルートヴィヒ・マクシミリアン大学ミュンヘンのコンピュータビジョン研究グループが開発した、テキストから画像を生成するAIです。

近年、テキストから画像を生成するAIモデルは急激な成長を遂げてきています。少し振り返ってみましょう。

Stable Diffusionとテキストから画像を生成するAIの歴史

最初に大きなインパクトを与えたのは2021年1月にOpenAIから発表されたDALL・Eです。DALL・Eが発表された当時は、ここまで高精度にテキストから画像を生成できるAIがなかったため、とてもすごいAIが開発されたなと驚いたことを覚えています。ただ発表時点では決められた文字列に対する結果のみが示されており、自由に操作することは出来ませんでした。

次に現れたのが2022年5月にGoogleから発表されたImagenです。ImagenはDALL・Eと比較してさらに優れた画像生成ができるようになりました。ただこちらも「有害な表現を生み出す可能性があるため、一般利用のための公開はしない」という判断が下され、簡単には利用できないのが現状です。

そんな中現れたのが2022年7月にオープンベータとなったMidjourneyです。テキストから画像を生成する能力は申し分ありません。さらにMidjourneyはチャットツールの一種であるDiscordの招待を受け取り、Midjourney専用のチャットルームで任意の文字列を投稿すると、今まで出来なかった任意の画像を生成できるようになりました!ただ生成できる画像枚数に制限があったり、商用利用できないという問題がありました。(有料会員になれば無制限・商用利用も可能です。)

そしてこれらの問題をすべて解決したのが、彗星の如く登場したStable Diffusionです。なんとこのモデルは、コードレベルで任意の文字列を入力して画像を生成することができ、さらには商用利用も可能です!

ただ一つ重要な規約があります。それは「Stable Diffusionモデルを利用して違法または有害なコンテンツを意図的に生成すること」は禁止されています。例えばStable Diffusionを用いて有名人そっくりな顔を生成し、なりすましを行う・デマを流すなどが考えられます。

生成された画像が面白いからと言って、むやみにSNSに上げるのは控えた方が良いでしょう。

環境構築

Stable Diffusionの利用には次の5ステップを踏みます。

  1. Hugging Faceに登録する
  2. Stable Diffusionモデルの利用規約に同意する
  3. アクセストークンを発行する
  4. 環境を構築する
  5. コードを実行する

です。

動作環境はCPU・GPU共に動作可能ですが、CPUで行った場合は画像一枚を生成するのに約30分かかるので注意が必要です。

では順に見ていきましょう。

Step1:Hugging Faceに登録する

Stable Diffusionを利用するために、まずはHugging Faceに登録しましょう。

Hugging Faceとは、AIモデルのプラットフォームです。様々なAIモデルやライブラリとそれらの使い方の情報が提供されています。 Stable Diffusionもこちらから利用していきます。

Hugging Faceへの登録

Emailを登録すると、そのメールアドレスにHugging Faceから認証メールが届くので、認証をしましょう!(認証しないとトークンを取得できません・・・)

Step2:Hugging Faceの利用規約に同意する

こちらのページにアクセスし、利用規約に同意しましょう。

利用規約に同意する

Step3:アクセストークンを発行する

続いてアクセストークンを発行します。Hugging Faceにログインすると以下のような画面が表示されるので、右上のアイコンをクリックし、「Setting」を選択します。

Settinngを選択

次に「Access Tokens」を選択し「New Token」を選択します。

アクセストークンの発行

表示された画面に対して、以下と同じように設定します。

トークンの設定

これでトークンの発行は完了です。この後のコーディング時に利用するので、どこかにメモしておきましょう!

Step4:環境を構築する

Stable Diffusionを実行できる環境を構築しましょう!・・・と言っても、以下のコードを実行するだけで終わりです。気合を入れた割にあっけない・・・。

pip install diffusers transformers nvidia-ml-py3 ftfy pytorch pillow

Step5:コードを実行する

お待ちかねの画像生成コードを構築しましょう!

まずは各種モジュールをインストールします。

import torch
from diffusers import StableDiffusionPipeline
from PIL import Image

続いてトークンの設定と、Stable Diffusionを呼び出します。

ここでは先ほど取得したトークンを4行目の「USER_TOKEN」にセットしてください。

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda" if torch.cuda.is_available() else "cpu"
USER_TOKEN = "自身のトークンを入力する"
pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=USER_TOKEN)
pipe = pipe.to(device)

最後に推論の準備をします。

seed = 2022
generator = torch.Generator(device=device).manual_seed(seed)

def infer(prompt,samples = 10 ):
    images= pipe( [prompt] * samples,guidance_scale=7.5,generator = generator)
    return images

これで準備完了です。まずはDALL・Eの中で利用されていた文言で実験します。

文言の意味は「アボカドの形をしたアームチェア。アボカドを模したアームチェア。」です。(なんでこんなもの出力しようと思ったのでしょうか・・・?)

Stable Diffusionの入力は英語のみなので、別の文言を入れる際は注意が必要です。

text = "an armchair in the shape of an avocad. an armchair imitating an avocad."
image = infer(text,samples= 5)

GPUを利用してコードを実行した際に

RuntimeError: CUDA out of memory. Tried to allocate 5.00 GiB (GPU 0; 14.76 GiB total capacity; 5.30 GiB already allocated; 3.37 GiB free; 10.33 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

と出た場合はsamplesの数字を小さくして再度実行してください。

an armchair in the shape of an avocad. an armchair imitating an avocad.

おおーー!DALL・Eで見たやつだ!ほとんど本物みたいなのもポイントですね。

続いてImagenにあった文言でも試してみましょう。

文言の意味は「月に向かうロケット船に乗る頭脳。」です。

text = "A brain riding a rocketship heading towards the moon."
image = infer(text,samples= 1)

A brain riding a rocketship heading towards the moon.

ちょっとImagenとは違いますが、なかなかいい感じじゃないでしょうか?

まとめ

今回はStable Diffusionを利用して様々な画像を生成しました。文章から画像生成が出来るような時代が来ていますね。本当にびっくりです。

このレベルで画像が生成できるなら、AIの学習データに利用することも考えられますね。いずれはAIがAIを作る時代が来るのでしょうか。

また技術が進化していく一方で、使う人の倫理観も進歩させていかないといけないとも感じました。AIを作る人・使う人、それぞれが常に意識し続ける必要がありますね。