--- 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`