generated at
ReActorでFace SwapしたあとにInstantIDを使ってリファインする
ReActorの弱点
ReActorは128pxの画像しか作れないのでそもそも解像度が低い
それを補うべくCodeformerやGFPGANがあるけれど肌がのっぺりしてしまう
また、基本的に仮面をかぶせているだけなので立体感にも欠ける
これをInstantIDを用いたDetailerで補完する

画像 from Pexels

使用モデル

🟦ベース画像入力
🟧参照画像入力
Base画像が大きすぎた場合、短辺が2000pxになるようにリサイズ
元画像が大きすぎると自動的にSEGSも大きくなり、OOMになる
ReActorでFace Swap
一応GFPGANをマックスにかけて解像度を上げている
SEGS
YOLOを使ってSEGS作成
フィルターをかけて、一番大きな顔のみDetailerに流す
Detailer
SEGSに対してJoyTagllava-v1.6-mistral-7bでキャプション生成し、プロンプトとして使う
InstantIDを追加
そのうちControlNetの部分はSEGSに対してかける
リアルな肌にすべく、プロンプトやモデル・LoRAを使っているけれどまだちょっとプラスチック
サンプリングは2回回す
一回目はDenoise 0.4、二回目は 0.3
SEGSPasteノードでDetailerにかけたSEGSをリサイズされる前のBase画像に合成する

解像度が違うのでフェアではないけれどまつ毛とか口紅照りが綺麗になっているだけでなく、鼻の形等構造的な部分も改善している

補いきれないReActorの弱点
真上からみたいなきついアングルからの画像はReActorが反応しきれない
Baseはおでこを出しているけれど、Ref画像は前髪があったときなどは、ReActorがBase画像にも前髪をつけてしまう
Denoise 0.4では修正しきれない
良いことを思いついたnomadoor
この場面だけじゃなくて、ReActor用の整った正面画像がない場合は結構ある
代わりに画像が複数枚あるときは、まずInstantIDを使ったtext2imageで前髪もない整った正面絵を生成 → これを使ってReActor + Refineにかければいいんでない?
ウィンクや舌を出す等の大きく変化する表情変化についていけない
InstantIDだけならプロンプトでなんとかなるかもしれないけれど、ReActorを下書きにしているためウィンクが半開きになったりする
Base画像に色が引っ張られる
肌の色なんかはBaseの色に合わせてくれたほうが嬉しいので良いが、瞳の色も引っ張られる
そもそもReActorの時点で間違っているので、目だけ口だけのDetailerを回しても良いけれどちょっとworkflowが大きくなりすぎるのであんまりやりたくない

Q&A
InstantIDだけじゃだめなんですか?
Denoise 0.4程度だとBaseの顔の特徴が残ってしまう
かといってDenoiseを上げると、InstantIDで使っているControlNetは顔の向きや位置に関してはかなりルーズなので制御できずにおかしなことになる
SDXL用のControlNet mediapipefaceなんかがあればInstantIDだけでいけるかもしれない


とはいえ割と出来には満足しておりますnomadoor