2024年2月23日金曜日

Stable Diffusion WebUI: ADetailerでの手の修正を考察する

Stable Diffusion WebUIのプロンプトを探る話です。これは英語の話でもあるのです。
最初に今回覚えた表現
metacarpal: (^メ゙タカーパル。^はアクセント位置) :中手骨(ちゅうしこつ)、拳を握ったときに指の付け根の出っ張りの骨。
slender hand:スラッとした手
さて本題。Stable Diffusionで人物の絵を生成させたとき、体のディテールが乱れることはよくあります。特に難しいのは手、足の指。

全体的に気に入った絵が出来たなと思っても、指がありえないことになっていて残念というとはよくよくありますね。

img2imgのinpaintの機能で修正しようとしてもあまり上手く行かず、Controlnetのopenpose, depthなどの機能を使う手もあるのですが、たまたま生成された構図やポーズをうまく活かしたいとするといろいろと準備が必要です。また、inpaintは、補正領域を指定するマスクを描くのが結構大変です。

今回はADetailerという拡張機能を使います。これは、描画後に顔や手などの領域を自動で抽出し、inpaintを実行してくれるというなかなかお気楽なツールです。インストールはあちこちで紹介されているのでここでは省略します。

今回のお題。こちらの絵の左下の手となります。
なかなかいい表情とお背中が生成されているのですが、左下の手が少しおかしなことになっています。
薬指と小指が影に潰されてしまっています。
ADetailerを有効にすると、一旦画像を生成後に、下記のように領域抽出をしてくれて、そこにinpaintを実行してくれます。修正したい対象が手なのか顔なのかはADetailer用のモデルを選択して指定します。

最初は以下の設定ですすめていきました。
ADetailer model: hand_yolov8n.pt,
ADetailer mask blur: 4, 
ADetailer denoising strength: 0.4, 
他のパラメータはデフォルト

はじめ:
ADetailer用のプロンプト:puts hands on deck, (手をデッキの上のに置いている)、だけを指定

なんとなくうまく行っているようも見えますが、これは左手なので手前が小指。小指と薬指の間が開きすぎている気がします。薬指は人差し指として書かれている気がします。あと、女性にしては手がゴツい。

2回目:
プロンプト:"slender hand, pinky finger, (ring finger) puts her hands on deck", 
ネガティブプロンプト:"metacarpal, (shadow:1.2)"

女性をイメージしてslender hand=スラっとした手とさらにring finger=薬指をカッコで強調しながら入れました。また拳の感じを取るためにネガティブプロンプトにmetacarpal(中手骨)と影(shadow)とを入れてみました。

ring fingerのringに引きづられて指輪らしきものが描かれました。でも、薬指の部分がない。あと少し画質が低いことも気になりました。

3回目:
プロンプト: masterpiece, best quality, absurdres, highest resolution,left hand, slender hand, pinky finger, puts her hands on deck, back of the hand, thumb, wood deck 

ネガティブプロンプト: metacarpal, (shadow:1.2), darkness, gap between fingers, (ugly face:0.8),cross-eyed,sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, bad anatomy, facing away,extra fingers, fewer digits, extra limbs,extra legs, malformed limbs, fused fingers, too many fingers, long neck, buildings, birds, wooden wall

書き込みが足りないのかと考え、txt2img本体のプロンプトからの品質に関するプロンプトと、ネガティブプロンプトを入れてみました。左手であることを強調するためにleft handも入れました。ネガティブプロンプトは手の変な部分を解消し薬指を生やす効果を狙っています(アデランスかよ!)

うーん、手の絵柄の品質は上がったが、薬指が生えない。

4回目:(実際は数十の試行が実施されています)
どうにもうまく行かないので、パラメータをいじることにしました。
ADetailer denoising strength: 0.79
ADetailer inpaint only masked: True,(ここをTrueにするには、チェックを入れる)
ADetailer inpaint padding: 84, 

denoising strengthは元の絵をどれだけ変更するかに関するパラメータです。これを結構強めにしました(デフォルトは0.4ぐらい)。すると、

のように、影が消えて、手を侵食するようにウッドデッキの盛り上がりが生成されました。手が上書きされるほど変更がかけられるということは、薬指も生やせるのではないかと考えました。denoising strength を中心にパラメータの調整を試みました。

5回目:
プロンプト: masterpiece, best quality, absurdres, highest resolution,left hand, slender hand, pinky finger, puts her hands on deck, back of the hand, thumb, wood deck 

ネガティブプロンプト: metacarpal, (shadow:1.2), darkness, gap between fingers, (ugly face:0.8),cross-eyed,sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, bad anatomy, facing away,extra fingers, fewer digits, extra limbs,extra legs, malformed limbs, fused fingers, too many fingers, long neck, buildings, birds, wooden wall

ADetailer mask blur: 8, 
ADetailer denoising strength: 0.58,
ADetailer inpaint only masked: True, (ここをTrueにするには、チェックを入れる)
ADetailer inpaint padding: 84
ADetailer use separate CFG scale: True,(ここをTrueにするには、チェックを入れる)
ADetailer CFG scale: 8.5

手が壊れない程度のdenoising strengthを探り、おおよそ満足できる結果になりました。
投稿などするにはUpscaleをする方多いと思いますが、ADetailerはHiresをかけたあとに実行されるので、大きいサイズ用の設定はまた少し探さないといけないと思います。

今回のまとめ:ADetailerのコツ1
  • 絵柄のクオリティを上げるために、txt2img本体のプロンプトで与えた品質に関するテキストも、ADetailerのプロンプトに与える。
  • 大胆に修正をかけるためは、ADetailer denoising strengthの値を0.5以上の値を使う
  • (この時、ADetailer inpaint only masked:にチェックを入れ、 上記の絵の場合(全体540x540)でADetailer inpaint paddingの値を 84px とデフォルトよりもだいぶ大きな値とした。)
おそらく上記のノウハウはimg2imgやControlNetのinpaintでも参考になるのではと思いました。




0 件のコメント:

コメントを投稿