Pythonスキルの習得

【Python】自分のPCで、画像生成AI「Stable Diffusion」を実行する方法(GPU版) – 概要、NSFW無効化も紹介 –

【Python】自分のPCで、画像生成AI「Stable Diffusion v1.4」を実行するまで(GPU版) - インストール方法の紹介 -

こんにちは、Zero-Cheeseです。

今回は、世間を賑わせている画像生成AI「Stable Diffusion」を、取り上げています。

本記事では、

  • Stable Diffusionの概要
  • 実行するまでの手順
  • セーフティーフィルター(NSFW)の無効化 ← 自己責任

をご紹介します。

本サムネの背景画像も、「Stable Diffusion」で作りました。凄いレベルっす!

GPUのVRAM(メモリ)が少ないと、下記エラーが発生します。

RuntimeError: CUDA out of memory. ・・・・・

私が検証した所、512×512 px画像(標準サイズ)を作るために、約12GBのVRAMが必要でした。

(生成する画像サイズを落とすことで、VRAMの使用量を減らせられます。)

標準サイズの場合、実質的にNvidia RTX3090以上となり高額となっていまします。

(VRAM11GBのGTX1080Tiでも、標準画像サイズの場合、ギリギリ動作します。)

しかし、一度その環境を自分のものにすると、

  • 約4sec位(RTX 3090の場合)で、好きなだけ画像を作り続けられる

というメリットが手に入ります。

4Kゲームや、高解像度VRとかもストレスレスで楽しめますし、検討してみる価値は、十分にあるかと思います。

ディープラーニング用のPCを組みたい方は、下記記事が参考になります。

購入にあたり、注意するべき点も、併せて記しました。

ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介
ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介ディープラーニング用の自作PCとして、必要なスペック、注意点、オススメのパーツを紹介した記事です。...

本記事では、

  • Python入門レベル(入門本は、読み終わったレベル位)

以上の方を対象にした、内容となっています。

使用するOSは、

  • Windows、Mac、Ubuntu

どれでも大丈夫です。

Stable Diffusionとは?

既にご存知の方、すぐに実装方法を知りたい方は、本章をスキップして下さい。

概要

2022年8月に、オープンソース化された、描画AIです。

下記は全て、「Stable Diffusion」から作成した画像になります。

他の描画AIといえば、「DALL-E2」や「Midjourney」が代表として挙げられますが、利用には制限がありました。

「Stable Diffusion」は、膨大なデータ(約20億枚)で学習したモデルが公開され、商用利用も可能です。(ライセンス情報は後述)

学習済みデータは、AI技術者用向けコミュニティサイト「Hugging Face」で、公開されています。

本モデルの一般公開化は、とても画期的な事であり、AIの転換期の1つとも言われています。

Stable Diffusionの開発

  • スタートアップ企業の「stabiltity.ai」
  • オンライン上の研究コミュニティ「ConpVis」と「LAION」

が開発しました。

現在、学習済のモデルは、V1.1 〜 V1.4(2022年10月時点)まで準備されています。

また使用されたデータセットは、LAION(非営利団体)が提供しているものになります。

本情報のソース:https://huggingface.co/CompVis

各バージョンの概要:

  • V1-1:ゼロベースから、laion2B-en(256×256px)データセットを使って、237,000ステップの学習。加えて、laion-high-resolution(512×512px)データセットを使って、194,000ステップの学習。
  • V1-2:V1-1を追加学習。laion-improved-aesthetics(512×512px)データセットを使って、515,000ステップの学習。
  • V1-3:V1-2を追加学習。laion-improved-aesthetics(512×512px)データセットを使って、195,000ステップの学習。分類器フリーなガイダンス・サンプリング を改良するために text-conditioning の 10% をドロップ。
  • v1-4:V1-3を追加学習。aesthetics v2 5+(512×512px)データセットを使って、225,000ステップの学習。分類器フリーなガイダンス・サンプリング を改良するために text-conditioning の 10% をドロップ。

よく分からなければ、V1-4を使っておけばOKです。

Stable Diffusionのライセンス

本モデルのライセンスは、「Creative ML OpenRAIL-M」に準拠します。

要約すると、

  • 生成画像の商用利用 OK
  • 生成、複製、公開、配布 全てOK
  • ただし、画像を生成した人が、生成物の説明責任を負う義務だったり
  • 頒布の際、使用許諾書も一緒に渡す等の規定があります。

こちらのサイトが参考になります。日本語で要約してくれています。

ライセンス本文は、こちら(英語)まで

Stable Diffusionの実装方法

手順全体

  1. PyTorchをインストールする
  2. Hugging Faceのアカウントを作る
  3. Hugging Faceの、Tokenを取得する。
  4. 必要なPythonパッケージをインストール
  5. Pythonコードを作成する

PyTorchをインストールする

Windows、Mac、Ubuntu別に、Pytorchのインストール方法を、下記記事にてご紹介しています。

GPU版の手順に従って、インストールをお願いします。

【入門】PyTorchのインストール方法 - Mac, Windows, Ubuntu - GPU版インストールも、あわせて紹介
【入門】PyTorchのインストール方法 - Mac, Windows, Ubuntu - GPU版インストールも、あわせて紹介PyTorchのインストール方法を解説した記事です。紹介したOSは、Windows、Mac、Ubuntuです。GPUを使用するための、注意点も併せて、ご紹介しました。...

Hugging Faceのアカウントを作る

Hugging FaceのHPにアクセスして下さい。

HP右上の、「Sign Up」をクリックします。

Emailや、Password等を設定します。

Hugging Faceの、Tokenを取得する。

