421 lines
19 KiB
Markdown
421 lines
19 KiB
Markdown
---
|
||
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 的分割结果对提示位置敏感。如果第一次效果不佳,**不需要重新连线**:
|
||
> - 若用 **方式 A(Mask)**:重新打开 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 控制**:
|
||
- **方案 A(Mute 节点输入)**:在 "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`
|