見出し画像

StableDiffusionで表情差分を作りたい(automatic1111+フォトバッシュ編)

はじめに

 前回は首から上を書き換えたり、のっぺらぼうに顔を描かせてパーツ取りしようとしたが、色々調べてみるとautomatic1111には「Inpaint at full resolution」という機能があり、それを使えばマスクした部分を拡大して描き直して埋め戻すという、前回の首から上の差し替えをUI内でやってくれる機能があったらしい。
 というわけで、それを使って表情差分を作ってみたいと思う。

表情差分を作ってみる

 まずは適当にベースとなる画像を生成する。

これをベースにする

 次に、この絵をinpaintに送って、顔の部分をマスクして「Inpaint at full resolution」にチェックを付け、プロンプトに表情を表す単語を追加してガチャする。

inpaintで顔だけ作り直させる

 Inpaint at full resolution は、マスクした箇所を512x512に拡大してプロンプトを実行し、結果をマスクした場所に描き戻す機能だ。
 Inpaint at full resolution padding, pixels は設定数値によって結果が変わるのだが、正確な動作はよくわかってない。とりあえず範囲に反比例した数字を入れるとちょうどよくなりやすい気がする。

怒った顔としてのガチャ結果

 出力結果を見る感じ、前回の首から上を切り抜いて顔を塗りつぶしたやつと似たような出力結果になるようだ。
 キャラを維持する必要がなければ、例えば全身を描かせて顔が崩れた絵に対して、顔だけ描き直させることができるので、非常に使える機能だが、キャラを維持するためには、結局そのままでは使えないような感じだ。
 ということで、この結果を使って表情差分を作ってみる。

絵が描けない人はフォトバッシュ

 絵が描けるなら、輪郭だけ使って目だけ描き直すでも十分使えると思うが、絵が描けない場合はフォトバッシュしていく。
 まずは元絵を、顔の下地、目、前髪のパーツに分解してレイヤー分けをする。
 投げ縄ツールなどでざっくり拾って新しいレイヤーに配置し、不要な部分は消しゴムツールで消す。顔はスタンプツールやエアブラシで塗りつぶす。

前髪と目のレイヤ
顔の下地レイヤ

 このように、顔の下地は目を切り抜いて、目のあった場所は肌色で塗りつぶしてのっぺらぼうにする。こうすることで、他の目を配置したときに困らない。
 同じように、移植する切り抜き先の目だけをコピーして、レイヤを作って配置する。(配置する際に拡大縮小回転でいい感じの位置に合わせる)
 そうして単純に合わせたのが次の画像になる。

目だけ移植した版

 普通の表情差分のように、目だけ入れ替えたバージョンなので輪郭も髪型もブレないし、長髪でも問題なく差し替えられる。
 ただ、このままだと目の色が完全に別人なので元の絵の目を切り抜いて、新しい目に移植してみる。

元絵の目を投げ縄でコピー
新しい目に合わせて縮小貼り付け

 そのようにして目を移植し、目の下にある肌色が切れている部分をスタンプツールで調整して完成したのが次の絵となる。

色々調整して一旦完了

 だが、見てわかるように合成部分がかなりジャギジャギで浮いてしまう。ちゃんと調整すれば自然になるとは思うが、ここもAIを使ってなじませたい。
 というわけで、この絵をimg2imgする。プロンプトに「same color eyes」を追加し、元絵をほぼそのままにして欲しいのでDenoising strengthは0.1でガチャした。

ガチャした結果

 似たような瞳の色になったら完成。

差分を並べてみる

 思いつきでやった割には、結構上手く差分ができた気がする。かかった時間は1時間ちょっと。
 差し替えをもうちょっと簡略化する方法があればもっと早くできるかもしれないが、ひとまず絵が描けなくてもキャラを維持して差分を作れそうなことは分かったので、一旦ここまでにする。

この記事が気に入ったらサポートをしてみませんか?