Differential Diffusionとは?

通常の inpainting では、マスクの白い部分は変化し、黒い部分は変化しません。

では、グレーにすれば少しだけ変化するのか?というと、残念、想像するようなコントロールはそのままではできません。

そこで生まれたのが Differential Diffusion です。

マスクの濃度に応じて、場所ごとに denoise を変える ことが出来るため、場所ごとに変化量を変えたり、境界をぼかしたマスクを扱えるようになります。

inpainting をまだ読んでいなければ、先にご覧ください。


使い方

inpainting の workflow に Differential Diffusion ノードを追加し、マスクに濃淡をつけるだけです。

workflow

SD1.5_Differential_Diffusion.json
  • 🟩 Differential Diffusion ノードを追加
  • ベースは Set Latent Noise Mask ノードを使った workflow です。
    • もちろん、inpainting モデルや ControlNet モデルを使った workflow でも使えます。

マスクの白い部分ほど大きく変化し、黒い部分ほど「元の絵」を残します。


マスクの使い方

場所ごとに変化量を変える

マスクの濃さは、滑らかなグラデーションにする必要はありません。

一枚のマスク画像の中で、場所ごとに濃さを変える ことで、1 回のサンプリングで部位ごとに違う変化量を指定できます。

SD1.5_Differential_Diffusion_multi-obj.json
  • 変えたい部分ごとに、マスクの濃さを描き分ける(例: 顔は薄めのグレー、背景は白など)

境界をなじませる

inpainting のよくある問題として、マスクの境目がくっきり出てしまうことがあります。

Differential Diffusion と、ぼかしたマスクを組み合わせて、境界を自然になじませましょう。

SD1.5_Differential_Diffusion_blur.json
  • 🟪 今回は inpainting モデルを使った workflow に組み込みます。
  • 🟨 Gaussian Blur Mask ノード(ComfyUI-Impact-Pack)でマスクの境界をぼかす
    • ぼかすと実質マスクが小さくなるため、前処理として少しマスクを大きくしておきます。

深度マップをマスクとして使う

深度マップは白黒のグラデーションで表されます。
つまり、そのまま Differential Diffusion のマスクとして使うことが出来ます。

SD1.5_Differential_Diffusion_depthmap.json
  • 🟦 Depth Anything V2(comfyui_controlnet_aux)で深度マップを作成
    • これは IMAGE なので Convert Image to Mask ノードでマスクに変換します。
  • RemapMaskRangeComfyUI-KJNodes)で濃淡を調整

正直、SD1.5 では性能が足りないのですが、深度マップをマスクとして使うこと自体は、お気に入りの方法です。


サンプル画像