Stable Diffusionのプロンプトをチェックするテクニック

9272 ワード

Stable Diffusionのプロンプトの鉄の掟

Stable Diffusionのプロンプトは、CLIPと呼ばれるAIモデルに入力されて、埋め込みベクトルに変換されて、画像を生成するDiffusion Modelの画作りのガイドとして使用されます。

そのCLIPですが、入力された文章をトークナイザで意味のあるトークン(形態素と言ってよいのかな?)に分割するのですが、そのトークンが75個までという鉄の掟があります。75個以上はどうなるかというと後半が容赦なく捨てられます。

要は、Stable Diffusionに頑張って100や200の単語を超える長文プロンプトを入力しても、最初の75個分以降の文章は、バッサリ捨てられてしまうということです。

捨てられたらもったいないですね。事前にチェックする方法を記載したいと思います。

Google Colaboratory(Google Colab)でプロンプトをチェック

簡単にGoogle Colabでチェックする方法です。手軽にチェックできるノートブックを作成しました。

004_prompt_checker.ipynb

これにはふぎりさんのプロンプト長さの限界と調べ方について(StableDiffusion)記事をめちゃ参考にしました。感謝です。

簡単にやっていることを説明します。以下で必要なライブラリをインストールします。

!pip -qq install transformers
!pip -qq install ftfy regex

CLIPのトークナイザを使えるようにするために、インポートとモデルのダウンロードを行います。

from transformers import CLIPTokenizer
tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14") 

プロンプトを入力します。以下は例文です。

prompt = "This is an apple"

以下のコードでサイズをチェックします。。

token_size = len(tokenizer.tokenize(prompt))
if token_size <= tokenizer.model_max_length - 2:
    print('OK: token size is ' + str(token_size))
else:
    print('NG: token size is ' + str(token_size))

上記の例だと以下のように表示されます。サイズは4で75以下なのでOKですね

OK: token size is 4

どのようにトークンが分割されるかを調べます。

print(tokenizer.tokenize(prompt)[0:tokenizer.model_max_length-2])

以下のように分割されています。

['this</w>', 'is</w>', 'an</w>', 'apple</w>']

実際の画像でチェック

単純なプロンプトで確認しましたが、次は実例でチェックしたいと思います。 さんが素敵な絵を生成できるプロンプトを公開されていたので、これを題材にしたいと思います。

念の為ですが、単純に素敵な画像だと思ったので題材としています。駄目な例としてくさす意図はありませんので、ご了承ください。

TwitterのALT情報のプロンプトは以下です。

prompt = "extremely detailed CG unity 8k wallpaper of a loli, alice, elementary school student girl with and white marble glowing skin and dot nose and perfect symmetrical pretty face with blush cheeks, pretty lively eyes, hair ornament, wearing standing in the wanderland with too many flowers,  Genshin_Impact, azur_lane,blue_archive,arknights  jewelry, glint, sparkle, light_rays lens_flare light_particles, hyper detailed, high detail, exquisite detail"

自分も同じプロントで画像を生成してみました。以下の自作のノートブックを使います。