はじめに
StableDiffusionXL v1.0 というモデルを利用して画像生成を試してみた。その時に得た知見を共有する。
この記事はなんの学術的な知識に基づかず、経験による仮説の域を出ないものである。
記事の結論を先に書いてしまうと上手くいきやすい生成文のルールは以下のような感じだと思う。
プロンプト
(修飾語) 生成したい物体の名詞, (修飾語), (クオリティに関わる単語)
例:
"red grasshopper,robotics, gloss metalic, 8k, detaild"
このようにするとだいたい理想通りの画像を生成できることが多い。
排除したい特徴を書くネガティブプロンプトの作り方も基本的に同様で良いと思う。
難しいので"anime"くらいしか今回は書いていない。(アニメぽい画像を生成して欲しくないから)
以下の2枚は実験過程で生成したサンプルである。
プロンプト:"red grasshopper,robot,lamp, gloss metalic, 8k, detaild"
プロンプト:"red grasshopper,robotics, gloss metalic, 8k, detaild"
秘伝の技
①(できるだけ)名詞は生成したいオブジェクトの一つのみ
画像生成は基本的に複数のオブジェクトを生成することが苦手である。
私の仮説の域を出ないが、単語から派生されるベクトルが結合してしまうからだと思う。
アテンションとかを工夫して学習したモデルでないと厳しいのだと思う。
②装飾したい単語は名詞の近くに置く
例えばプロンプトがメタリックな赤いバッタを生成したいときは以下のようにgrasshopperの近くにredやroboticsを置くイメージである。
これによって赤くてメカっぽいバッタのベクトルが加算されてうまく画像が生成されるというイメージを持って貰えば良いと思う。(実際にそのように生成されているかは謎)
prompt = "red grasshopper,robotics, gloss metalic, 8k, detaild"
negativa_prompt = "anime"
そうすると以下のような画像が生成される。
しかし例外はある。以下の画像のようにroboticsから連想されるバイクや自動車もたまに生成される。
これらをネガティブプロンプトで排除しようとすると、生成される画像にバリエーションがなくなってつまらないものになる。
完璧に自動車やバイクを生成しないようにベクトルの引き算を行おうとすると、ありきたりなものしか生成されなくなるというトレードオフの関係があるようにも思う。
例えば名詞の近くに名詞をおけば結合された特徴を持った画像が生成される。
③学習データの総量をイメージする
例えば以下のようなプロンプトを考える
"car, doraemon, 8k detail" みたいな文を考えたとする。そうすると当然ドラえもんよりも車の画像の学習データの方が多いと推測できるので、車の画像が生成されやすくなる。せいぜい、車にドラえもんぽい色や絵がつくくらいである。
つまり、単語の足し算を行うとより学習データの多い単語が勝つということである。
結論
頭の中で単語の足し算や引き算をイメージして、この記事であげたルールを意識すると上手くいきやすいと思う。
(与太話の域を出ないので、こういう論文があるよと教えてくれるとすごく嬉しいです。)