🦊SEGS
🏠 | 🦊雑に学ぶComfyUI
👈️ | 🦊ComfyUI-Impact-Pack
👉️ | 🦊Detector
ComfyUI-Impact-Pack独自の概念にSEGSというものがあります
SEGSは、マスク、bbox、クロップ領域、confidence、label、ControlNet情報など、Detailerの操作に必要な情報を含む包括的なデータフォーマットです。
いろいろな情報がひとつにまとまっていて、マスクやBBOXとの違いが分からないと混乱してしまいます
一つ一つ丁寧に見ていきましょう
前提として便利なノード
SEGSPreviewノード
https://gyazo.com/dabf98325fbfdf6e356b4fdceb112c38
SEGSPreview.json
SEGSと元の画像を入力することで、SEGSが持つマスクやBBOX情報をプレビューすることができます
クロップ領域とは?
https://gyazo.com/e52ea814ccd051de4c939bb7e90eb941
マスクとの違いがわかりにくいかもしれませんが、上の画像のような関係性です
マスクやBBOXを基準に適当な余白を加えてクロップ領域にします
Detailerはこのクロップ領域のみで行うinpaintingです
BBOXとクロップ領域
https://gyazo.com/810cd1d5abd56101c3c466e101c68a49
BBOX.json
YOLOやCLIPSegで物体検出をしたときのBBOXとクロップ情報がSEGSとして出力されます
この場合はBBOXがそのままマスクとして使用されます
bbox_threshold
bbox_dilation
BBOXの範囲を大きくします
crop_factor
クロップ領域を大きくします
https://gyazo.com/73af8ac93e427d68b47f4f1643222da0
1にすると(🟩)BBOXちょうど、これを増やしていくと(🟨)マスクの周囲も範囲に含まれるようになる
inpaintingモデルを使うときは周囲の情報も欲しいためcrop_factorを大きくしたほうが良いでしょう
drop_size
主に🦊Detailer_複数の対象のときに使いますが、小さすぎるBBOXを無視します
SEGMとクロップ領域
https://gyazo.com/09aea08bb558c0fe5aa8cada84993c57
SEGM.json
上のworkflowにSAMを加えると、BBOXの範囲内にあるオブジェクトをセグメンテーションします
つまるところ対象が顔なら、顔の形に合わせて切り抜きされます
post_dilation
マスクの形そのまま大きくなります
https://gyazo.com/667231cdda003f55624a053ae247e324
MaskToSEGS
上2つで使ったImpactSimpleDetectorSEGSノードはYOLO + SAM、もしくはCLIPSeg + SAMの組み合わせでしかSEGMを作れません
マスクを作る方法は他にもあります
手動、HQ-SAM + DINO etc.
そこで、マスクからSEGSに変換するMaskToSEGSノードというものが用意されています
手動マスク
https://gyazo.com/4f148df7de86626746ec3d6d8107db2f
MaskToSEGS-hand.json
combined
離れた位置にマスクがあった場合、MastToSEGSは自動で2つのSEGSに分割します
combinedをenabledにした場合は、離れていても一つのSEGSとして出力します
https://gyazo.com/17c33a2742df5b8e6951bd629ca7cbd2
crop_factor
クロップ領域を大きくします
bbox_fill
マスクが全部埋まるように矩形のマスクを作ります
https://gyazo.com/52cb9e12f47dc9054f8ca4b643faf36f
drop_size
この値より小さなマスクは無視されます
https://gyazo.com/24091cca46595d37f99a9a6f8548a069
contour_fill
ドーナツのようにぐるっと取り囲むマスクがあったとき、中空の部分も埋めます
https://gyazo.com/0f937efffea10bad9f94c32bd5b012c3
SEGS_ELT
上に説明したように、SEGSは色々な要素がまとまったパッケージでした
SEGSを構成する要素ひとつひとつのことをSEGS_ELT (Segment Element)といいます
領域の座標(bbox / crop_region)
検出ラベル(例: face, person)
信頼度(confidence)
切り抜かれた小画像やマスク
SEGSからSEGS_ELTを取り出すことで、それぞれの要素を個別に編集できます
SEGS_ELTを取り出す
https://gyazo.com/f4d375250212c2126e922baa810598cb
Decompose (SEGS).json
Decompose (SEGS)ノードでSEGSをSESG_HEADER(全体情報と)SEGS_ELTに分解します
From SEG_ELTノードでSEG_ELTに紐づいた個々の要素を取り出すことができます
SEGS_ELTを再びSEGSに統合する
編集した後、Detailerなどの処理に流したい場合は再びSEGSに戻す必要があります
https://gyazo.com/7ec2715d3916c349b2836bf930b029df
Assemble (SEGS).json
Edit SEG_ELTノードで要素をまとめ、Assemble (SEGS)ノードでSEGSに統合します
SEGSPaste
https://gyazo.com/83194cb755305c515459343d02a66642
SEGSPaste.json
🟨SEGSPasteノード
編集されたSEGSを、元の画像に合成します