ADetailerで、SD1.5の小さい顔の顔崩れ問題を改善できるか ~ 画像生成AI実験メモ ④-2

本記事に掲載している人物画像は、すべて生成AIにより作成したものであり、特定の実在人物をモデルにしたものではありません。
SDXLモデルでLoRAを使用して生成した画像を学習素材として、SD1.5のLoRAを作成したところまでが前回の内容となります。
顔の画像が比較的大きなものについては、まずまずの成果が出たと感じているんですが、どうしても画面に占める顔の割合が小さいもの(遠景や全身画像)だと、顔が崩壊してしまうんです。
最初、これもLoRAの生成に問題があるのかと思っていたんですが、そもそもSD1.5の宿命的な問題で(上記リンク内参照)、どうしようもないと言えばどうしようもない問題です。
SDXLでも基本は同じなんですが、生成画像の解像度が大きいことから、比較的大きめの画像を生成するなら顔崩れがSD1.5よりは少ないのかな、と思います。
なので、SD1.5なら、なおのこと顔崩れを防止する方策を取りたいところです。
ADetailerとは?
では、どうすればいいのか?
前回の最後にChatGPTが示した通り、「顔を大きな作業領域で描き直す」ADetailerを使用するのが最善策のようです。
ADetailerは、Stable Diffusionで生成した画像から顔や手などを自動検出し、その部分だけを再描画して崩れを補正する拡張機能です。
img2imgのinpaintで顔部分を手動で(マウス操作で塗りつぶして)選択して、その部分を再描画するのではなく、自動で顔を検出してくれるのがいいですよね。
とは言っても、実は使ったことが無いので半信半疑で試してみました。
ADetailerのインストール
情報では、txt2imgのこのあたりに項目があるということだったんですが。。
ここに表示が無いということは、Automatic1111(以下A1111)に拡張機能が入っていない、ということですね。
A1111の上部メニューにある「Extensions」の「Installed」タブで表示される一覧表の中に「sd-webui-adetailer」が見当たらなければ、導入の必要がある、ということです。
「Install from URL」タブで、「URL for extension’s git repository」に、
https://github.com/Bing-su/adetailer
と入力。
そして、「Install」。
インストール完了後(プログレスバー停止後)、「Installed」タブを見ると、
このように、「adetailer」がインストールされました。
この一覧表の上にある「Apply and restart UI」ボタンをクリック。
UIの再起動で、
「ADetailer」が設定対象となりました。
パラメータ設定
◀をクリックして折りたたみを開くと、
なんか、想像していた以上に設定項目があって、ちょっとひるみます。「Detection」「Mask Preprocessing」「Inpainting」はさらに展開されますので、トータルの設定項目数は軽くこの倍以上になります。
が、設定が必要なのはこのあたり。
まず、最重要なのが、ADetailer detector。検出モデルです。とはいえ、今回期待する顔補正なら、既に設定されている「face_yolov8n.pt」でOKです。
その自動検出された領域に対して再描画するためのプロンプト/ネガティブプロンプトを設定するのが、「ADetailer prompt」「ADetailer negative prompt」です。記載されていますが、空欄のままだとメインのプロンプト・ネガティブプロンプトがそのまま適用されるようです。
ですので、顔に特化したプロンプトを設定しましょう。
ADetaier prompt
<lora:ai_model_v6-000060:0.80> ai_model_v6,
same face, detailed face, natural eyes, gentle smile, realistic face
ADetaier negative prompt
bad face, deformed face, asymmetrical eyes, bad eyes, distorted mouth, blurry, low quality
LoRAを使用しているなら、プロンプトにも記述を。
Detection の設定項目は、デフォルト値のまま。
Detection model confidence threshold: 0.3
Mask min ratio: 0.0
Mask max ratio: 1.0
Mask Preprocessingも、デフォルト値で大丈夫そうです。
Mask x/y offset: 0
Mask erosion/dilation: 4
Mask merge mode: None
Inpaintingも、このあたりはデフォルトでOKですね。
Inpaint mask blur: 4
Inpaint denoising strength: 0.35 ~ 0.45
Inpaint only masked: ON
Use separate width/height は、ONに変更します。サイズは
Inpaint width: 512
Inpaint height: 512
のままでOKです。
Use separate steps も ONに。
ADetailer steps は、20程度が良いようです。
Use separate CFG scale もONにします。
ADetailer CFG scale は、6~7くらいが良いとのこと。
なので、いくつか設定を変更したものの、値についてはほぼデフォルト値で大丈夫なのかな、と思います。
最も大事な(影響が大きい)のが、Inpaint denoising strengthでしょうか。
元の画像からどれくらい変化させるか、という強度設定です。元の顔を保ちやすいのが 0.25~0.35あたりで、しっかりと直したい場合は 0.40~0.50、完全に書き直したい場合は 0.55~0.6あたりに設定するんだそうです。もちろん、元の顔からは離れていく傾向にあると思いますので、低めから試すのが良いのかな、と思います。
ADetailerの効果を試してみる
では、さっそく、ADetailerを有効にして確認してみましょう。
前回記事の山登りの画像を、640×320で何枚か生成してみます。
生成途中、A1111の画面には、

