0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

拡散モデルによる画像生成の秘伝の技

Last updated at Posted at 2023-09-30

はじめに

StableDiffusionXL v1.0 というモデルを利用して画像生成を試してみた。その時に得た知見を共有する。
この記事はなんの学術的な知識に基づかず、経験による仮説の域を出ないものである。

記事の結論を先に書いてしまうと上手くいきやすい生成文のルールは以下のような感じだと思う。

プロンプト
(修飾語) 生成したい物体の名詞, (修飾語), (クオリティに関わる単語)

例:
"red grasshopper,robotics, gloss metalic, 8k, detaild"

このようにするとだいたい理想通りの画像を生成できることが多い。
排除したい特徴を書くネガティブプロンプトの作り方も基本的に同様で良いと思う。
難しいので"anime"くらいしか今回は書いていない。(アニメぽい画像を生成して欲しくないから)

以下の2枚は実験過程で生成したサンプルである。

grasshopper-cca4af5b-f3bd-4146-be34-9d83d6d3b53d.png
プロンプト:"red grasshopper,robot,lamp, gloss metalic, 8k, detaild"

grasshopper-ad2dcc06-1666-4f69-8f44-85802b2c0234.png

プロンプト:"red grasshopper,robotics, gloss metalic, 8k, detaild"

秘伝の技

①(できるだけ)名詞は生成したいオブジェクトの一つのみ

画像生成は基本的に複数のオブジェクトを生成することが苦手である。
私の仮説の域を出ないが、単語から派生されるベクトルが結合してしまうからだと思う。
アテンションとかを工夫して学習したモデルでないと厳しいのだと思う。

②装飾したい単語は名詞の近くに置く

例えばプロンプトがメタリックな赤いバッタを生成したいときは以下のようにgrasshopperの近くにredやroboticsを置くイメージである。
これによって赤くてメカっぽいバッタのベクトルが加算されてうまく画像が生成されるというイメージを持って貰えば良いと思う。(実際にそのように生成されているかは謎)

prompt = "red grasshopper,robotics, gloss metalic, 8k, detaild"
negativa_prompt = "anime"

そうすると以下のような画像が生成される。

grasshopper-99f576ea-9059-4f55-8a6d-46dd55c86400.png
grasshopper-add71864-e172-4f28-acf3-e24cb5132441.png

grasshopper-6efa6eef-0b5a-4acb-a9ef-a0f65b182471.png

しかし例外はある。以下の画像のようにroboticsから連想されるバイクや自動車もたまに生成される。

grasshopper-0d2a1954-6491-4a78-b87e-aa8cada74bb8.png
grasshopper-c288a16d-fc60-4400-9f7d-d3b15d4a265f.png

これらをネガティブプロンプトで排除しようとすると、生成される画像にバリエーションがなくなってつまらないものになる。

完璧に自動車やバイクを生成しないようにベクトルの引き算を行おうとすると、ありきたりなものしか生成されなくなるというトレードオフの関係があるようにも思う。

例えば名詞の近くに名詞をおけば結合された特徴を持った画像が生成される。

③学習データの総量をイメージする

例えば以下のようなプロンプトを考える

"car, doraemon, 8k detail" みたいな文を考えたとする。そうすると当然ドラえもんよりも車の画像の学習データの方が多いと推測できるので、車の画像が生成されやすくなる。せいぜい、車にドラえもんぽい色や絵がつくくらいである。

grasshopper-fc4c57b1-f25a-4125-826f-816f6e1a06fc.png

grasshopper-837b9f92-d838-4119-827c-5ac3dc834026.png

grasshopper-e3e6b14c-63a5-4183-93d8-4400becc003d.png

つまり、単語の足し算を行うとより学習データの多い単語が勝つということである。

結論

頭の中で単語の足し算や引き算をイメージして、この記事であげたルールを意識すると上手くいきやすいと思う。

(与太話の域を出ないので、こういう論文があるよと教えてくれるとすごく嬉しいです。)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?