🦊inpainting
🏠 | 🦊雑に学ぶComfyUI
👈 | 🦊image2image
👉 | 🦊outpainting
inpaintingは画像の一部分のみを編集するタスクですが、細かく見ると2種類に分けることができます
1. マスクされた部分のみのimage2image
2. マスクされた部分を周りの情報をもとに埋める
1. マスクされた部分のみのimage2image
https://gyazo.com/3b4d37c9bb4a46d514f2fc77234718f8
SetLatentNoiseMask.json
🟩シンプルなimage2imageのworkflowにSetLatentNoiseMaskノードでマスクを追加するだけです
マスクを作る方法はいろいろありますが、まずは以下の方法を
画像上で右クリック → Open in MaskEditor からペンで塗りつぶし → Save to node
https://gyazo.com/f8509abf64985a00066d18daa6c5bbda
他 → 🦊マスク操作
2. マスクされた部分を周りの情報をもとに埋める
周りの情報をもとにinpaintingとはどういう意味なのでしょうか?
さて、試しに上のworkflowのdenoiseを1.00にしてみましょう
https://gyazo.com/51ded9dd3f6c933e4f8b2f35fb37957fhttps://gyazo.com/da4aaecca947510887be73d7e729c3a3
うわぁぉホラー画像
これはマスク部分(右画像)をキャンバスにしただけのtext2imageに近いです
そのため、画像全体として一貫性のある画像はできません
これでは困りますね、全体の雰囲気を見つつ、マスクされた部分を描いてもらう方法はないでしょうか?
inpaintingモデルを使う
一番簡単なのは、このようなタスクに特化したinpaintingモデルを使うことです
モデルのダウンロード
https://huggingface.co/runwayml/stable-diffusion-inpainting/tree/mainsd-v1-5-inpainting.ckpt
https://civitai.com/models/146028/sdxl-inpainting-01-official-reuploadsdxlInpainting01Official_v01-inpainting.safetensors
https://gyazo.com/1aae8934d37e87afab7afb8bbf83935c
inpaintingmodel.json
🟩inpaintingモデルにはマスクされた部分だけでなく、全体の画像も一緒に渡さないといけないのでInpaintModelConditioningノードを使います
髪の色を変えるくらいなら上のimage2imageでも対応できますが、なにかものを描き加えるといったimage2imageでは対応できない場面で真価を発揮します
https://gyazo.com/d0749b470961faaea05304345bc339bb
comparison.json
Inpaintingモデルのほかにも手法があるので見てみましょう
🦊FLUX.1 Tools
Fluxの開発元からinpaintingモデルのようなものが発表され、かなり高いクオリティでinpaintingすることができます
→ 🦊FLUX.1 Tools#67505f16e2dacc0000f4653e
ControlNet Inpaintを使う
inpaintingモデルを使う方法の弱点は、inpaintingモデルを使わないといけないことです(当たり前)
ベースであるStable Diffuison 1.5ではなく、ファインチューニングされた好きなモデルを使いたい場合もあるでしょう
先取りになりますが、ControlNetを使うことでノーマルモデルでもinpaintigできるようになります
🪢カスタムノード
https://github.com/Fannovel16/comfyui_controlnet_auxcomfyui_controlnet_aux
モデルのダウンロード
https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/blob/main/control_v11p_sd15_inpaint_fp16.safetensorscontrol_v11p_sd15_inpaint_fp16.safetensors
$ ComfyUI\models\controlnet
https://gyazo.com/502405e34be5d221292df10ea3d6383e
ControlNet-inpaint.json
一番上で紹介したworkflowにControlNetを組み込みます
fooocus_inpaintを使う
Fooocusで開発された独自のinpaintingモデル(?)を使うという手もあります
ControlNetと同様、好きなモデルをinpaintingに対応させることができます
SDXLのみの対応ですが、SDXL用のControlNet inpaintモデルが存在しないためちょうど代わりとして使えます
実装された → ControlNet Union
🪢カスタムノード
https://github.com/Acly/comfyui-inpaint-nodesComfyUI Inpaint Nodes
モデルのダウンロード
https://huggingface.co/lllyasviel/fooocus_inpaint/tree/mainlllyasviel/fooocus_inpaint
ComfyUI\modelsにinpaintフォルダを作り、fooocus_inpaint_head.pthとinpaint_v26.fooocus.patchを置きます
https://github.com/Acly/comfyui-inpaint-nodes?tab=readme-ov-file#inpaint-models-lama-matInpaint Models (LaMA, MAT)
Model downloadをクリックしてLaMaとMATをダウンロード、上と同じinpaintフォルダに置きます
https://gyazo.com/3a6fdbbab073d6f9a50bfebee76963f6
inpainting_fooocus.json
🟨下処理として、LaMaを使ってオブジェクト除去
なくても良いのですが、境目が目立ってしまうためあった方が良いです
🟦fooocus inpaint専用のINPAINT_VAEEncodeInpaintConditioningノードが追加されています
中身としてはInpaintModelConditioningノードとVAEEncodeForInpaintノードが合体したものです
その他
LanPaint
余談: マスクされいない部分もちょっと変化している
https://gyazo.com/e05f241d54f599f35a04eee29531dca6https://gyazo.com/fb5434015e3ffb70c9ee38ce488ee114https://gyazo.com/b64c69f4f3e34630f5641cec3dae6c83
青がマスク部分 / 編集後 / 元画像とinpaint後の差分
少しでも変化のあったところは黒になりますが、マスクされた部分以外も黒くなって(変化してしまって)います
これはVAEのせいで、マスクされていない部分も編集はされませんが、VAEによる圧縮 → 解凍は行われます
VAEは非可逆圧縮なため、元の画像と全く同じにはならず多少変化します
これを防ぐには
https://gyazo.com/1e80ed86eb0f73155948eaf3927d2f93
inpainting_ImageCompositeMasked.json
最も簡単な方法がinpaintingした部分だけ、元の画像に合成することです
🟩ImageCompositeMaskedノード
https://gyazo.com/8cef72b63644ec356a77785eac8745f8
いつか解説するかもしれない
https://openart.ai/workflows/nomadoor/unsampler-concept-sliders-mask/HQ39IVs30g0OUobEPxHcUnsampler + Concept Sliders + MASK