ComfyUI-RMBG を使った背景の消し方【ComfyUI】

ComfyUI-RBBG を使った背景の消し方 AIイラスト

今回は既存の画像から背景を消す方法の記録。

ComfyUIやカスタムノード、各種モデルにはそれぞれ利用条件が設けられているので事前に確認してください。

- PR -

ComfyUI-RMBGのインストール

既存画像から背景を消すことができるカスタムノードは幾つかあるが、今回は私が普段利用している ComfyUI-RMBG というカスタムノードを使った方法を書いておく。

GitHub - 1038lab/ComfyUI-RMBG: A ComfyUI custom node designed for advanced image background removal and object, face, clothes, and fashion segmentation, utilizing multiple models including RMBG-2.0, INSPYRENET, BEN, BEN2, BiRefNet models, SAM, and GroundingDINO.
A ComfyUI custom node designed for advanced image background removal and object, face, clothes, and fashion segmentation...

インストールについては Manager にリストアップされているカスタムノードなので探してインストールするだけ。インストール後は再起動を忘れずに。

ComfuUI-RMBG のインストール
ComfuUI-RMBG のインストール

Remove Background ノードで背景を消す

ComfyUI-RMBG を使いベーシックなワークフローを作成してみる。

Remove Background ノードの配置

空のワークフローに Remove Background ノードを配置する。

ComfuUI-RMBG ノードの配置
ComfuUI-RMBG ノードの配置
Remove Background (RMBG) ノード
Remove Background (RMBG) ノード

その他ノードの配置

次のノードを追加配置しそれぞれラインを結ぶ。

  • Load Image (画像を読み込む)
  • Convert Mask to Image (マスクを画像に変換)
  • Preview Image x2(画像のプレビュー)
ComfyUI-RMBG をを使ったワークフロー
Remove Background ノードを使ったワークフロー

ワークフローの実行

Model に “BEM2” を指定、他は初期値のままでワークフローを実行。

Model の指定
Model の指定

