こんにちは、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を組みたい方は、下記記事が参考になります。
購入にあたり、注意するべき点も、併せて記しました。
本記事では、
- 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の実装方法
手順全体
- PyTorchをインストールする
- Hugging Faceのアカウントを作る
- Hugging Faceの、Tokenを取得する。
- 必要なPythonパッケージをインストール
- Pythonコードを作成する
PyTorchをインストールする
Windows、Mac、Ubuntu別に、Pytorchのインストール方法を、下記記事にてご紹介しています。
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コードを作成する
今回は、「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 in one or more images. A black image will be returned instead. Try again with a different prompt and /or seed. |
NSFWは、Not Safe For Work(職場では不適切)の省略形です。
それを無効化するコードをご紹介します。(自己責任でお願いします。)
pipでインストールした「diffusers」パッケージ内から、「safety_checker.py」ファイルを探します。
virtualenvを使用された方は、
- プロジェクトフォルダ直下 venv/lib/python〇〇/site-packages フォルダに
pipでインストールしたパッケージがあります。
✔ 「diffusers」パッケージの、ファイル構成
「safety_checker.py」ファイルを開き、以下のように、コメントアウトします。
実行結果
生成した画像
画像を作り出す文章は、コツが必要で、よく呪文とか言われています。
「Stable diffusion 呪文」で検索すれば、色々なサイトがヒットします。
是非、検索して頂ければと思います。
雑談
以下、ただの雑談になります。(お時間がある方は、お付き合い頂けますと、幸いです。)
昨今のディープラーニングの進化は、早すぎて、ついていくのがやっとです。
本記事で紹介した画像生成のタスクも、もう人が描いたものと、遜色ないものになってきました。(まだ、変な画像を生成する事が多い状況ですが・・)
言語処理も、特定のタスクで、既に人間を超える成績を叩き出しています。
個人的には、人みたいに会話したり、動いたりするNPC作りに挑戦してみたいと思っています。(もちろん、メタバース上に。)
もし完成しましたら、ご紹介してみようと思っています(笑)
本記事も、最後までお付き合い頂き、ありがとうございました。
それではまた、お会いしましょう!