🦊切り抜き
🏠 | 🦊雑に学ぶComfyUI
👈️ |
👉️ |
書き直しましたnomadoor.icon
→🦊AIによるマスク生成
このページは少し情報が古いかも
画像から特定のオブジェクトだけ切り抜いたり、背景除去したりするタスクです
ComfyUIで使われているものにはセグメンテーションとマッティング(matting)の二種類があり、細かいこというと別物なんですが面倒くさいのでまとめて"切り抜き"と呼びます
ComfyUIにおける透過画像の仕組み
🦊マスクとアルファチャンネルの復習ですが、ComfyUIでは透過画像は"RGB画像 + マスク"で構成されます
そしてマスク画像は黒背景に白で描かれ、白い部分がマスクされ(残り)ます
🚨混乱ポイント
Join Image With Alphaノードを使うと"RGB画像 + マスク画像"を透過画像に変換できるのですが、ややこしいことにマスクの白と黒の役割が逆です
https://gyazo.com/ea8f74e75643d8f9f190ab24a3fa7995
実装ミスだと思っているけれど正しい動作なんだろうか?nomadoor.icon
そもそも透過画像ロードしたときにできるマスクの白黒が逆じゃない?
Issueチャンスwogikaze.icon
投げてみたけれど優先度は低そうだnomadoor.icon
そうか、黒い部分は編集せず、白い部分は編集される → 白い部分にアルファチャンネルを付加する、だからこれでいいのか
なんにせよ、InvertMaskノードを使ってマスクを反転させることで、正しい透過画像を得られます
切り抜きというのはこのマスク画像をいろんな方法で作るという作業です
手動
やはり頼れるのは己の手のみ
https://gyazo.com/c79966751014c9b4cbd1d6138fa752a1
MaskEditor.json
画像を右クリックして出てくるメニューのOpen in MaskEditorをクリックするとエディターが出てきます
ペンで描いて右下のSave to nodeをクリックするとマスクとして保存されます
マッティング (matting)
"前景"と"背景"をグラデーションのあるマスク(alpha matte)で区切ります
とてもいろんな種類があり、それを動かすカスタムノードも無限にあります コマッタネ…
BiRefNet
BEN2
isnet
...
🪢カスタムノード
https://github.com/1038lab/ComfyUI-RMBG1038lab/ComfyUI-RMBG
現状ではオススメnomadoor.icon
https://gyazo.com/55b25e2c8f975db677719c7544caa4dd
RMBG_BirefNet.json
セグメンテーション (segmentation)
画像の中から物体の"形"を白と黒のマスク(バイナリマスク)で抽出します
🪢カスタムノード
ComfyUI-Impact-Pack
https://gyazo.com/f8e4ac73f372dce2e4e2f37d052296ca
画像を右クリックして出てくるメニューのOpen in SAM Detecterを押すとEditorが出てきます
SAMは物の形を潜在的に理解しているので、髪に点を打ては髪全体が、追加で顔に点を打てば頭全体がマスクになります
左クリックでマスクにしたい部位、右クリックでマスクにしたくない部位に点を打ちます
カテゴリ駆動の切り抜き
すでに用意されたカテゴリの形でセグメンテーションします
人の部位、服に関するものが多いです
🪢カスタムノード
https://github.com/1038lab/ComfyUI-RMBG1038lab/ComfyUI-RMBG
https://gyazo.com/4e66dc65949ac423c5357d46ba4a59d8
RMBG_Clothing_Segmentation.json
他にもFace / Fashion / Body Partなどがあります
プロンプト駆動の切り抜き
テキストで指示したオブジェクト(例えばリンゴ、車、顔 etc.)を探しだして切り抜きます
いくつかの手法があります
CLIPSeg
CLIPの知識を使って任意の言葉でセグメンテーションします
🪢カスタムノード
https://github.com/biegert/ComfyUI-CLIPSegComfyUI-CLIPSeg
https://gyazo.com/86c239b7edf6712f76123b0059244705
CLIPSeg.json
とても粗いので切り抜きとして使うことはほとんどありません
YOLOの代わりに物体検出として使うことがあります
HQ-SAM + Ground DINO
テキストで指示すると、画像内のそのオブジェクトを選択してくれるGround DINOと SAMの進化版であるHQ-SAMを組み合わせます
🪢カスタムノード
https://github.com/storyicon/comfyui_segment_anythingComfyUI Segment Anything (🚨とても古い)
https://github.com/1038lab/ComfyUI-RMBG1038lab/ComfyUI-RMBG (🚨たぶんGrounding DINOのインストールに失敗する)
https://gyazo.com/08100911d5aab2ff295516a96935e18f
HQ-SAM.json
dogと入れれば犬が、cupと入れればカップのみが切り抜きされます
🟩SAMModelLoader (segment anything)ノードで呼び出せるSAMモデルはいくつかあるのですが、もちろん容量が大きい方が性能がよく、かつsam_hq_vitのようにhqとつくものはHQ-SAMで細部の切り抜き精度がグンと上がります
めちゃめちゃ使うnomadoor.icon
Florence-2 + Segment Anything Model 2
統合VLMであるFlorence-2はOCRやVQAなどいろんなことができるんですが、Ground DINOと同じように、テキストで指示した物体の位置をBBOXで教えてくれる物体検出をすることもできます
🪢カスタムノード
https://github.com/kijai/ComfyUI-Florence2?tab=readme-ov-fileComfyUI-Florence2
https://github.com/kijai/ComfyUI-segment-anything-2ComfyUI-segment-anything-2
https://gyazo.com/d5e2589191a86ef939137634bc33ec0c
Florence-2 + Segment Anything Model 2.json
Florence2Runノードのtext_input欄に検出した物体名を入れ、taskをcaption_to_phrase_groundingにします
検出した物体が2つ以上会った場合(e.g. 上の画像ではfaceが2つある)
Florence2toCoordinatesノードのindexに0 ~ nの数値を入れて指定します
全部まとめて一つのマスクとして出力したいときはどうしたらいいんですか…?nomadoor.icon
動画の切り抜き
Segment Anything Model 2の真価は動画で目的のオブジェクトを追跡してセグメンテーションできるところにあります
上のFlorence-2 + Segment Anything Model 2を動画へ拡張してみましょう
https://gyazo.com/0917ed6ad7a32b1b9b35df242639d038
ImageFromBatchノードで動画の一番最初のフレームを取得します
🟪Florence-2で最初のフレームから(今回は)"human"で物体検出します
🟩あとは動画用のSAM2ノードに繋いでいくだけですが、DownloadAndLoadSAM2Modeノードのsegmentorをvideoにするのを忘れずに
SAM2は動画の最初のフレームで位置を指定してあげれば、2フレーム目からは自動で追跡してくれます
Florenceを使わずに手動で位置を指定する方法もありますが、まだPointsEditorノードの使い勝手が悪いので保留
(Archive)🦊切り抜き