Remove Background ノードで扱えるモデルとそれぞれの特徴。(引用元

Model概要
RMBG-2.0複雑な環境でも高い精度 正確なエッジ検出と保存 優れた細部処理 1 つの画像で複数のオブジェクトをサポート 出力の比較 背景付き出力 動画のバッチ出力 このモデルは、15,000 枚を超える高品質画像の多様なデータセットでトレーニングされており、次のことが保証されます: 異なる画像タイプ間でバランスの取れた表現 さまざまなシナリオで高い精度 複雑な背景でも堅牢なパフォーマンス
※今回はエラーのため利用できなかった
InSPyReNet処理速度が速い 優れたエッジ検出機能 ポートレート写真や人物の被写体に最適
BEN速度と精度のバランスが良好 シンプルなシーンにも複雑なシーンにも効果的 バッチ処理に最適
(BEN: Background Erase Network)
BEN2精度と速度の向上 複雑なシーンの処理の改善 より多くの画像タイプをサポート バッチ処理に最適
(BEN: Background Erase Network)

その他のパラメータ。(引用元

パラメータ説明ヒント
Sensitivityマスク検出の強度を調整します。値が高いほど、検出が厳しくなります。デフォルト値は 0.5 です。画像の複雑さに応じて調整してください。画像が複雑であればあるほど、より高い感度が必要になる場合があります。
Processing Resolution入力画像の処理解像度を制御し、詳細とメモリ使用量に影響します。256 ~ 2048 の間の値を選択します。デフォルトは 1024 です。解像度が高いほど詳細度は高くなりますが、メモリ消費量も増加します。
Mask Blurマスクのエッジに適用されるぼかしの量を制御し、ギザギザを軽減します。デフォルト値は 0 です。より滑らかなエッジ効果を得るには、1 ~ 5 の間で設定してみてください。
Mask Offsetマスク境界を拡大または縮小できます。正の値は境界を拡大し、負の値は境界を縮小します。デフォルト値は 0 です。特定の画像に基づいて調整し、通常は -10 ~ 10 の間で微調整します。
Background出力背景色を選択アルファ(透明な背景)黒、白、緑、青、赤
Invert Outputマスクと画像出力を反転する画像とマスク出力の両方を反転する
Performance Optimizationオプションを適切に設定すると、複数の画像を処理する際のパフォーマンスが向上します。メモリに余裕がある場合は、より良い結果を得るために値を増やすことを検討してくださいprocess_res。mask_blurただし、メモリの使用量には注意してください。
Refine Foreground※v1.9.2で追加されたらしい:Added new foreground refinement feature for better transparency handling

結果

下図のようにオブジェクト(ここでは人物)と背景が分離され、オブジェクト(人物)だけが抽出された。

Remove Background (RMBG) ノードの実行結果
Remove Background (RMBG) ノードの実行結果

作成したワークフローのJSON。(コピーしComfuUI上でペーストすると読み込める)

JSON
{
  "last_node_id": 5,
  "last_link_id": 4,
  "nodes": [
    {
      "id": 5,
      "type": "PreviewImage",
      "pos": [
        1248.849853515625,
        569.9998168945312
      ],
      "size": [
        394.79998779296875,
        287.79998779296875
      ],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 4
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage"
      }
    },
    {
      "id": 2,
      "type": "LoadImage",
      "pos": [
        231.68592834472656,
        254.99559020996094
      ],
      "size": [
        315,
        314
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            1
          ]
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "Node name for S&R": "LoadImage"
      },
      "widgets_values": [
        "example.png",
        "image"
      ]
    },
    {
      "id": 1,
      "type": "RMBG",
      "pos": [
        582,
        254
      ],
      "size": [
        315,
        270
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [
        {
          "name": "image",
          "type": "IMAGE",
          "link": 1
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "IMAGE",
          "links": [
            2
          ],
          "slot_index": 0
        },
        {
          "name": "mask",
          "type": "MASK",
          "links": [
            3
          ],
          "slot_index": 1
        }
      ],
      "properties": {
        "Node name for S&R": "RMBG"
      },
      "widgets_values": [
        "BEN2",
        1,
        1024,
        0,
        0,
        "Alpha",
        false,
        "default",
        false
      ]
    },
    {
      "id": 4,
      "type": "MaskToImage",
      "pos": [
        943.5498046875,
        572.7002563476562
      ],
      "size": [
        264.5999755859375,
        26
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "inputs": [
        {
          "name": "mask",
          "type": "MASK",
          "link": 3
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            4
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "MaskToImage"
      }
    },
    {
      "id": 3,
      "type": "PreviewImage",
      "pos": [
        1243.85009765625,
        252.60011291503906
      ],
      "size": [
        402.5,
        268
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 2
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage"
      }
    }
  ],
  "links": [
    [
      1,
      2,
      0,
      1,
      0,
      "IMAGE"
    ],
    [
      2,
      1,
      0,
      3,
      0,
      "IMAGE"
    ],
    [
      3,
      1,
      1,
      4,
      0,
      "MASK"
    ],
    [
      4,
      4,
      0,
      5,
      0,
      "IMAGE"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 0.9090909090909091,
      "offset": {
        "0": -62.4090461730957,
        "1": -65.28305053710938
      }
    },
    "node_versions": {
      "comfy-core": "0.3.18",
      "comfyui-rmbg": "9a3517a2fe10d8d87f1360c707918dc2047fd7a3"
    },
    "ue_links": []
  },
  "version": 0.4
}
Expand

BiRefNet ノードで背景を消す

今度は BiRefNet (RMBG) ノードを使いワークフローを作る。

BiRefNet ノードの配置

空のワークフローに BiRefNet ノードを配置する。

BiRefNet ノードの配置
BiRefNet ノードの配置
BiRefNet (RMBG) ノード
BiRefNet (RMBG) ノード

その他ノードの配置

先程のワークフローと同様になるが、次のノードを追加配置しそれぞれラインを結ぶ。

  • Load Image (画像を読み込む)
  • Convert Mask to Image (マスクを画像に変換)
  • Preview Image x2(画像のプレビュー)
BiRefNet (RMBG) ノードを使ったワークフロー
BiRefNet (RMBG) ノードを使ったワークフロー

ワークフローの実行

ノードは初期値のままでワークフローを実行。

BiRefNet ノードで扱えるモデルとそれぞれの特徴。(引用元

Model概要
BiRefNet-generalバランスの取れたパフォーマンス
BiRefNet_512x512512×512解像度に最適化
BiRefNet-portraitポートレート/人物マットに最適化
BiRefNet-matting汎用マット
BiRefNet-HR最大2560×2560の高解像度
BiRefNet-HR-matting高解像度マット
BiRefNet_lite処理速度を上げる軽量版
BiRefNet_lite-2K2K解像度の軽量版

その他のパラメータは Remove Background と同様。

結果

Remove Background と同様の結果となった。

BiRefNet (RMBG) ノードの実行結果
BiRefNet (RMBG) ノードの実行結果

作成したワークフローのJSON。(コピーしComfuUI上でペーストすると読み

検出モデルの違い

ひとまず ComfyUI に同梱されていたサンプル絵(落書き・・・?)では上手く背景を消せたが、流石に(らくがき・・・??)なのでもう少し複雑な絵を用意した。これを使いそれぞれのモデルで背景削除をした結果を比較する。

用意した2枚の絵(リアル系とアニメ系)。

モデルごとの背景除去画像(リアル系)

この中では Real_01_RMBG-2.0Real_04_BEN2 がよさそう。モデルによっては刀まで消えてるが検知レベルや境界線などの調整もできるようなので色々試せば改善されるかもしれない。

モデルごとの背景除去画像(アニメ系)

アニメ絵だとやや Real_04_BEN2 が綺麗に切り抜いている感じはするが、全体的に髪の毛の隙間など細かい部分にゴミが残っていたりする。こちらもパラメータを調整すれば改善されるかもしれない。

その他の機能

今回は背景を消す目的で ComfyUI-RMBG を利用したが背景以外にも、顔のパーツを切り抜ける Face Segment ノード や、服や靴などそれぞれの衣装を切り抜ける Clothes Segment ノード などもある。

記事の目的から逸れるので詳細は割愛。とは書いたもののワークフローの作りは今回の応用だし、ノードの操作等も直感的な作りになっているので触ればわかると思う。詳しく知りたければ作者のリポジトリを参照。ノードの説明以外にもサンプルワークフローが公開されている。

さいごに

というわけで、画像から背景を削除する方法でした。

今回は私が普段使っているカスタムノードを利用したが、これが “いっちゃんいい” わけでもないと思うし、冒頭でも述べたが同様の機能をもつカスタムノードは他に幾つも存在する。それらを色々と試してみれば自分に合ったものが見つかるかもしれない。

コメント

タイトルとURLをコピーしました