Promptを工夫することで色汚染は防げるか?
NovelAIやStable Diffusion、Anythingなどで
「この服を青くしたい!」や「髪色を金髪にしたい!!」
といったことはありませんか?
私はあります。
しかし、ある箇所に特定の色を指定しても
想定外のところにまで色が移ってしまうことがありませんか?
私はあります。
こんなAIイラストあるあるを言ったところで、
例えば、以下のような色指定をしてみます。
何も意識せず色指定してみる
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (yellow beret on an angle: 1.5), (disheveled black long hair: 1.5), (beautiful detailed orange eyes: 1.5), (jewelry pupils: 1.3), (yellow sleeveless collared shirt: 1.5), (black skirt: 1.5), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
■シャツ、ベレー帽:yellow
■目:orange
上のように色指定してみました。
(分かる人は既に勘づいていると思いますが、あえて無秩序に記述しています。)
ちなみに上記のPromptは、
この記事で紹介している汎用呪文を
利用して使っています。
今回は検証のため、
それぞれの条件で100枚ずつイラストを作成し、
色汚染がどの程度起こるかを確認します。
早速、1枚生成してみましょう!
ね?
まさか、全く関係のない紫色が
髪の毛に飛んでくるとは思いませんでしたが、
(おそらく背景のイメージに引っ張られたのでしょう)
このように色指定はなかなかうまくいきません。
そして、実際に100枚生成したものがこちら!
…生成して思ったのですが、
“simple background”とか使えばよかった~!!w
実は、以前使ったことがあるPromptを再利用したのと、
backgroundを指定することで、色汚染が複雑になるのを避けるためだったのですが
これはぱっと見で分かりにくいですね。
とにもかくにも、結果は次のようになりました!!
髪の毛が黒くなった | 24枚 | 24% (24/100) |
スカートが黒くなった | 72枚 | 72% (72/100) |
ベレー帽が黄色になった | 30枚 | 30% (30/100) |
シャツが黄色になった | 25枚 | 25% (25/100) |
すべて指定通りの色になった!! | 6枚 | 6% (6/100) |
すべてうまくいったのが6%だと~!?
実は前に作成したときに成功率が低かった条件で試したのですが、
まさか1割を下回るとは思いませんでした。
なんか服の色と髪色が真逆にひっくり返ることが多いんですよね。
ここから、巷で噂されている
色汚染を防ぐ方法がどこまで効果的かの検証をしたいと思います。
防止対策を検証してみる
今回、検証を行うのは以下の項目。
②占有面積が大きい順に並べる
③記述をシンプルに分割する
④”+, *, -“などによる分離
⑤*//*による分離
⑥”and”の利用
⑦【上級者向け】Prompt Editingを用いた制御
1枚目のseed値を他の検証でも用います。(seed値:3891730342)
①色を薄い順に並べる
この方法、界隈では一番効果があると言われています!
実際に他の方がTwitterなどで検証されている結果だけを見ても、
比較的成功率が上がっている傾向があります。
ただし、「色の薄さ」が色相・明度・彩度のいずれに
対しての話だろうかという疑問は残ります。
個人的には、色の薄さというよりはAIがobjectとして判別しやすい色順に
並べることに意味があるのでないかと考えています
(極端な例だと、白いキャンバスと黒いキャンバスそれぞれにミッ〇ーマウスを
描くとして、どちらが「ミッ〇ー」だと判別しやすいかといった感覚です。
結果として、いわゆる色が薄いものから描画した方が判別しやすそうに感じます。)
多分、間違っているので小声でしゃべっています。笑
Promptと出力結果がこちら。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (yellow sleeveless collared shirt: 1.5), (yellow beret on an angle: 1.5), (beautiful detailed orange eyes: 1.5), (disheveled black long hair: 1.5), (black skirt: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
気になる結果も早速発表しますね!!
髪の毛が黒くなった | 14枚 | 14% (-10%) |
スカートが黒くなった | 76枚 | 76% (+4%) |
ベレー帽が黄色になった | 39枚 | 39% (+9%) |
シャツが黄色になった | 75枚 | 75% (+50%) |
すべて指定通りの色になった!! | 11枚 | 11% (+5%) |
とても成功率が上がりました!!
これを見つけた先駆者の方はすごいですね。
特に黄色シャツの成功率の上がり方は尋常じゃないですね。
一方で、黒髪の成功率は下がっています。
語順について研究した際も、前に置くtagの方が効力が強いことは言いましたが、
その影響で黄色の成功率が上がり、黒色の成功率が下がったのでしょうか?
であれば、スカートの成功率が依然高いことに説明がつきません。
②占有面積が大きい順に並べる
Promptと出力結果がこちら。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (disheveled black long hair: 1.5), (yellow sleeveless collared shirt: 1.5), (black skirt: 1.5), (yellow beret on an angle: 1.5), (beautiful detailed orange eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
髪の毛が黒くなった | 68枚 | 68% (+54%) |
スカートが黒くなった | 80枚 | 80% (+4%) |
ベレー帽が黄色になった | 38枚 | 38% (-1%) |
シャツが黄色になった | 37枚 | 37% (-38%) |
すべて指定通りの色になった!! | 17枚 | 17% (+6%) |
髪色の成功率が跳ね上がって、シャツの成功率が半分程度になりました。
全ての成功率を鑑みると、①よりも高くなりました。
Stable Diffsionは低Steps数の時点でまず全体をラフに着色するため、
面積が大きい箇所を優先して描かせるというのは
存外的外れな方法ではないような気がします。
依然として、tagの順番が後半にあるスカートの成功率が高いですが、もしかすると
「指定色の後ろの単語がシンプルな方が、AI側が判断しやすいためでは?」
という疑問が私の中で生じました。
③記述をシンプルに分割する
以下のようにPromptを修正しました。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (black long hair: 1.5), (disheveled hair: 1.5), (yellow shirt: 1.5), (sleeveless collared shirt: 1.5), (black skirt: 1.5), (yellow beret: 1.5), (beret on an angle: 1.5), (orange eyes: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
語順は②に準拠しているので、②との比較になります。
髪の毛が黒くなった | 71枚 | 71% (+3%) |
スカートが黒くなった | 83枚 | 83% (+3%) |
ベレー帽が黄色になった | 43枚 | 43% (+5%) |
シャツが黄色になった | 43枚 | 43% (+6%) |
すべて指定通りの色になった!! | 20枚 | 20% (+3%) |
全体的に数値が向上しました!
しかも、他の指定している条件を満たさなくなったということもありません。
ただ上昇率が小さいので、サンプルサイズの大きさからも上振れている可能性はあります。
しかし、成功率が下がった例はないので多少は効果的なのかなと思います。
問題はtag数が増えてしまうことですね…
こうなると黒スカートの成功率だけ高い理由は難しいです…
まさか、AI側が上半身と下半身を漠然と区別しているってこともないですよね…
う~ん、靴まで描画すれば何か分かったかもしれません。
④”+, *, –“などによる分離
これは色を指定する箇所に、
「”+”や”-“といった意味のなさない記号を挟むことで色汚染を防げるのではないか」という
考えから生まれた方法です。
私も普段使用していますが、正直「おまじない」じゃないかなと思っています。(えっ)
なのでこの検証は個人的にとても楽しみです。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (+++black+++ long hair: 1.5), (disheveled hair: 1.5), (+++yellow+++ shirt: 1.5), (sleeveless collared shirt: 1.5), (+++black+++ skirt: 1.5), (+++yellow+++ beret: 1.5), (beret on an angle: 1.5), (+++orange+++ eyes: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
使用するPromptは上記のものです。
いくつ”+”や”-“を入れるかという話がありますが、
大体2つ~4つ重ねることが多いようなので、今回は“+++単語+++”の形でいきます。
正直これで変わったら凄くないですか??笑
出力結果はこちら!
ちなみに③と比較しています。
髪の毛が黒くなった | 11枚 | 11% (-60%) |
スカートが黒くなった | 87枚 | 87% (+4%) |
ベレー帽が黄色になった | 12枚 | 12% (-31%) |
シャツが黄色になった | 45枚 | 45% (+2%) |
すべて指定通りの色になった!! | 2枚 | 2% (-18%) |
これ何かあります!(そりゃそうじゃ)
全体的にびっくりするくらい成功率が落ちています。
流石にサンプルサイズの小ささから来るばらつきで説明できる域を超えています。
(確率統計をこの春まで研究していましたが、これは減少幅が大きすぎる気がします。)
1つ思ったのは、
「色指定が+の波でもみ消されてる」のではないかということです。
“+++black+++”で”black”の影響が小さくなっているのでないかということです。
つまり、[black]のような効果があるのではないかということです。
そうなると、気になるのは”+++black+++ skirt”を圧倒的強者感。
色を指定せずに“skirt”のみで出力したときに黒色ばかり出れば、
“+++”が影響を弱めている可能性が高くなります。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (disheveled hair: 1.5), (skirt: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
色指定を一切していないこのPromptで10枚出力してみます。
全然スカート黒くないですね。むしろ1枚だけです。
てか、金髪多くね!?!?!?
黒髪が弱いのではなくて、金髪のバイアスが強すぎる…?
研究をしていると、この「単語AIバイアス」なる問題によく直面しますね。
(他の方たちもよく仰っていますが、私のモデルが金髪をより学習してしまっているきらいはあります。)
結論として、何か意味を持っている気がしますが処理自体は分からないですね。
[]でないとすると、少し効力が薄まることでStepsに影響してるのではないかとか、
表に出てこないところが関係している場合があります。
こうなると、こちら側で制御するのはかなり難しい話になると思いますので、
もしかするとあまり使わない方が制御しやすいかもしれません
本記事では”+++”については、このあたりを落としどころにしたいと思います。
wikiなどでも効果はないとされていますが、具体的な影響については見つけられなかったです。
⑤*//*による分離
ベースは一番成功率が高かった③のものを使います。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (black long hair: 1.5), (disheveled hair: 1.5), *//*, (yellow shirt: 1.5), (sleeveless collared shirt: 1.5), (black skirt: 1.5), *//*, (yellow beret: 1.5), (beret on an angle: 1.5), (orange eyes: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
“*//*”を入れる箇所の候補ですが、
①と②を比較したときに低下した黄色シャツ問題を解決したいと思います。
実際は黄色シャツが減ったというよりも黒シャツが汚染されて増えた印象です。
もし、”*//*”に汚染バリアなる効力があるとすれば、
“black hair”と”yellow shirts”の間に挟むのが一番効果的では!?と思いました。
ついでにベレー帽にも挟んじゃいましょう。
髪の毛が黒くなった | 67枚 | 67% (-4%) |
スカートが黒くなった | 88枚 | 88% (+5%) |
ベレー帽が黄色になった | 37枚 | 37% (-6%) |
シャツが黄色になった | 57枚 | 57% (+14%) |
すべて指定通りの色になった!! | 25枚 | 25% (+5%) |
シャツの色に対しての効果を期待してでしたが、
まさかのシャツ成功率が14%上昇しました!!
正直に申し上げて、影響がないとは思わないですね。
もちろん理由はあります。
1つは、同じseedなのに構図が少し変わります。
ほかの比較のときは見られなかった影響です。
今回だけ並び替えだけでなく、新しいtagを挟んでいることになるので
この”*//*”に何らかの意味はあるということでしょう。
もう1つは、「1つの部位で色が混ざることがある」ですね。
これも他の検証の際は起きなかった現象です。
ハイライトが黄色くなっているのかとも思いましたが、
それだと光の入り方が不自然なので、これはベレー帽の色が混ざっていると思います。

“black”でスカートとついでにベレー帽も塗っちゃうか~

“black”でベレー帽も塗っちゃったから、指示通り”yellow”で上塗りしないと~

はにゃ!?
*//*のせいでちょっと単語が遠くなってて”yellow”で塗り始めるのが遅れちゃった!?

塗りきるためのSteps数を超えちゃったよ~~ぴえん
みたいな感じじゃないでしょうか?(知らんけど)
1つ思ったのは、*//*が入ることで処理に入るまでの遅延は発生してそうですね。
これに関しては別に*//*でなくても良い気はしますが、
他の「意味を持たない単語」を見つけるのも地味に難しそうではあります。
この仮説が正しいのであれば、髪とシャツの色が混ざることがなかったのは、
「シャツを”yellow”で上書きする時間はあったが、ベレー帽を上書きする時間はなかった」
ということなのでしょうか?
そうなると、AIはまず
「色は適当に色分けだけ行い、とりあえず指定されているtagの要素だけ拾って後から着色を行う」
という流れで描画しているのでしょうか?
私はAIのアルゴリズムには全く知見がないため、
このあたりのプロセスを知っている方がいれば、ご教授願いたいです。
⑥”and”の利用
同色のものを”and”でつなげば成功率が上がるのではないか?という仮説です。
使用するPromptは一番成功率が高かった⑤をベースにします。
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), (black hair and skirt: 1.5), (disheveled long hair: 1.5), *//*, (yellow shirt and beret: 1.5), (sleeveless collared shirt: 1.5), (beret on an angle: 1.5), (orange eyes: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
出力結果は以下のようになりました。
髪の毛が黒くなった | 100枚 | 100% (+33%) |
スカートが黒くなった | 57枚 | 57% (-33%) |
ベレー帽が黄色になった | 69枚 | 69% (+22%) |
シャツが黄色になった | 55枚 | 55% (-2%) |
すべて指定通りの色になった!! | 53枚 | 53% (+28%) |
完全に優勝です🎉
何が良かったかというと、明確に黒スカートの成功率が落ちた原因が分かるからです。
今回のPromptだと黒スカートの上に黄色が途中まで上塗りされているものが多くありました。
つまり、
“yellow shirt and beret”をもう少し後ろにずらすか、
後述する方法でsteps数を早めに切り上げてあげればよいのではないかと思います。
これはおそらく黄シャツの成功率も同時に高めるでしょう。
後者の内容を最後に試してみましょう。
⑦【上級者向け】Prompt Editingを用いた制御

Prompt Editingってそもそもなんじゃ?
Prompt Editingとは、簡潔に言うと
「途中でPromptの指示を変えてしまう!」機能です。
便利な機能ですが、記法に少し癖があります。
[A: B: 0.0~1.1までの小数]
という風に入力すると、
全Step数の(入力した小数)まではAを実行し、その後はBを実行するという意味になります。
小数の欄に代わりに1以上の整数を入力すると、そのSteps数までAを実行することになります
今回の検証は私が愛用しているSampler:Euler、Steps:40で行います。
使用するPromptは⑥をベースにしたこちら!
(1girl: 2.0), (illustrations: 1.3), (best quality: 1.3), (official concept art: 1.2), (outline: 1.2), (dynamic pose and angle: 1.6), (looking at viewer: 1.4), (4k wallpaper: 1.2), (limited tone: 1.8), (cinematic light: 1.2), (CG: 1.1), (all intricate: 1.2), (flat color: 1.6), ([black: : 10] hair and skirt: 1.5), (disheveled long hair: 1.5), *//*, ([yellow: :27] shirt and beret: 1.5), (sleeveless collared shirt: 1.5), (beret on an angle: 1.5), (orange eyes: 1.5), (beautiful detailed eyes: 1.5), (jewelry pupils: 1.3), (bare shoulder: 1.1), (smile: 1.5), (energy effect: 1.2), (cyberpunk: 1.1), (idol concert: 1.2)
作成していて分かったこと、意識したことは以下の2点です。

髪の毛が黒くなった | 100枚 | 100% (±0%) |
スカートが黒くなった | 60枚 | 60% (-3%) |
ベレー帽が黄色になった | 67枚 | 67% (-2%) |
シャツが黄色になった | 76枚 | 76% (+21%) |
すべて指定通りの色になった!! | 64枚 | 64% (+11%) |
この黄色い服+黒髪という初めは成功率が6%だったものが、64%まで上昇したのは非常に良い成果となったのではないでしょうか!!
ちなみに他の色の組み合わせは基本的にもっと再現しやすいはずなので、
成功率がさらに高くなる可能性も十分にありそうですね!
(有名キャラがたくさんいる色の組み合わせなど、人気の配色はみんな偏りますので!)
まとめ
かなりのボリューム感で考察・検証を行ってきましたが、
結果をまとめるとこのようになります!
時間対効果が非常に良く、すぐにでも行える点が◎②占有面積が大きい部位順に並べるのも非常に効果的!
ただし、後述する調整を少し行う必要があります。③色を指定するtagは分けた方が良い!
④“+++”などは今のところは避けた方が良い!
⑤“*//*”は適切な配置をすれば、効果があると考えられます!
⑥“and”構文はかなり効果的!同色はとりあえずまとめてみるのもアリ
⑦難しいけれど、Prompt Editingにはある程度の制御を行える可能性アリ!
そして、ここまで読んでいただきありがとうございました。
質問等は気軽にリプライしてやってください。

コメント
とてもわかりやすく参考にさせていただいています。
プロンプトには通常の指定用とネガティブプロンプトもありますがそちらはどういった設定にしているのでしょうか?
それと設定も結構影響のある項目がありますがそういった裏の部分も知りたいです。
(知りたかった事:1.8)が,(ばっちり:1.5)、しかも(分かりやすく説明:1.5)されてて
めちゃくちゃ勉強になります