このように、自動検出したことが表示されますので、見ていても面白いですね。
ちなみに、2060 SUPERでは12枚を生成するのに、OFFのときが50秒ほど、ONのときは1分20秒ほどで、1.6倍ほど(1枚当たり2.5秒ほど)の処理時間の増加となりました。
5070Tiでは、12枚の生成に要した時間は、OFFのときが17秒ほど、ONのときは24秒ほどでしたので、1枚当たり0.6秒ほどの増加ですから、ほぼ気にならないですね。
このときの処理後の画像がこちら。

見事に補正されているのが判るかと思います。
他にも、

このサイズで、クリアな顔描画になっています。
逆に、この写真(同じSeed値のもの)をADetailerをOFFにして生成してみます。

この有効性が判ってもらえるでしょうか。
最初に挙げたものも同じSeed値で再生成。

もっとも、全てが万能かというと、そうでもなく、これよりも小さな顔だと、ADetailerを有効にしても、

このようになることがあります。同じSeed値でOFFにしたものがこちら。

右目以外は顔補正されていることがわかりますね。ただ、右目は修復できないほど初期の崩壊が大きかったようです。顔が斜め向きというのも影響しているのかもしれないですね。
でも、諦めちゃダメです。
思い出してもらいたいのが、これ。
最も大事な(影響が大きい)のが、Inpaint denoising strengthでしょうか。
元の画像からどれくらい変化させるか、という強度設定です。元の顔を保ちやすいのが 0.25~0.35あたりで、しっかりと直したい場合は 0.40~0.50、完全に書き直したい場合は 0.55~0.6あたりに設定するんだそうです。
なので、同じSeed値で、Inpaint denoising strength の値を 0.55 にして再描画。

もはやマジックレベルです。
他にも、このような、

ダメだこりゃ、というようなレベルのものでも、

この通り。もっとも、ちょっと顔が小さすぎるので、LoRAの顔に似てるかな?という疑問符は付きますけどね。
それでも、この顔補正の威力はすごいと思います。
逆はどうか、と気になって、もともと顔としてOKな画像が、補正によって歪むことは無いかと見比べてみました(逆なの?)。
まずは、顔補正無し。

こちらが顔補正あり(Inpaint denoising strength = 0.4)。

若干、肌がつるっとした感がありますが、見た目にほとんど変化は無いかと思います。
つまりは、顔が小さくなる恐れがあるなら、ADetailerを有効にしておいて損は無い(手間が省ける)かな、と思います。もっとも、有効にした場合に全体の生成時間が延びますので、そこはバランスを考えて頂ければと思います。
Hires.fixでの拡大画像にも挑戦
これまで、SD1.5の強みを活かせる範囲で、512×512や、640×320といった、比較的小さな画像を生成してきました。もちろんSD1.5だからと言って、それより大きな画像が生成できないわけではありません。
…が、です。
SD1.5は 512×512前後の画像を中心に学習されていますから、1280×720のような大きな横長の画像を生成すると、高確率で構図破綻を引き起こします。

こんな感じで、複数の領域に同じ要素を繰り返して描くことが増えます。実際、同じプロンプト(1人を描画)で、6枚出力したところ、2人で生成されたのが5枚、3人で生成されたのが1枚、プロンプト通り1人だったのはゼロでした。
しかも、顔の領域が広くなっているはずなのに、6枚中4枚が顔の崩壊を起こしていているので、SD1.5で大きな画像は向いていない、となります。
ただ、それは、直接、高解像度で出力した場合の話です。
見出しにも挙げた「Hires.fix」を使用すれば、低めの解像度で生成した画像を一旦拡大し、その後に再描画して高解像度に仕上げることができます。つまりは、低解像度で構図を決めるので、このような構図崩壊は起こりにくい、というわけです。
というわけで、やってみましょう。(まずは、ADetailerはOFFで行います)
ベースの画像は640×360で設定し、Hires.fixのUpscaleを2倍にすることで、1280×720の画像にしよう、ということです。
Hires stepsは 12~15、
Denoising sterengthは、0.30程度が良いようです。
Upscalerは、R-ESRGAN 4x+ を使用しますが、4x-UltraSharpというのを入手して使用するのも良さそうです。