以下、Hugging Faceのアカウントを作り、ログイン後の操作となります。

① 右上の、自分のアイコンをクリックします。

② メニューが出てくるので、「Settings」を選択します。

③ 画面左のメニューから、「Access Tokens」を選択し、「New Token」ボタンをクリックして下さい。(発行されたトークンを、控えて下さい。

必要なPythonパッケージをインストール

pipにて、以下のパッケージをインストールします。

pip install torch diffusers transformers scipy ftfy

pipの詳細に関しては、下記記事が参考になります。

【Python】pipの使い型入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -
【Python】pipの使い方入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -Python入門者を対象に、pipの使い型を解説した記事です。 コマンドライン、Anaconda、PyCharmからの操作方法を、わかりやすく解説しました。 ...

Pythonコードを作成する

今回は、「Diffusers」と呼ばれるパッケージを使用します。

「Diffusers」は、Stable Diffusionのような、拡散モデルによる画像生成を、数行のコードで実行できる、フレームワークです。

生成したい文字列(プロンプト)から、画像生成するコード

import torch
from torch import autocast
from diffusers import StableDiffusionPipeline

hugging_token = '<取得したトークン>'

ldm = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4",
                                              revision="fp16",
                                              torch_dtype=torch.float16,
                                              use_auth_token=hugging_token
                                              ).to("cuda")

prompt = '<生成したい画像を表現した、文字列>'

# 1000枚画像を作りたい場合
num_images = 1000
for j in range(num_images):
    with autocast("cuda"):
        image = ldm(prompt).images[0] # 500×500px画像が生成
        # 画像サイズを変更したい場合
        # image = ldm(prompt, height=400, width=400).images[0]

    # save images (本コードでは、直下に画像が生成されていきます。)
    image.save(f"./image_{i}.png")

更に複雑な使い方

以下のコードは全て、前章で紹介したコードの、19行目

  • image = ldm(prompt).images[0]

の部分を、置換して下さい。

プロンプトから画像生成 追加オプション

  • negative プロンプト
  • 生成する画像サイズ
  • プロンプトの重み
  • 画像生成に費やすステップ数

を、引数で設定できます。

        image = ldm(prompt,
                    negative_prompt='< negative プロンプト >',  # negativeプロンプト
                    height=400,  # 縦サイズ(px)
                    width=400,  # 横サイズ(px)
                    guidance_scale=7.5,  # プロンプトの重み(生成画像の類似度(0〜20))
                    num_inference_steps=50,  # 画像生成に費やすステップ数
                    ).images[0]

プロンプトと入力画像から、画像生成する場合

本コードには、pillow パッケージが必要です。(pipにてインストール可能)

冒頭に書きをimportして下さい。

from PIL import Image

入力画像とマスク画像(←必要に応じて)を準備します。

マスク画像は、白黒画像の2値画像で準備します。

  • 白色部分 → AIが生成した画像に置き換わる
  • 黒色部分 → 入力画像のまま

という結果になります。

        init_image = Image.open("input.png").convert("RGB")
        init_image = init_image.resize((512, 512))  # 生成画像のサイズを指定
        mask_image = Image.open("mask.png").convert("RGB")
        mask_image = mask_image.resize((512, 512))  # 生成画像のサイズを指定
        image = ldm(prompt,
                    init_image=init_image,  # 入力画像
                    mask_image=mask_image,  # マスク画像
                    strength=0.75,  # 入力画像と生成画像の類似度(0〜1)

                    height=512,  # 縦サイズ(px)
                    width=512,  # 横サイズ(px)
                    guidance_scale=7.5,  # プロンプトの重み(生成画像の類似度(0〜20))
                    num_inference_steps=50,  # 画像生成に費やすステップ数
                    ).images[0]

「セーフティーフィルター」の無効化(自己責任)

自動生成した画像が不適切な場合(成人向け等)、画像を黒塗りする「セーフティーフィルター」機能が搭載されています。

そちらに該当した場合、下記警告が表示されます。

Potential NSFW content was detected inone or moreimages. A black image will be returned instead. Try again with a different prompt and/orseed.

NSFWは、Not Safe For Work(職場では不適切)の省略形です。

それを無効化するコードをご紹介します。(自己責任でお願いします。)

pipでインストールした「diffusers」パッケージ内から、「safety_checker.py」ファイルを探します。

virtualenvを使用された方は、

  • プロジェクトフォルダ直下 venv/lib/python〇〇/site-packages フォルダに

pipでインストールしたパッケージがあります。

✔ 「diffusers」パッケージの、ファイル構成

「safety_checker.py」ファイルを開き、以下のように、コメントアウトします。

実行結果

生成した画像

画像を作り出す文章は、コツが必要で、よく呪文とか言われています。

「Stable diffusion 呪文」で検索すれば、色々なサイトがヒットします。

是非、検索して頂ければと思います。

雑談

以下、ただの雑談になります。(お時間がある方は、お付き合い頂けますと、幸いです。)

昨今のディープラーニングの進化は、早すぎて、ついていくのがやっとです。

本記事で紹介した画像生成のタスクも、もう人が描いたものと、遜色ないものになってきました。(まだ、変な画像を生成する事が多い状況ですが・・)

言語処理も、特定のタスクで、既に人間を超える成績を叩き出しています。

個人的には、人みたいに会話したり、動いたりするNPC作りに挑戦してみたいと思っています。(もちろん、メタバース上に。)

もし完成しましたら、ご紹介してみようと思っています(笑)

本記事も、最後までお付き合い頂き、ありがとうございました。

それではまた、お会いしましょう!