Stable Diffusion Web UIを理解するのは大変だ
Stable Diffusionを使用し始めてから半年以上は経過するのか。とにかく時間は食われる。上手くいかないと延々と切り上げられずにしてしまう性分なので、一度、動かすと朝までしているなんてことはざらにある
問題点
とまあ、時間を掛けたからといってよかったかといえば、結局、見返してみると納得できた画像をひとつも得られていないことに気付いてしまう。それも毎回だ。つまり、生成しているときには熱が入っているので生成物の出来上がり(クオリティ)が分かっておらず、ただ、時間を浪費している。超、まずい。
失敗することは悪くはないけど、次に活かせていない(延々のループ感がある)
見返した生成した画像にどんな問題が起こったのか?
生成したキャラクターの腕や足の数が人のそれを超えている。や、クリーチャーを生成したいわけではないので・・・何ていうか足のことであればタコさんを下から見た感じ(伝わるのか)腕であれば、千手観音のようなイメージだ。気に入った構図だったとしても仕方ないので次の生成をしている
手の指先があらぬ方向を向いていたり、指の数が増えたりする。足の方はあまり、生成することがないので分からないが同じ状況だと思う。前段の腕や足をクリアしても、この段階で問題が起こるとしんどい。結局、また、生成を繰り返してしまう
今まではどんな対処をしてきたのか、どんなことを試したのか
本当、Youtubeの解説動画や解説記事は全て滅べばいいのに!と思うくらいには試してきた
同じSeed値でプロンプトの変更を試みる
どうしても惜しくて捨てにくい気に入った画像が出たときに同一シード値の
まま、プロンプトの変更を試みた
例えば、腕が1本多く外から生えるときに、何か指示したプロンプトが絵として破綻しているのではないかと考えてプロンプトを見直して修正したのち、結果を確認する。
基本的にワードに対して生成される絵を予想しながら(思い描きながら)、Stable Diffusionのロジックと矛盾ないか感覚的に詰めていくのだが、恐らく、相反するトリガーワードがあるため、矛盾が起こっていると思われる
例えば、何も指定していないから腕は下に降ろしているハズなのに、斜めからの視点だと在らぬ方向から第3の腕が飛び出してきた場合だ。恐らく、トリガーと思われるワード(Scenic等)との関係で斜めからであれば手は外方向に向かって腕を上げて広げたくなるのではないか
腕の向きに関しては何も指定していないから、むしろ、成立するんじゃないかと思われるが成立しない場合がある
そのため、arms downなど腕を降ろすプロンプトを追加しても一向に解決しない。かといって、強調表示をしてしまったら他のプロンプトのバランスが崩れるジレンマを感じるので出来ない
単にプロンプトを追記するのでは解決しない問題だ。トリガーワードと思われるプロンプトを外して別な言葉で置き換えて解消したと思われたが、結果的に同一シードから満足の行く生成が得られたかといえばそうでなかった
※実際には感覚上の話なので、Stable Diffusionへの理解は正しいかは置いておいて、いずれにしても自分の中のStable Diffusionの理解では破綻するので何とかしないといけない
同じSeed値でDenoise StrengthとCFG Scaleを調整する
Stable Diffusion Web UIの初期値は下記のように設定されているかと思う
Denoise Strength:0.7
CFG Scale:7
Stable Diffusion Web UIは生成途中の絵が見えると思うが、最初の50%くらいまではいい感じだと思ったのに、突然、75%くらいで絵が変わった経験はないだろうか?
実は、設置値の数値は大きくプロンプトに忠実ではなく変更を加えていることがあるのではないかと思い、設定値を変更した
Denoise Strength:0.5 or 0.55
CFG Scale:5
この設定値のおかげで極端な変更は少なくなったと思うのだが、「同じSeed値でプロンプトの変更を試みる」の項で取り上げた、矛盾が発生する場合にはこの方法は有効ではない
全然、気付かずにCFGとDenoise Strengthの設定を上げ下げして時間を浪費した。プロンプトの矛盾は先に修正した方がいい
しかし、矛盾のないプロンプトが出来たと思っていても、今なお、生成結果に問題が発生しているので、自分が気付いていない矛盾があるのではないか。従って、プロンプトだけで制御するのは限界があるように感じる
ちなみに、Negative Promptで表示したくない要素を指定しても同じ問題が起こったので議論しない。むしろ、Negative Promptで指定した要素が入ったことがあったので、Negative Promptの制御もオススメはしない(万能ではない)
Easy NegativeやNegative handなどのEmbeddingを試す
Easy NegativeやNegative handなどのEmbeddingで有名そうなヤツも一通り試したが、指や腕が沢山生える問題は解決しなかったので使用していない。中身を返せば、代理でプロンプトを入力してくれるものだからだ。やはり、万能ツールではない。むしろ、自分が認識していない言葉を埋め込むので絵柄が変わる傾向があるように感じた。今は使用していない
(worst quality, low quality:1.4),
Adetailerなの拡張機能を試す
コードを見ていないので直接的な仕組みは分からないが、生成した後の指や手を直すもの、うーん、改善したかなぁと思わなくもないが、そもそも、生成時点で失敗したものを修正するのには限度があると感じる。いやゆる、手の認識がうまくいかなければ修正はされない
後、中にプロンプトが仕組まれているのか知らないが、ONにすると絵柄が変わる気がするのは気のせいですか?
もちろん、photoshopのように後から修正する行為は、写真等でも採用されており、手で修正するか機械で判定させるかなど、どちらを使ってもいいが、手法としてはありだと思うので否定しない。問題なのはどうやって生成段階でベターを出すかだ。本件を解決するにはここに力点を置かなければならない
BDさんの1年くらい前の記事になるが、lama-cleanerというのがあるらしいので別途、試してみたい
後はLoraを使うのは手かと思うが充分には手を出せていない
課題と目指す生成結果のクオリティについて
プロンプトの制御には限界がありそうだ
そもそも、どういうレベルの絵を出したいのか
AIによる生成画像を投稿しているサイトはいくつかあるが、例えば、PIXIVに掲載されている生成画像の完成度(Quality)を目指したい。
特に気に入っているのは型が出来上がっているのか、色々なキャラクターで同じような構図の絵が作られていて、クオリティが維持されつつ量産できているように感じられた点だ
しかし、Stable Diffusion Web UIの機能や拡張機能などを調べて試しても、いつまでたってもここまで到達できない。ここが、Youtubeの解説動画や解説記事を信用できない理由だ。彼らはすごいぜ!と言うが、他の人が使ったときに本当に使えるものなのかまでは考えていない(当然だが)。たぶん、都合のいいパターンを切り取って説明しているだけではないのか?それか、何か視聴者には伝えていない秘密のテクニックを隠しているんじゃないかと邪推するくらいには信用していない(笑)
もちろん、お前の使い方が悪いって言い分は多いにあるかもしれない。要は道具に頼って、頭を使わない(頭の悪い)1対1の効果の結果に期待してしまっている部分がある。そのため、使い方次第では改善、解決する可能性はあるので、メッチャ便利ですよ!というのが間違いではない可能性がある
しかし、そこまで来ると時間の掛かり具合はあるだろうけど、真面目に絵を描き始めたりPhotoshopの修正の仕方を身に着けた方がいいんじゃないのか?「効率化するためのツールが使う人によって効率化しないとは如何なることか」とは思う。ある程度、どの人が使っても効率化することが認められるときに便利って言葉があるのではないか。まだ、筆やペンで使う人次第ってレベルのものもあるのだろう
本当に便利だというならば、お題となる生成された絵を模倣できるかなど、試してみるのはどうなんだろうか?驚き屋の本気の絵が見てみたい。
話は脱線したが、PIXIVに掲載されている絵というのは、何かしら自分が把握していない手間(場合によってはWeb UIの範囲を超えた編集)を加えているのではないかと思う程度には、Qualityが高いと感じるものが掲載されている。どうすれば達成できるか
新たな対策
自分がすごいと思う生成結果にたどり着くにはどうしたらいいかと考えたときに見えていない要素はたくさんある。もちろん他にも気付いていない要素はたくさんあると思う
表情
背景
身体の大きさ
視点の向き
衣装
ポーズ
構図
色(濃淡)
光(明るさ・暗さの差)
立体感
口で言うのは簡単だが、更にひとつひとつの要素にも深さというか、多次元というか認識していない要素はたくさんあって言語化(プロンプト化)出来ていないことはたくさんあるので、PIXIVに掲載されているクオリティを達成するには深みのある言語化(プロンプト化)する、足りない点を解析する、気付く、生成AIの範囲も超えた手法も考える、身に着ける、最終的に絵が高解像度で頭の中で描けるところまで行きたいが長い道のりだ(手軽じゃないなw)
controlnetを導入する
いずれにしても目指したい生成結果はあるので真似をするしかないだろうということで、せめてポーズを真似できないかということでcontrol.netに再び手を出した
若干、絵も変わる気はしているので、使っていくかはこれから判断していくことなのだが、プロンプトで表現することが自分にとって難しいのであれば、controlnetで構図を真似することで、最初の問題(手足が増える問題を減らす)ことが出来るのではないか
要するにプロンプトを書かないでcontrolnetに補ってもらうということだ
というかcontrolnet使って、プロンプトを書かないといけないのならば、2度手間になるからプロンプトだけ書いた方がいい。しかも、controlnet使っている分、生成時間が3倍~5倍くらいは掛かるからコストはより掛かる
もし、プロンプトでジレンマを感じている上でうまく行かないならば、更に他の方法を探すことにしよう
採用する基準は下記の通りとする
controlenetは1枚生成するのに時間がより掛かるが、プロンプトで大量に生成する時間よりも結果的に時間が掛からないこと
真似したい生成結果に近付けたか
破綻していない生成結果が得られるか
controlnetのdepthを使用した
自分が気に入った生成結果の構図を真似るためにdepthを使用した。
controlnetではOpenPoseなどが紹介されているが結果が見込めなかった
その中でこれならばと思う結果が得られたのがdepthだった
open poseで解析した棒人間を元に生成したところ違う解釈をした。棒人間から見て結果の解釈は間違っていないと思う。このままでは使えないのでプロンプトの修正が必要かもしれない。ということで不採用。よい点は絵をモデリングしているわけではないので、顔や紙、体系などが元の絵に引っ張られないことだ。どちらかといえば、棒人間を作る人には向いているかもしれないが、真似るときには必ずマッチするとは限らない。
スケッチや線画などの機能もあるが、これは元の生成結果の内容に変わるので、キャラクターを変えたときの差し替えには向いていないだろう
リファレンスは同一キャラクターには使えるだろうが、やはり差し替えには使えない。リファレンスや他の機能と組み合わせて出来ないかは試している最中なので割愛する。いずれにしても効率を重視する
controlnetのdepthにも課題はある
深度ではあるので、やはり生成結果の内容をベースにしてしまう。スケッチや線画よりは指定が細かくないものの、キャラクターの髪が特徴的だったりすると、表現上、構図だけ真似してキャラクターとして差し替えることが難しい。解析データが棒人間の深度版のようにまとまるのが望ましい
また、背景を切り抜くことで人物像だけのポーズを作成することは出来るか試したが、これも切り抜きの精度(切り抜き結果)によって使用できるかは分かれた
いわゆる、civitaiなどのサイトを調べると汎用できるように加工されたと思われるDepthも配布されているが、最終的には自分で気に入った生成結果を作れるdepth画像を作る必要がありそうだ
こちらは、まったく方法が浮かんでいないので、他の方法も含めて進捗があれば記事を書いていく
controlnetのdepthの使い方について
depth(深度情報)の画像を持っている場合は、controlnetで読み込ませた後に、Processorは使用しないでモデルだけ選択する(ここ重要)また、自分のプロンプトを優先するように書いてあった
Processorからmodelの順番につながるUIだから、依存関係にあると思ったらそうではなかった。これは早く気付きたかった。文章を読まないせいだw
動作の仕組はよく分かっていないので割愛するが、元画像に近い構図でキャラクターを差し替えて生成という行為ができた。100発100中ではないがプロンプトを回し続けるよりは近付いた気がする。後は、どちらが効率いいかなど実際に計測して本当か確かめるだけだ
なお、controknetのweight(重さ)も1でいいんだが、主張が強すぎるのかプロンプトやモデルなどが邪魔をしているのか分からないが、必要に応じて下げることで差し替えが上手くいく場合があった(1で充分だろうと思っていたのだが、深度は差し替えるのに余計な情報を含んでいるのかもしれない)自分の場合は0.4まで下げてもいけた。ただし、試行回数は発生するので注意すること
また、なぜか背景が狙った通りにならないので、課題は残るので引き続き検証していく。背景のとこに微妙に深度情報が残っているとかではないのかな。なお、構図のプロンプトは省略しても要素が足りていない場合は補う必要がある
ちなみに、元画像のアスペクト比は確認して同じように設定すること
例えば、デフォルトは512*512だが、512*768の生成画像の深度を使うならば、同じサイズで生成しないと表示されずに見切れることが実際にあった
お気に入りの生成画像のアスペクト比毎に分類してベースフォルダを作成(体系化)していきたい。今度そんなプログラムを作りたい。
余談
control netのモデルによって出力結果は異なるわけだが、モノによって推論速度が変わる。今のモデルにあって軽くキャラクターを差し替えてもうまく行くものを探したい
stable diffusion web forgeの推論時間が早いようなので、全体的な処理速度を上げるには検討してもいいかもしれない
control netにもsdxl用のmodelがあるので、sd1.5用のモデルじゃないと作用しないように見受けられたので注意が必要
SD1.5の資産をSDXLで使用できたらと思っていたら、X-adpterなるもがあるようだ。ちょっとこれも追いかけたい。実は解像度によって描画の余地が生まれるのではないかと考えていたからだ
まとめ
Stable Diffusion Web UIを理解するのは時間が掛かって大変だ
controlnetのdepthに可能性を感じた
おわり!