ComfyUIを利用した背景差し替え
目的
既存の画像から人物だけ切り出し、任意の背景にさしかえる。
本文の前提
ComfyUIがある程度使えること → 基本的な使い方を覚えてくること
ComfyUI Mangerがインストールされていること → カスタムノードの管理に必要 参照
以下のカスタムノードをインストールすること
ComfyUI's ControlNet Auxiliary Preprocessors(ここではdepth zoeを使う)
ComfyUI WD 1.4 Tagger(デフォルトのモデルは自動で落としてくれる)
ComfyUI-Advanced-ControlNet(ここではdepthを使う)
segment anything (これが一番のキモ) (参考:https://note.com/yas_bizdev/n/n5244aebd98e3)
上記カスタムノードで必要なモデルをダウンロードしておくこと(カスタムノードによっては自動ダウンロードするものもある)
SDXLのモデルを複数用意すること。このロジックはpony系は背景生成が弱く人物が追加されてしまうため、オリジナルsdxlなど、背景のみが作成しやすいモデルを使うことが前提になる。
注意事項
本稿は元画像が作成された状態から始める(自作画像でも写真でも良い)――txt2imgからチェインしたら何故かコケたので
基本的な考え方
人物を切り出す → segment anythingを使う
切り出した画像からマスクを作成する
背景の元からControleNet用のベースを作成し、2. で作成したマスクを適用することで人物を加味した背景を作成する
1.で切り出した人物画像と3.で作成した背景画像を合成する
人物と背景の境にジャギーがのるため、i2iを弱くかけてなじませる
Segment Anything
Segment Anythingは、メタの画像セグメンテーションAIである。実際になにをするかと言うと指定したオブジェクトの切り出しになる。
Segment Anythingにhuman(もしくはperson)と入力すると人物だけが切り出される。つまりSegment Anythingを使うと人物が簡単に切り出せる。人物以外の小物を追加したい場合は、その小物の名前を追加する。慣れてしまえば割と簡単。
基本フロー
同時にマスクを生成する。この段階では、そのままのものと反転したものの両方を用意しておくとあとで使いやすい。うまく切り出せない場合は、threasholdを調整すること (一般的には0.2-0.4が推奨されている)
人物ではなく他のものを切り出してみたいと思う。試しに花瓶と花を指定する。
――と言う感じにSegment Anythingを使うと簡単に画像の切り出しが出来る。
次に背景との合成を行うが別の画像を使う(謎のこだわり)
背景の作成
promptに人物が入らない様にする必要があるため、pony系やanimeginなどのモデルはむしろ向いていない。sdxlの方が向いているかも。ここではControl Netを使用している。画像のwidthとheightは、元画像から抽出したものを作成しLatentを作成している(見切れた)
maskに、先程切り出したmaskを反転して入力しているがこれに意味があるのか忘れた。
画像の合成
作成した背景と切り出した人物を合成する。ここで使うのがLatentCompositeMaskedと言うノードになる。このノードは2つのLatentを合成するときに使う。distinationに背景、sourceに人物を入力し、maskに反転マスクを適用すると背景の上に人物が適用される。
クリーンナップ
しかしこの画像は切り出しのゴミや境目の部分にジャギーが載っている。
そこでかるくimg2imgをかける事でクリーンナップを行う(強すぎると絵が変わってしまう)
ここでは人物のpromptをWD14 Taggerで抽出し、背景プロンプトと合成したpromptをサンプラーに渡している。人物自体が変わってしまうためstrengthは余り強くない方が良い。この部分、境界部分だけに適用できると楽なのだが切り出しが面倒なので適当に誤魔化している。
表情が若干変わる……
元画像のスカートが一部欠けているので先に修正した方が良かったな。
おまけ
マスクのサイズを調整するにはimage→postpprocessingの下にあるImageMorphologyノードを利用する。mask→ mask2image → ImageMorphology → image2mask → maskで行ける。このフィルターが何やっているかと言うかと言うと下の通り。
コメント