Differential Diffusionとは?

通常の inpainting では、マスクは「白か黒か」の二択で扱われます。
少しでもグレーになると「マスクしていない」と見なされ、完全な白の部分だけしか inpainting してくれません。

Differential Diffusion は、マスクの濃度に応じて denoise の強さを連続的に変える ための仕組みです。
これのおかげで、場所ごとに変化量が異なる inpainting を一回のサンプリングで行うことができます。

inpainting を先に読んでいる前提です。
マスクの作り方は マスク操作AIを使ったマスク生成 を参照してください。


使い方

グラデーションマスクを用意し、inpainting の workflow に Differential Diffusion ノードを追加するだけです。

workflow

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

マスクの白い部分ほどプロンプトに寄り、黒い部分ほど「元の絵」を残します。


面白い使い方

部位ごとに変化量を変える

マスクはグラデーションである必要はありません。
一枚のマスクの中で、場所ごとに濃さを変える ことで、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 で深度マップを作成
    • これは IMAGE なので Convert Image to Mask ノードでマスクに変換します。

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


サンプル画像