ComfyUI.Tokyo

SD15_object_remove+object_fill_in

Workflowの出展元 OpenArt Workflows

このワークフローは、以前に説明した基本的なInpainting(Remove)の概念をさらに洗練させ、特にマスクの処理とモデルへの情報伝達を最適化することで、より自然で継ぎ目のない結果を生み出しています。

ワークフローの全体像と主要な変更点

このワークフローの核心は、マスクのぼかし(Gaussian Blur)と拡張(Grow Mask)を複数回、異なる目的で適用している点、そしてInpaintModelConditioningノードの適切な使用にあります。

主要なノードとその役割は以下の通りです。

  1. CheckpointLoaderSimple (ID: 47):
    • 使用モデル: `SD15 Realistic_Vision_V5.1-inpainting.safetensors`
    • Inpaintingに特化したモデルをロードします。これはオブジェクト削除の成功に不可欠です。
  2. VAELoader (ID: 151):
    • 使用VAE: `SD1.5 vae-ft-mse-840000-ema-pruned.safetensors`
    • 高品質な画像エンコード/デコードを行います。
  3. LoadImage (ID: 130):
    • 元画像とマスクを読み込みます。マスクはComfyUI Mask Editorで削除したいオブジェクト(木)を白く塗ったものです。
  4. CLIPTextEncode (ID: 48, 49):
    • Positive Prompt (ID: 48): `(((grass field))), (8k, RAW photo, best quality, masterpiece:1.2),(realistic,photo-realistic:1.4),`
      • `(((grass field)))`: マスク部分を草原で埋めるよう明示的に指示しています。括弧を重ねることで強調しています。
      • '(8k, RAW photo, best quality, masterpiece:1.2),(realistic, photo-realistic:1.4)`:生成される画像の品質を極限まで高めるためのプロンプトです。
    • Negative Prompt (ID: 49): `text, watermark, embedding:ng_deepnegative_v1_75t, blurry, illustration,horror,`
      • `embedding:ng_deepnegative_v1_75t`: ネガティブプロンプトを強化するTextual Inversion(埋め込み)を使用しています。
      • `blurry, illustration, horror`: 生成されるべきではない要素(ぼやけ、イラスト調、不自然さ)を除外します。
  5. DifferentialDiffusion (ID: 51):
    • これは特定のInpaintingワークフローで使われることがありますが、Stable DiffusionモデルをInpaintingに適した形に微調整する役割を持つことがあります。このワークフローではCheckpointLoaderSimpleからKSamplerへの橋渡しとして機能しています。
  6. マスク処理ノード群 (GrowMask, ImpactGaussianBlurMask, InvertMask):
    • GrowMask (ID: 58): マスクを30ピクセル拡張します(`expand: 30`)。これは、マスクの縁が生成部分に食い込むのを防ぎ、より広い範囲で周囲との馴染みを持たせるためです。
    • ImpactGaussianBlurMask (ID: 53): 拡張されたマスクにガウシアンブラー(ぼかし)を適用します(`kernel_size: 100`, `sigma: 100`)。これは、マスクの境界を滑らかにし、生成される画像と元の画像の境目をより自然にするための重要なステップです。このぼかしは、InpaintModelConditioningノードに渡され、AIがマスク境界で滑らかに遷移するように学習するのを助けます。
    • GrowMask (ID: 133): 別のマスク拡張ノードで、元のマスクを60ピクセル拡張します(`expand: 60`)。
    • ImpactGaussianBlurMask (ID: 134): この拡張されたマスクに再度ガウシアンブラー(ぼかし)を適用します(`kernel_size: 30`, `sigma: 30`)。
    • InvertMask (ID: 132): ぼかされたマスクを反転させます。つまり、元の木のあった場所が黒くなり、それ以外の場所が白くなります。この反転されたマスクは、ImageCompositeMaskedノードに渡され、生成された画像と元の画像を合成する際に、マスクされた領域(生成された草原)だけを適用するためのものです。
  7. InpaintModelConditioning (ID: 52):
    • Inpaintingプロセスの中核を担うノードです。
    • Positive/Negative conditioning、VAE、元のピクセル画像、**ぼかされたマスク (ID: 53から)** を受け取ります。
    • `noise_mask` を `true` に設定している点が重要です。これにより、マスクされた領域にのみノイズが加えられ、マスクされていない領域の元の画像データは維持されます。そして、このノードは、ノイズが付加された潜在画像と、修正されたPositive/Negative conditioning(マスク情報を考慮したもの)をKSamplerに渡します。
  8. KSampler (ID: 50):
    • InpaintModelConditioningから受け取ったモデル、修正されたプロンプト、ノイズ付き潜在画像を使って、実際の画像生成(ノイズ除去)を行います。
    • `denoise` パラメータが `1` に設定されています。これは、マスクされた領域に対して完全にノイズ除去(再生成)を行うことを意味します。
  9. VAEDecode (ID: 54):
    • KSamplerで生成された潜在画像をピクセル画像にデコードします。
  10. ImageCompositeMasked (ID: 131):
    • 削除の成功における最後の重要なステップです。**
    • VAEDecodeによって生成された新しい画像(木が草原になった画像)を`destination`、元の画像(木があった画像)を`source`として受け取ります。
    • そして、反転されたマスク (ID: 132から) を使用して、生成された新しい画像(`destination`)のマスクされた領域(つまり、木が消えた部分)を、元の画像(`source`)のマスクされていない領域と合成します。
    • これにより、木が削除された部分だけが新しく生成された草原に置き換わり、それ以外の元の画像の部分は保持されます。この「マスクを使った合成」が、完璧な継ぎ目なしの削除を可能にする要因です。

