セグメンテーションとは?
セグメンテーションというと実は色々な種類があるのですが、ComfyUIにおける文脈では、ポイントやBBOX、マスク・テキストで指定したオブジェクトの形のマスクを作る技術です。
マッティングとの違い
マッティングに似ていると感じるかもしれませんが、以下の大きな違いがあります。
ではマッティングがセグメンテーションの下位互換か、というと全くそういうわけではなく、そもそも役割が違います。
- 分類タスク寄りなセグメンテーション
- 透過表現も可能な高品質な切り抜きが出来るマッティング
SAM
Introducing Meta Segment Anything Model 3 and Segment Anything Playground
ComfyUIで「セグメンテーション」といったとき、実際に使われているのはほぼSAM(Segment Anything)系のモデルです。
任意の物体を切り抜く(マスクを作る)ことが目的といいましたが、そのためには、AI が「その物体の形」をある程度理解している必要があります。
例えば机の上にフルーツバスケットが置かれているとして、りんごを切り抜きたいと思っても、「りんご」の形を知っていなければどこまでをりんごとして扱っていいのかがわかりません。これを実現したのが SAM です。
主なモデル
-
SAM
- Meta発表の初期モデル。
- 任意の場所をクリックするだけで、その領域のマスクを返します。
-
HQ-SAM
- SAMをベースにマスク品質を高めた派生モデルです。
-
SAM 2 / 2.1
- 動画にも対応。動画の中で同じ物体を追跡しながらマスクを出力できます。
-
SAM 3
- テキストで対象を指定することが可能に。
- これまではポイントやBBOXで対象を指定する必要があったため、自動でマスクを作ろうと思うと物体検出と組み合わせる必要があった。
ComfyUIでの使いどころ
切り抜きからinpaintingに至るまで、あらゆる場面で使用します。
他にもSegment Anything Playgroundには、顔をぼかしたり、背景を白黒にしたりといった例がいくつもあります。(ちなみにこれらのほとんどをComfyUIで再現することが出来ます。)
{
"id": "4b187c42-2da1-496a-a366-425296ad7665",
"revision": 0,
"last_node_id": 6,
"last_link_id": 3,
"nodes": [
{
"id": 1,
"type": "SAM3Segment",
"pos": [
1214.0922282852516,
408.5050906781176
],
"size": [
340,
332
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 1
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
2
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
},
{
"name": "MASK_IMAGE",
"type": "IMAGE",
"links": []
}
],
"properties": {
"cnr_id": "comfyui-rmbg",
"ver": "2.9.4",
"Node name for S&R": "SAM3Segment"
},
"widgets_values": [
"elephant",
"sam3",
"Auto",
0.5,
0,
0,
false,
"Color",
"#00ff00"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 2,
"type": "LoadImage",
"pos": [
890.2198027426779,
408.5050906781176
],
"size": [
284.3745019136936,
480.4995078367626
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
1
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"download (3).jpg",
"image"
]
},
{
"id": 5,
"type": "PreviewImage",
"pos": [
1593.5901519141316,
408.5050906781176
],
"size": [
339.76234699530323,
478.45369114905793
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 2
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
}
],
"links": [
[
1,
2,
0,
1,
0,
"IMAGE"
],
[
2,
1,
0,
5,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1.015255979947714,
"offset": [
-790.2198027426779,
-308.5050906781176
]
},
"frontendVersion": "1.34.3",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
SAM 2.1以前はテキストでのオブジェクト指定ができなかったため、Grounding DINOやFlorence2といった物体検出と組み合わせて使用されることが多かったですね。
SAM 3はテキストでの指定もできますが、物体検出という意味ではSAM以上のモデルは今後も出ると思うので、このコンビネーションは覚えておきましょう。
補足:SAM以前のセグメンテーション
教科書的には、セグメンテーションには次のような分類があります。
インスタンスセグメンテーション (Instance Segmentation, 実例分割)
-
セマンティックセグメンテーション
- 各ピクセルに「クラスラベル」を付けます。
- person / sky / road / buildingなど。何人いようが、すべて「person」クラスとしてまとめて扱います。
-
インスタンスセグメンテーション
- セマンティックに加えて、「個体ごとのマスク」を分けます。
- person_1 / person_2 / person_3 …と個別に分割します。
SAMはこの2つを同時に行っているようなものですが、これらも自動運転や監視カメラの分野では今でも重要なタスクです。