こんな風に、さきほどの直接1280×720の画像を生成した時とは違って、構図崩壊は発生していません。6枚描画して6枚とも、プロンプトの指示通り1人でした。
もっとも、構図崩壊は起こしていないですが、6枚中4枚が顔崩壊を起こしています。
2060 SUPERで、Hires.fixを有効にして、1280×720の画像を生成するのに要した時間は123秒。1枚当たりおよそ20秒ですから、それなりに時間を要します。でも、その3分の2が使えない画像、というのはちょっと残念ですよね。
というわけで、Hires.fix と ADetailer を併用して、無駄な画像生成をなくしてみたいと思います。
Hires.fix と ADetailer の併用
設定は単純に、両方の機能をONにするだけ。
同じく6枚の生成に要した時間は 2060 SUPERで139秒。1枚当たり23秒ほどですから、ADetailerでの増加時間は1枚当たり3秒ほど、ですね。でも、この効果は大きなものがあります。
顔補正OFFなら確実に顔崩壊を引き起こしているサイズです。

今回の6枚で最も驚いたのが、この画像。

Inpaint denoising strength = 0.55での補正なのですが、補正OFFにしたときの画像がこれ。

なにがすごいって、これだけの斜め向きの顔をほぼパーフェクトに補正しているんです。SD1.5のLoRAとして、完成形と言っていいんじゃないでしょうか。
細部のパラメータ調整
今回は、特に必要と感じなかったんですが、Hires.fix と ADetailer とを併用すると、生成画像が期待と異なったときに、どちらのパラメータを修正すればよいか、判りにくくなるかと思います。
そんな場合の目安を書いておきたいと思います。
| 症状 | 変更 |
|---|---|
| 全体が拡大しただけで精細感がない | Hires denoiseを0.33~0.35へ |
| 背景や服が変わりすぎる | Hires denoiseを0.25~0.28へ |
| 顔が直りきらない | ADetailer denoiseを0.45へ |
| 顔が別人になる | ADetailer denoiseを0.32~0.38へ |
| 顔だけ貼り付けたようになる | Mask blurを8、Paddingを64へ |
| 髪型まで変わりすぎる | Paddingを32、dilationを0~4へ |
| 小さな顔を検出しない | Confidenceを0.20~0.25へ |
| 背景の模様を顔と誤検出する | Confidenceを0.35~0.45へ |
これらを活用しながら、「顔の崩壊」に感じていたストレスを解消して頂ければと思います。
最後に、アイキャッチ用に生成した1枚で締めくくりたいと思います。
テーマは、夏の公園。
プロンプトは例によってChatGPT製です。
prompt
<lora:ai_model_v6-000060:0.80> ai_model_v6,
photorealistic, 1woman, japanese woman, waist up, from a slight distance,
more background visible, looking up at the sky,
gentle smile, white summer blouse, standing outdoors, park, green trees,
blue sky, natural light, hair moving in the breeze
negative prompt
anime, illustration, painting, cartoon, low quality, worst quality,
bad anatomy, bad hands, extra fingers, deformed face,
blurry face, close-up, face filling frame, multiple people, text, watermark, logo
元画像が720×360、ADetailer・Hires.fixありで、最終画像は1280×720で生成しています。
こちらは5070Tiでの生成ですが、24枚の出力で183秒、1枚当たり7.6秒ほどでした。
その中から、ベストな1枚を掲載したいと思います。

SD1.5のLoRAを作り直したことで以前のものより柔軟性が増しましたし、顔の崩壊を乗り越える方法も判ったので、まだまだ、SD1.5も実用的に使えるんじゃない?と改めて思いました。SD1.5なら、VRAM 8GBの2060 SUPERでも、十分に楽しめそうですしね。
Stable Diffusionの環境構築からLoRA作成、SDXLでの検証など、画像生成に関する記事一覧は、以下のまとめページに整理しています。



















