Stable Diffusion で人物を描くと顔が崩れがちです。

そういう場合は CodeFormerGFPGAN 等で補正をかける (AUTOMATIC1111 版 Web UI だと Restore faces にチェックを入れるだけでOK) のですが、全身像のような引きの絵で顔が小さめでぐずぐずに壊れている場合は補正が効きません。

今回は、そんな状況をどうにかするカスタムスクリプト Face Editorの紹介です。

Face Editor使用例

このスクリプトを使うと左側の「顔っぽいなにか」が右側の「ちゃんとした顔」になります。

利用の前提

  • AUTOMATIC1111 版 Web UI 専用のカスタムスクリプトです。
  • アニメ的にデフォルメされた顔の補正には不向きです。

セットアップ

  • face_editor.py をダウンロードして、stable-diffusion-webui の scripts フォルダに入れるだけです。

使い方

1. 顔補正したい画像を img2img で開く

基本的には画像生成時と同じ設定 (プロンプトやシード等) を使う方が自然な仕上がりになるため、 PNG Info タブで画像情報取得して img2img に送り込むのがおすすめです。

2. Face Editor を有効にして img2img を実行する

  1. scriptFace Editor を指定します。 screen-shot
  2. 必要に応じてパラメタ設定を行います。
  3. あとはいつも通り Generate ボタンをクリックして画像生成します。

動作の仕組み

このカスタムスクリプトは以下のステップを踏んで動作しています。

ステップ1

画像の中にある顔を検知します。 step-1

ステップ2

検知した顔を切り取って 512x512 に拡大します。 step-2

ステップ3

上記の顔画像に対して img2img を実行して新しい顔画像を作成します。 step-3

ステップ4

新しく作成した顔画像を元のサイズに縮小して、元画像のもとの位置に貼り付けます。 step-4

ステップ5

そのままだと顔画像の枠が残ってしまうため、顔の部分にマスクをかけてインペインティングを実行して画像全体になじませます。 step-5

完成

step-6

パラメタ設定

Maximum number of faces to detect (1-20)

ステップ1で検知する顔の最大数です。

一つの画像に複数の顔が存在するような画像において、検知する顔の数を減らしたいときに使用します。例えば、「小さすぎる顔は無視したい」といった時に役立ちます。また、検知される顔が多ければ多いほど処理に時間がかかるため、「とりあえず1つの顔だけ試してパラメタ調整したい」という際にも便利です。

Face detection confidence (0.7-1.0)

ステップ1での顔検知で、確信度 (「顔っぽさ」を示す数値) の閾値です。

数値を大きくすると判定が厳しくなり、数値を少なくすれば判定が緩くなります。 「顔じゃないものまで検知されてしまった」というような場合に使えます。

Face margin (1.0-2.0)

ステップ2で顔を切り取る際に、検知した顔の周囲のマージン (余裕) をどれぐらい取るかの指定です。

以下のように、この設定値によって新しく生成される顔の雰囲気が結構変わります。

face margin

Prompt for face

ステップ3で新しい顔を生成する際に使用されるプロンプトです。

これを指定しない場合は img2img で指定した通常のプロンプトがそのまま使用されます。

Denoising strength for face images (0.1-0.8)

ステップ3で新しい顔を生成する際に使用される Denoising strength 設定値です。

こちらも生成される顔の雰囲気に影響します。

strength: 0.4 strength 0.4

strength: 0.6 strength 0.6

strength: 0.8 strength 0.8

また、小さすぎる値を設定すると顔の崩れが補正されず、大きすぎる値を設定すると周囲の画像となじみづらくなります。

Mask size (0-64)

ステップ5でインペインティングを実行する際に顔にかけるマスクの大きさです。

size: 0 mask size 0

size: 10 mask size 10

size: 20 mask size 20

Mask blur (0-64)

ステップ5でインペインティングを実行する際に顔にかけるマスクのぼかしです。

Denoising strength for the entire image (0.0-1.0)

ステップ5でインペインティングを実行する際に使用する Denoising strength 値です。

指定する値が小さすぎると枠が残り、大きすぎると画像全体の雰囲気が変わり、マスク領域とほかの部分がなじみづらくなります。

(おまけ)カスタムスクリプトのつくり方

Python の経験がある人ならば、Developing custom scripts に記載されているコード例を下敷きにしてコメントを読みつつ書き進めるだけで、カスタムスクリプトは結構簡単につくれます。

ついでに Gradio のUI作りも体験できるので、おすすめです!