なぜこれで完璧な削除ができたのか?

以前の試みで「うっすらとマスクの跡が残っていた」問題が解決されたのは、以下の要素が組み合わさった結果と考えられます。

  1. Inpainting特化モデルの使用:
    • `Realistic_Vision_V5.1-inpainting.safetansors`は、Inpainting用に最適化されているため、マスク境界での不自然さを最小限に抑える能力が高いです。
  2. プロンプトの具体性と強調:
    • ポジティブプロンプトで`(((grass field)))`と具体的に「草原」を指示し、さらに強調したことで、AIはより的確にその部分を草原として認識・生成できました。
    • 高品質を求めるプロンプトと、ネガティブプロンプトの強化(`ng_deepnegative_v1_75t`の使用)も、生成される草原のリアリティと自然さに貢献しています。
  3. 複数段階のマスク処理(特にGaussian Blurの多重適用):
    • `InpaintModelConditioning`に渡すマスクのぼかし: `ImpactGaussianBlurMask` (ID: 53) でマスク境界を大きくぼかすことで、AIはマスクの縁で急激な変化をするのではなく、より緩やかに周囲の背景に溶け込むように学習します。これが継ぎ目のない生成に最も効果的です。
    • `ImageCompositeMasked`に渡すマスクのぼかしと反転: 別の`ImpactGaussianBlurMask` (ID: 134) でマスクを再度ぼかし、`InvertMask` (ID: 132)で反転させることで、最終的な画像合成時に、生成された部分と元の画像の部分が物理的に重なり合い、色の馴染みが向上します。これにより、最終的な出力画像において、生成された部分と元の画像の境目が視覚的に認識されにくくなります。
  4. 'ImageCompositeMasked`による賢い合成:
    • このノードは、生成された新しい情報(木が消えた草原)と元の画像情報を、マスクを使って巧みに結合します。ただ上書きするのではなく、マスクのぼかしと連動して、非常に滑らかなトランジションを実現します。

これらの高度なマスク処理とInpainting特化モデル、そして適切なプロンプトの組み合わせが、一本の木が「まるで木がなかったかのように美しい草原」に完全に置き換わる、オブジェクト削除を上手に実現したと言えます。

