Files
my-vault/自动语义分割系统/ComfyUI 搭建操作指南.md

421 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: ComfyUI 视频分割系统 - 界面搭建操作指南
date: 2026-04-22
tags:
- comfyUI
- 操作指南
- SAM2
- 工作流搭建
---
# ComfyUI 视频分割系统 - 界面搭建操作指南
> 前置假设:你已安装以下节点包。如未安装,请先通过 ComfyUI Manager 安装:
> - `ComfyUI-Manager`(管理器本身)
> - `ComfyUI-VideoHelperSuite`(视频加载/保存)
> - `ComfyUl-segment-anything-2`SAM2 分割,推荐 kijai 版)
> - `ComfyUI-Impact-Pack`Grounding DINO / 检测器)
> - `rgthree-comfy`Fast Muter / Bypass 节点)
> - `cg-use-everywhere`CG Use Everywhere无线广播连线
---
## 第一步:打开节点添加菜单
在画布空白处 **双击鼠标左键**,或 **右键单击空白处** → 选择 `添加节点`
你会看到一个分类菜单(如 `image`, `video`, `SAM2`, `rgthree` 等)。
---
## 第二步:搭建视频输入端
### 2.1 加载视频
1. 右键/双击空白处打开节点菜单
2. 在第二级菜单中找到 **Video Helper Suite**(带有紫色摄像机图标的那一项)
3. 在右侧弹出的第三级菜单中,根据你的需求选择以下任意一个节点:
- **Load Video (Upload)**:如果你想从电脑本地上传一个视频文件
- **Load Video (Path)**:如果你想通过输入电脑上的文件夹路径来读取视频
4. 点击创建节点
5. 节点出现在画布上,把它拖到左上角区域
### 2.2 提取第一帧(关键帧选择器)
1. 回到 **Video Helper Suite**(紫色摄像机图标)的第三级菜单
2. 找到 `图像` 分类下的 **`Select Images`**
- 在较新版本的 Video Helper Suite 中,它取代了旧版的 `VHS_SelectFrames` 名称功能完全一致都是通过索引Index从视频流中挑选特定帧
3. (可选抽帧)如果你不想逐帧处理,也可以使用它上方的 **`Select Every Nth Image`**,每隔几帧取一张
4. 连接:`Load Video``IMAGE` 输出 → `Select Images``image` 输入
5. 设置参数:`index = 0`(表示取第一帧)
> **操作技巧**ComfyUI 中,鼠标从一个节点的**圆形输出端**拖拽到另一个节点的**圆形输入端**即可完成连线。
---
## 第三步:放置 SAM2 模型加载器
这是整个系统的核心引擎。
1. 右键/双击空白处
2. 找到分类:`SAM2` ,别选 `segment_anything2 `
3. 选择节点:`(Down)Load SAM2Model`(名称可能为 `SAM2ModelLoader``SAM2::Model Loader`
4. 参数设置:
- `model_name`: 选择 `sam2.1 hiera_base_plus.safetensors`(精度与速度平衡)
- `device`: `cuda`(若显存不足可选 `cpu`,但极慢)
- `precision`: `fp16`(推荐,省显存)
将这个节点放在画布**中上部**,作为公共模型源。
---
## 第四步SAM2 节点功能总览与选型
`comfyui-segment-anything-2` 提供了 6 个核心节点。以下是它们的功能定位:
### 4.1 核心加载类
**`(Down)Load SAM2Model`**
- **功能**:从本地加载或从服务器下载指定的 SAM2 模型文件
- **关键参数**
- `model`: 如 `sam2.1_hiera_base_plus.safetensors`
- `segmentor`: 可选择单图或视频模式
- `device`: `cuda``cpu`
- `precision`: `fp16`(推荐)、`bf16``fp32`
### 4.2 静态图像分割类
**`Sam2Segmentation`**
- **功能**:标准单帧分割器。根据输入的正向/负向点坐标、检测框或初始遮罩生成分割结果
- **关键输入**`coordinates_positive`(正选点)、`coordinates_negative`(反选点)、`bboxes`
**`Sam2AutoSegmentation`**
- **功能**"分割一切"模式。无需手动点击,通过全图布设点阵(`points_per_side`)自动识别所有可能的物体
- **适用**:全自动抠出图中所有物体
### 4.3 视频追踪与交互类
**`Sam2VideoSegmentationAddPoints`**
- **功能**:视频工作流的"交互站"。允许你在特定帧(`frame_index`)添加点标注,并将标注注入到视频推理状态(`inference_state`)中
- **关键作用**
- 初始化视频追踪状态
- 通过 `prev_inference_state` 链式追加多帧标注(实现人工纠正)
- **关键输入**`image`(视频批次或关键帧)、`coordinates_positive``coordinates_negative``frame_index`
**`Sam2VideoSegmentation`**
- **功能**:视频推理的核心引擎。接收模型和带有标注信息的 `inference_state`,执行跨帧自动追踪
- **输出**`mask`(完整视频的分割结果批次)
### 4.4 辅助与坐标转换类
**`Florence2 Coordinates`**
- **功能**:桥接节点。将 Florence-2 视觉模型输出的检测数据转换为 SAM2 可识别的坐标格式(中心点 `center_coordinates` 或检测框 `boxes`
- **用途**:实现"文字搜图并抠图"的全自动流程
### 4.5 快速选型建议
| 任务场景 | 核心节点组合 |
|:---|:---|
| **全自动抠出图中所有物体** | `(Down)Load SAM2Model` + `Sam2AutoSegmentation` |
| **手动点击抠出视频第一帧** | `(Down)Load SAM2Model` + `Sam2Segmentation` |
| **将第一帧的效果推广到全视频** | `Sam2VideoSegmentationAddPoints` + `Sam2VideoSegmentation` |
| **全自动语义分割(如:抠出手柄)** | `Florence-2` 相关节点 + `Florence2 Coordinates` + `Sam2Segmentation` |
---
## 第五步:单帧分割测试(确认第一帧标注)
在接入视频追踪前,建议先用单帧节点快速验证标注位置是否准确。
### 5.1 手动点/框标注Sam2Segmentation
1. 添加节点:`SAM2``Sam2Segmentation`
2. 连线:
- `Select Images`(第一帧)的图像输出 → `Sam2Segmentation``image`
- `(Down)Load SAM2Model` 的模型输出 → `Sam2Segmentation``sam2_model`
3. 选择以下**任意一种**提示方式填入:
**方式 A手绘 Mask最直观强烈推荐**
-`Select Images` 的图像先连到一个 `Preview Image` 节点
- 在预览图上**右键** → `Open in Mask Editor`
- 用画笔在目标区域涂抹(不需要很精确,覆盖目标大致轮廓即可),点击 **Save to node**
- 将得到的 `mask` 连到 `Sam2Segmentation``mask` 输入
- 这样无需计算精确坐标,手绘的粗略区域即可引导 SAM2 生成分割
**方式 B点坐标适合精确控制**
- `coordinates_positive`: 填入正选点坐标(如 `[[0.45, 0.52]]`
- `coordinates_negative`: 填入反选点坐标(如 `[[0.55, 0.48]]`),如无则留空
- > **坐标获取技巧**`Sam2Segmentation` 节点本身不带图像点击界面。你可以:
> - 先用 `Sam2AutoSegmentation`(见 5.2)跑一次,从它输出的 `bbox` 列表中估算目标中心坐标
> - 或将第一帧保存到本地在图像编辑软件如画图、Photoshop中查看鼠标位置的像素坐标再归一化除以图像宽高后填入
**方式 C检测框适合规则形状物体**
- `bboxes`: 填入边界框坐标 `[x1, y1, x2, y2]`
- 可通过 `Florence2 Coordinates``Grounding DINO` 节点自动生成(见第六、七章)
4. 参数:
- `keep_model_loaded`: 可开启(若后续继续用同一模型)
- `individual_objects`: 根据需求选择(多目标时开启)
5. 输出连到 `image``Preview Image` 查看效果
> **多次迭代的技巧**SAM2 的分割结果对提示位置敏感。如果第一次效果不佳,**不需要重新连线**
> - 若用 **方式 AMask**:重新打开 Mask Editor调整手绘区域再次 Save然后直接点击「运行」
> - 若用 **方式 B坐标**:直接修改 `coordinates_positive` 的数值,再次点击「运行」
>
> 建议先用 **方式 A 手绘 mask** 快速确认目标能被正确分割,然后再根据效果决定视频追踪时使用的精确坐标。
### 5.2 自动分割一切Sam2AutoSegmentation
如果你不想手动标注,可以使用全自动模式:
1. 添加节点:`SAM2``Sam2AutoSegmentation`
2. 连线:`Select Images``image``(Down)Load SAM2Model``sam2_model`
3. 参数调整(可选):
- `points_per_side`: 网格密度(默认 32越大越精细但越慢
- `pred_iou_thresh`: IOU 阈值过滤低质量 mask
- `stability_score_thresh`: 稳定性阈值(默认 0.95
**医疗/低对比度场景调优建议**
在处理医疗手术图像等低对比度、边界模糊场景时Auto Segmentation 容易因过滤过严而产生"角落碎块"(只保留高对比度杂色,漏掉目标器官)。遇到此现象时请重点调整以下两个参数:
| 参数 | 当前问题 | 建议修改 |
|:---|:---|:---|
| `stability_score_thresh` | 默认 0.95 要求过高。手术灯光反光、组织颜色接近AI 很难在全图点阵下获得 95% 稳定性的遮罩,导致宁缺毋滥、滤掉模糊器官 | **降至 0.85 ~ 0.90** |
| `points_per_side` | 默认 16 意味着全图只撒了 256 个探测点。对于 2560×1440 等高分辨率医疗画面,点阵空隙太大,容易漏掉细小器械或解剖结构 | **提高至 32 或 64** |
4. 输出:`mask``segmented_image``bbox`
**此时你可以先点击「运行」测试单帧分割效果。**
---
## 第六步:视频追踪核心链路
`comfyui-segment-anything-2` 的视频追踪由两个节点配合完成:`Sam2VideoSegmentationAddPoints`(注入提示)+ `Sam2VideoSegmentation`(执行追踪)。
### 6.1 Sam2VideoSegmentationAddPoints视频交互注入
1. 添加节点:`SAM2``Sam2VideoSegmentationAddPoints`
2. 连线:
- `(Down)Load SAM2Model``sam2_model`
- `Load Video` 的完整图像批次 → `image`(视频源)
- `coordinates_positive`: 填入第一帧的正选点坐标
- `coordinates_negative`: 填入反选点坐标(可选)
3. 参数:
- `frame_index`: `0`(表示在第 0 帧添加这些点标注)
- `object_index`: `0`(单目标保持默认,多目标时递增)
- `prev_inference_state`: **首次追踪时留空**;链式追加关键帧时接入上一步的 `inference_state`
4. 输出:`inference_state`(携带了视频帧信息和标注状态)
### 6.2 Sam2VideoSegmentation视频推理引擎
1. 添加节点:`SAM2``Sam2VideoSegmentation`
2. 连线:
- `(Down)Load SAM2Model``sam2_model`
- `Sam2VideoSegmentationAddPoints``inference_state``inference_state`
3. 参数:
- `keep_model_loaded`: 推荐开启(避免重复加载模型)
4. 输出:`mask`(完整视频的分割结果,批次形式)
### 6.3 标准视频工作流连线示意
```
[Load Video] ───────────────────────┐
│ │
↓ ↓
[Sam2VideoSegmentationAddPoints] ──→ [Sam2VideoSegmentation] ──→ [Preview / Save]
↑ ↑
[(Down)Load SAM2Model] [(Down)Load SAM2Model]
[coordinates_positive / coordinates_negative]
```
---
## 第七步人工纠正与多关键帧Fast Muter 应用)
`Sam2VideoSegmentationAddPoints``prev_inference_state` 输入天然支持**链式追加**多帧标注。这是实现"第一帧标注 + 中途修正"的核心机制。
### 7.1 多关键帧链式结构(无修正时的标准链路)
如果你只想用第一帧推广到全视频,链路如下:
```
[Sam2VideoSegmentationAddPoints(第0帧标注)]
↓ inference_state
[Sam2VideoSegmentation]
↓ mask
[Preview / Save]
```
### 7.2 中途人工纠正链路
当视频较长、目标发生遮挡/形变导致追踪漂移时,可在中间帧追加标注:
```
[Sam2VideoSegmentationAddPoints(第0帧)]
↓ inference_state
[Sam2VideoSegmentationAddPoints(第45帧修正, prev_inference_state接入)]
↓ inference_state
[Sam2VideoSegmentation]
↓ mask
[Preview / Save]
```
**操作方式**
1. 第一个 `AddPoints` 节点保持第一帧的标注不变
2. 新建第二个 `AddPoints` 节点:
- `image`: 接入 `Load Video` 的完整批次(与第一个相同)
- `prev_inference_state`: 接入第一个 `AddPoints``inference_state`
- `frame_index`: 修正帧号(如 `45`
- `coordinates_positive`: 修正后的点坐标
3. 第二个 `AddPoints``inference_state``Sam2VideoSegmentation`
4. 重新运行,系统会以第 0 帧和第 45 帧为锚点,综合追踪整个视频
---
## 第八步:输出与可视化
### 8.1 预览 Mask
1. 添加节点:`image``MaskToImage`(将 mask 转为可视图像)
2. 再添加:`image``Preview Image`
3. 连接追踪输出的 mask → `MaskToImage``Preview Image`
### 8.2 合成视频(原图 + Mask 叠加)
1. 添加节点:`video``VHS_VideoCombine`VideoHelperSuite
2. 或:`image``Composite Mask` / `ImageCompositeMasked`
3. 参数:
- `color`: `#FF0000`Mask 颜色)
- `alpha`: `0.6`(透明度)
### 8.3 保存 Mask 序列
1. 添加节点:`image``Save Image`(批量保存时每个 mask 会存为独立文件)
2. 或使用 `VHS_SaveImageSequence`
3. 建议设置 `filename_prefix`: `mask_segment`
---
## 第九步:用 Fast Muter 优化纠正 Workflow
`comfyui-segment-anything-2` 中,纠正本质上是通过 `prev_inference_state` 链式追加 `Sam2VideoSegmentationAddPoints``Fast Muter` 的作用是让你**提前建好纠正节点但默认不执行**,避免每次运行都走一遍修正链路。
### 9.1 创建 Fast Muter 节点
1. 右键/双击空白处
2. 找到:`rgthree``Fast Muter`(或 `Fast Muter/Bypasser`
3. 该节点有一个开关按钮,点击可在 **启用(绿色)****跳过/静音(红色)** 之间切换
### 9.2 搭建纠正分支(推荐方案)
**核心思路**:将修正用的 `Sam2VideoSegmentationAddPoints` 节点插入到主链路的 `prev_inference_state` 路径上,默认通过 **Fast Muter / Bypass** 跳过它。
#### 具体步骤:
1. **主链路保持不变**
- `Sam2VideoSegmentationAddPoints(第0帧)``Sam2VideoSegmentation`
2. **插入修正节点**
- 新建第二个 `Sam2VideoSegmentationAddPoints`,命名为 "Fix_AddPoints"
- `prev_inference_state`:接入主链路第一个 AddPoints 的 `inference_state`
- `image`: 接入 `Load Video` 的完整批次(与主链路相同)
- `frame_index`: `45`(示例问题帧)
- `coordinates_positive`: 填入修正后的点坐标
- 该节点的 `inference_state``Sam2VideoSegmentation`
3. **使用 Fast Muter 控制**
- **方案 AMute 节点输入)**:在 "Fix_AddPoints" 的 `coordinates_positive` 输入前放置 `Fast Muter`,默认红色(阻断)。需要纠正时变绿,坐标流入,修正生效。
- **方案 B原生 Bypass**:直接对 "Fix_AddPoints" 节点右键 → `Bypass`。被 Bypass 时ComfyUI 会跳过该节点,数据直接从上游流到下游(相当于无修正)。需要纠正时取消 Bypass。
### 9.3 实际操作流程
```
第一次运行:
1. Fix_AddPoints 被 Bypass / Fast Muter 关闭
2. 运行完整工作流(仅第 0 帧标注)
3. 检查 Preview Image / 输出视频
发现问题(如第 45 帧漂移):
1. 修改 "Fix_AddPoints" 的 frame_index = 45
2. 修改 "Fix_AddPoints" 的 coordinates_positive 为正确坐标
3. 取消 Bypass / Fast Muter 变绿(启用)
4. 重新点击「运行」
5. 系统以第 0 帧 + 第 45 帧为锚点,综合追踪整个视频
确认修复后:
1. 恢复 Bypass / Fast Muter 关闭
2. 保存最终工作流
```
---
## 第十步:工作流连线总览
按以下逻辑检查你的连线是否完整:
```
[Load Video] ───────────────────────┬───────────────────────────────────────────┐
│ │ │
↓ ↓ │
[Select Images] [Sam2VideoSegmentationAddPoints] │
│ (index=0) ↑ │
│ [(Down)Load SAM2Model] │
│ ↑ │
│ [coordinates_positive] │
↓ │ │
[Sam2Segmentation] ←───────────────┘ (可选:单帧预览测试) │
│ │
↓ ↓
[Preview Image] [Sam2VideoSegmentation]
┌─────────────────────────────────────────────────────────────────────────┘
├──→ [MaskToImage] ──→ [Preview Image]
└──→ [Save Image] / [VHS_VideoCombine]
纠正分支(可选,默认关闭):
[Sam2VideoSegmentationAddPoints(第0帧)] ──→ [Fix_AddPoints(第N帧)] ──→ [Sam2VideoSegmentation]
[coordinates_positive(修正坐标)]
[Fast Muter / Bypass (控制开关)]
```
---
## 运行前检查清单
- [ ] SAM2 模型文件已下载到 `ComfyUI/models/sam2/` 目录
- [ ] Florence-2 / Grounding DINO 模型已下载(如使用语义提示)
- [ ] `Load Video` 已选择有效视频路径
- [ ] `Select Images``index=0` 正确提取了第一帧
- [ ] `coordinates_positive` 的坐标格式与节点要求一致(归一化 0~1 或像素坐标)
- [ ] `Sam2VideoSegmentationAddPoints``image` 接入的是**完整视频批次**,而非单帧
- [ ] `Sam2VideoSegmentationAddPoints``frame_index` 指向了正确的标注帧
- [ ] `Fast Muter` / 修正节点 Bypass 状态符合预期(首次运行应为关闭)
- [ ] 输出节点的保存路径可写
---
## 常见问题速查
| 问题 | 排查方向 |
|------|---------|
| 节点呈红色/无法创建 | 节点包未安装或加载失败,检查 ComfyUI 启动日志 |
| SAM2 节点报错显存不足 | 换 `sam2.1_hiera_tiny.safetensors`,或降低视频分辨率,或启用 fp16 |
| 追踪结果全黑/全白 | 检查 `coordinates_positive` 是否正确传入检查坐标格式0~1 vs 像素);确认 `frame_index` 与标注帧一致 |
| Florence-2 / Grounding DINO 无检测结果 | 降低 `threshold`,或简化 prompt如只写 `"person"` |
| 修正后重新追踪无变化 | 确认修正节点已取消 Bypass / Fast Muter 已启用;确认修正节点的 `prev_inference_state` 正确接入上游 |
| 视频输出帧率不对 | 在 `Load Video``VideoCombine` 中统一设置 fps 参数 |
---
## 下一步建议
1. **先跑通单帧分割**:不连视频追踪链路,只用 `Sam2Segmentation` + `Preview Image` 确认第一帧分割正确
2. **再接入视频追踪**:确认单帧无误后,再连 `Sam2VideoSegmentationAddPoints` + `Sam2VideoSegmentation`
3. **最后添加纠正分支**:等标准流程跑通后再加入 RGThree Fast Muter 机制
4. **保存工作流模板**`Workflow``Save`(或 Ctrl+S命名为 `VideoSeg_Template.json`