Stable Diffusion で崩れがちな顔をどうにかするエクステテンション Face Editor ですが、前回の記事を書いた後にさらにいくつかの機能追加と改善を実施したので紹介します。

改善内容

今回の改善は以下の4つです。

  1. 複数の顔がある画像の改善
  2. 顔の輪郭部分の違和感軽減
  3. PNGファイルへの設定情報保存と復元
  4. 顔生成時のサイズ調整機能追加

順番に説明していきます。

(1) 複数の顔がある画像の改善

「同一の画像内に複数の顔があり、その顔の距離が近い場合に片方の顔が崩れる」という問題が解決されています。

実際の画像で解説します。例えば「久しぶりに再会した姉弟が記念に自撮りした」という場面で画像を作ります。

加工前

何も加工しないとこんな感じです。これはこれで雰囲気はあるんですがやっぱり顔をどうにかしたいですね。 ということで Face Editor を有効にして再度生成しなおすとこんな感じになりました。

加工後

お姉さんの方は問題ないのですが、弟くんの方は事故というか何かヤバめのおじさんに取り憑かれた感じになってます…

何でこういうことが起こるかというと、弟くんの画像を生成した後にお姉さんの画像を生成するのですがその際に気を利かせて弟くんの顔も半分ぐらい適当に生成してそれで上書きしちゃうからなんです。 こんな時は “Use minimal area for face selection” にチェックを入れます。

Use minimal area for face selection

こうすることで、各人の顔をギリギリのラインで切り貼りしてくれるようになり、結果として画像どうしの干渉がなくなります。

有効化後

できました。弟君の顔からヤバめのおじさんが消え、「存在感薄めの弟」という雰囲気を醸し出すいい感じの顔になりました。


余談ですがこれぐらい2人の顔が近い場合、この設定を行っても画像が壊れることがあります。

これは「AIが画像検出時に三つめの顔を認識してしまう」という原因で起こります。この画像の例でいうと「姉の左目と弟の右目を両目とみなして二人の顔の半分ずつを合成して一つの顔として認識してしまう」という現象です。これが出た場合は Face detection confidence (顔検出時の確信度) を高い値 (例: 0.99) に設定すると三つめの顔が認識されなくなり、改善されます。

あともう一つ余談ですが、想定通りの画像にならない場合は Show intermediate steps にチェックを入れて再生成してみるのがおすすめです。生成された各人の顔画像やマスクのカバー範囲を目視できるので、問題の原因分析やパラメタ調整に役立ちます。

(2) 輪郭部分の違和感軽減

顔の輪郭に違和感が残ってしまう画像ができることがあります。

輪郭に違和感がある画像

この画像の顎のあたりをよく見ると線のようなものが見えます。

このような状況を改善するために “Mask blur” というオプションが以前からあったのですが、これまでは期待通りに働いていませんでした。今回はこの機能を改善し、それにともなってデフォルト値を従来の 0 から 12 に変更しました。デフォルト値設定のままで生成すると以下のようにきれいに線が消えます。

輪郭がきれいになった画像

(3) PNGファイルへの設定情報保存と復元

Stable Diffusion の他の設定と同様に、Face Editor の設定値もPNG画像中に埋め込んで「Sent to txt2img」ボタンなどから復元したい、というリクエストに応えました。

実はこれ私も前々からほしいなとは思ってたんですが「どうせこんな機能ほしがるの自分だけでしょ」と思って放置してました。ところが今回「ほしい!」というひとがあらわれたので「それならばー」ということで実装しました。

(4) 顔生成時のサイズ調整機能追加

Face Editor は検出した顔を 512x512 ピクセルに拡大して img2img で再作成しています。 その仕様に対して「検出した顔画像のサイズが 512x512 ピクセルよりも大きい場合は再生成したらむしろ劣化するんじゃないの?」という疑問があがってきました

こちらに関しては「そういわれてみるとそうかもだけど実験してみないとわからないな」という感じだったので実験用に以下の二つのオプションを追加しました。

  • Size of the face when recreating: 顔生成時のサイズを 512 以外に変更できる
  • Ignore faces larger than specified size: 検出した顔が上記のオプションで指定したサイズ以上の大きさであれば顔の再作成をスキップする

このオプションを使って実際にいろいろ試した感じだと、512より離れれば離れるほど (小さくても大きくても) イマイチな画像になる感じはしました。

まとめ

以上、この一週間で追加した機能を紹介しました。

ふりかえると「これまでやりたかったけどできてなかったことができるようになった」という感じで結構重要なアップデートができたなという印象です。

引き続き GitHub の Issue ではリクエスト受け付けております。「要望出したいんだけど英語はちょっとハードル高い…」という方は Twitter (@kawakamishin1 ) の方に投げてもらっても大丈夫です。

ちなみに GitHub の方はいちおう英語でやり取りはしてますが、リクエスト出してくれてるひとたちの大多数は中国の方ですし、私も DeepL 翻訳とか ChatGPT とか使って機械的に英文読解&英作文してるだけなので「この英文で大丈夫なんだろうか..?」あたりに関しては気にせずどうぞ。もちろん Pull Request も歓迎です!

かわかみしんいち。島根県津和野町在住のフリーランスエンジニア。複合現実(Mixed Reality)と3DUXでおもちゃを作るのが趣味。 https://github.com/ototadana