workflow

SD15_object_remove+object_fill_in.json

部分削除埋込対象画像

Open MaskEditorで白く塗りセーブ

結果

応用例

  • 人物除去 → `"empty street"` などで自然に置換
  • 看板・電線消去 → `"blue sky"` や `"forest background"` で背景復元
  • 歴史写真の編集 → `"stone road"` などで時代補完

Gaussian Blur Maskノードは、その名の通り「ガウスぼかし(Gaussian Blur)」を「マスク」に適用する機能を持っています。これをガウス分布とノイズの観点から簡単に述べます。

ガウス分布とGaussian Blur Maskノード

  1. ガウス分布(正規分布):
    • ガウス分布は、釣鐘状の形をした確率分布です。中心に最も高い値があり、中心から離れるにつれて値が緩やかに減少していきます。
    • Gaussian Blurでは、このガウス分布の特性を利用して、画像の各ピクセルに「重み付き平均」を適用します。中心のピクセルに最も大きな重みを置き、周囲のピクセルには中心からの距離に応じて小さくなる重みを割り当てて平均をとります。
  2. Gaussian Blur Maskノードの機能:
    • このノードは、入力された「マスク」画像に対してガウスぼかしを適用します。マスク画像は通常、白(適用する領域)と黒(適用しない領域)で構成されています。
    • ガウスぼかしを適用すると、マスクの白い部分と黒い部分の境界が曖昧になり、グラデーション(階調)が生まれます。
    • 具体的には、白だったピクセルは周囲の黒いピクセルと平均化され、少し灰色がかった色になります。同様に、黒だったピクセルも周囲の白いピクセルと平均化され、少し灰色がかった色になります。この結果、境界が急激ではなく、滑らかに変化するようになります。
    • ノードのパラメータである`kernel_size`(カーネルサイズ)や`sigma`(シグマ)は、このガウス分布の「広がり」や「ぼかしの強さ」を制御します。`sigma`が大きいほど、ぼかしの範囲が広がり、より滑らかなグラデーションが生成されます。

ノイズとGaussian Blur Maskノード

Gaussian Blur Maskノードがノイズ除去や、Inpaintingにおけるマスク境界の馴染みに寄与するのは、以下のようなメカニズムによるものです。

  1. 境界ノイズの緩和:
    • マスクの境界がシャープなままだと、Inpainting処理の際にその境界部分で不自然なノイズやアーティファクト(生成物の乱れ)が発生しやすくなります。
    • Gaussian Blur Maskを適用することで、このシャープな境界を滑らかなグラデーションに変え、AIが生成する際に急激な変化に対応する必要がなくなります。これにより、境界部分でのノイズの発生が抑制され、より自然な画像のつながりが生まれます。
  2. 拡散モデルへの情報伝達の最適化:
    • Stable Diffusionのような拡散モデルは、潜在空間でノイズを加減しながら画像を生成・修正します。
    • Gaussian Blurによってぼかされたマスクは、AIに対して「この領域は完全にノイズで埋める(白に近い部分)のではなく、徐々に元の画像情報に戻っていく(黒に近い部分)ように処理してほしい」というニュアンスを伝えます。
    • これにより、AIはマスクされた領域に完全に新しい情報を生成する際にも、元の画像との自然な繋がりを考慮しやすくなり、結果として生成物と元の画像との境界が滑らかになり、不自然なノイズが減ります。

簡潔に言えば、Gaussian Blur Maskノードは、ガウス分布に基づいたぼかしをマスクに適用することで、マスクの「縁」を滑らかなグラデーションに変えます。このグラデーションは、AIがInpaintingを行う際に、マスクされた領域とそうでない領域の境界をより自然に、ノイズなく処理するための重要な「ヒント」として機能します。


Link

SD1.5 inpainting Remove

Big lama Remover オブジェクト除去