vault backup: 2026-04-24 15:58:02
This commit is contained in:
@@ -4,8 +4,8 @@
|
||||
"title": "Design ComfyUI video segmentation and tracking",
|
||||
"titleGenerationStatus": "success",
|
||||
"createdAt": 1776871296744,
|
||||
"updatedAt": 1777012794152,
|
||||
"lastResponseAt": 1777012794152,
|
||||
"updatedAt": 1777017083342,
|
||||
"lastResponseAt": 1777017083342,
|
||||
"sessionId": "50e1c568-9493-4c86-8ca1-1f50b0f2e724",
|
||||
"providerState": {
|
||||
"providerSessionId": "50e1c568-9493-4c86-8ca1-1f50b0f2e724"
|
||||
@@ -15,12 +15,12 @@
|
||||
],
|
||||
"usage": {
|
||||
"model": "kimi-for-coding",
|
||||
"inputTokens": 139251,
|
||||
"inputTokens": 32038,
|
||||
"cacheCreationInputTokens": 0,
|
||||
"cacheReadInputTokens": 0,
|
||||
"contextWindow": 200000,
|
||||
"contextTokens": 139251,
|
||||
"percentage": 70,
|
||||
"contextTokens": 32038,
|
||||
"percentage": 16,
|
||||
"contextWindowIsAuthoritative": true
|
||||
}
|
||||
}
|
||||
5
.obsidian/workspace.json
vendored
5
.obsidian/workspace.json
vendored
@@ -192,6 +192,11 @@
|
||||
},
|
||||
"active": "98c4d568edb73698",
|
||||
"lastOpenFiles": [
|
||||
"自动语义分割系统/参考内容/视频笔记-ComfyUI SAM2 Easy Tutorial.md",
|
||||
"自动语义分割系统/参考内容/插件功能大全.md",
|
||||
"自动语义分割系统/参考内容/安装步骤.md",
|
||||
"自动语义分割系统/参考内容",
|
||||
"自动语义分割系统/New Folder",
|
||||
"未命名.canvas",
|
||||
"自动语义分割系统/2026_4_24_视频分割工作流构建 1.json",
|
||||
"自动语义分割系统/2026_4_24_视频分割工作流构建.json",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: ComfyUI 视频分割系统 - 界面搭建操作指南
|
||||
date: 2026-04-22
|
||||
date: 2026-04-24
|
||||
tags:
|
||||
- comfyUI
|
||||
- 操作指南
|
||||
@@ -10,411 +10,214 @@ tags:
|
||||
|
||||
# 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,无线广播连线)
|
||||
> 本指南基于 `2026_4_24_视频分割工作流构建.json` 初稿编写,描述当前已实现的工作流,并标注后续扩展方向。
|
||||
> 扩展参考资料见 [[参考内容/安装步骤.md]]、[[参考内容/插件功能大全.md]]。
|
||||
|
||||
---
|
||||
|
||||
## 第一步:打开节点添加菜单
|
||||
## 前置要求
|
||||
|
||||
在画布空白处 **双击鼠标左键**,或 **右键单击空白处** → 选择 `添加节点`。
|
||||
请确保已通过 **ComfyUI Manager** 安装以下节点包:
|
||||
|
||||
你会看到一个分类菜单(如 `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 容易因过滤过严而产生"角落碎块"(只保留高对比度杂色,漏掉目标器官)。遇到此现象时请重点调整以下两个参数:
|
||||
|
||||
| 参数 | 当前问题 | 建议修改 |
|
||||
| 节点包 | 用途 | JSON 中使用的节点 |
|
||||
|:---|:---|:---|
|
||||
| `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-VideoHelperSuite` | 视频加载、帧提取、视频合成 | `VHS_LoadVideo`, `VHS_SelectImages`, `VHS_VideoCombine`, `PreviewAnimation` |
|
||||
| `ComfyUI-segment-anything-2` | SAM2 模型加载与分割 | `DownloadAndLoadSAM2Model`, `Sam2Segmentation` |
|
||||
| `ComfyUI-KJNodes` | 交互式坐标编辑器 | `PointsEditor` |
|
||||
|
||||
---
|
||||
|
||||
## 第六步:视频追踪核心链路
|
||||
|
||||
`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]
|
||||
[VHS_LoadVideo] ───┬──→ [VHS_SelectImages] ──→ [PointsEditor] ──→ [Sam2Segmentation]
|
||||
│ │ (index=0) (positive_coords) ↑
|
||||
│ │ (negative_coords) │
|
||||
│ │ │
|
||||
│ └───────────────────────────────────────────────────┘
|
||||
│ ↑
|
||||
│ [DownloadAndLoadSAM2Model]
|
||||
│
|
||||
└──→ [PreviewAnimation] ←── [Sam2Segmentation(mask)]
|
||||
↓
|
||||
[MaskToImage] ──→ [VHS_VideoCombine]
|
||||
```
|
||||
|
||||
**当前状态**:对视频每一帧使用 **相同的交互式坐标** 进行独立分割(`Sam2Segmentation` 接收完整视频批次)。
|
||||
|
||||
**扩展目标**:接入 `Sam2VideoSegmentationAddPoints` + `Sam2VideoSegmentation`,实现真正的**跨帧追踪**。
|
||||
|
||||
---
|
||||
|
||||
## 第一步:加载视频
|
||||
|
||||
1. 右键/双击空白处打开节点菜单
|
||||
2. 找到 **Video Helper Suite**(紫色摄像机图标)
|
||||
3. 选择 `Load Video` 或 `Load Video (Path)`
|
||||
4. 参数说明:
|
||||
- `video`: 选择你的视频文件
|
||||
- `force_rate`: `0`(保持原帧率)
|
||||
- `frame_load_cap`: `0`(加载全部帧)
|
||||
- `select_every_nth`: `10`(每 10 帧取 1 帧,降低处理量)
|
||||
- `format`: `AnimateDiff`
|
||||
|
||||
---
|
||||
|
||||
## 第二步:提取第一帧作为交互背景
|
||||
|
||||
1. 回到 **Video Helper Suite**,选择 `图像` → **`Select Images`**
|
||||
2. 连接:`VHS_LoadVideo` 的 `IMAGE` → `Select Images` 的 `image`
|
||||
3. 参数:`indexes` = `0`(取第 0 帧)
|
||||
4. 该帧将作为 `PointsEditor` 的背景图,方便你在原图上点击标注
|
||||
|
||||
---
|
||||
|
||||
## 第三步:交互式坐标生成(PointsEditor)
|
||||
|
||||
1. 搜索:`KJNodes` → `PointsEditor`
|
||||
2. 连接:`Select Images` 的 `IMAGE` → `PointsEditor` 的 `bg_image`
|
||||
3. 节点功能:
|
||||
- 在画布上显示第一帧图像
|
||||
- **点击图像**生成正选点(positive),输出到 `positive_coords`
|
||||
- **按住 Shift 点击**生成反选点(negative),输出到 `negative_coords`
|
||||
- 支持框选(bbox)和裁剪预览
|
||||
4. 参数说明:
|
||||
- `width` / `height`: 与视频分辨率一致(如 `2560`, `1440`)
|
||||
- `xyxy`: 坐标格式
|
||||
5. 输出:`positive_coords`(正选坐标 JSON 字符串)、`negative_coords`(反选坐标 JSON 字符串)
|
||||
|
||||
> **这是解决"手动填坐标不直观"问题的关键节点。** 你可以反复点击、调整,每次修改后直接运行,无需重新连线。
|
||||
|
||||
---
|
||||
|
||||
## 第四步:加载 SAM2 模型
|
||||
|
||||
1. 搜索:`SAM2` → `DownloadAndLoadSAM2Model`
|
||||
2. 参数:
|
||||
- `model`: `sam2.1_hiera_base_plus.safetensors`
|
||||
- `segmentor`: `video`(选择视频模式,为后续扩展做准备)
|
||||
- `device`: `cuda`
|
||||
- `precision`: `bf16`
|
||||
3. 输出:`sam2_model`
|
||||
|
||||
---
|
||||
|
||||
## 第五步:单帧分割广播到全视频(Sam2Segmentation)
|
||||
|
||||
1. 搜索:`SAM2` → `Sam2Segmentation`
|
||||
2. 连接:
|
||||
- `DownloadAndLoadSAM2Model` 的 `sam2_model` → `Sam2Segmentation` 的 `sam2_model`
|
||||
- `VHS_LoadVideo` 的 `IMAGE`(完整视频批次)→ `Sam2Segmentation` 的 `image`
|
||||
- `PointsEditor` 的 `positive_coords` → `Sam2Segmentation` 的 `coordinates_positive`
|
||||
- `PointsEditor` 的 `negative_coords` → `Sam2Segmentation` 的 `coordinates_negative`
|
||||
3. 参数:
|
||||
- `keep_model_loaded`: `true`
|
||||
- `individual_objects`: `true`
|
||||
4. 输出:`mask`
|
||||
|
||||
> **当前行为**:`Sam2Segmentation` 对视频批次中的**每一帧**都使用 `PointsEditor` 生成的同一组坐标进行独立分割。如果目标在视频中有大幅位移,后续帧可能分割不准。
|
||||
>
|
||||
> **这正是下一步需要扩展视频追踪的原因。**
|
||||
|
||||
---
|
||||
|
||||
## 第六步:输出与预览
|
||||
|
||||
### 6.1 Mask 转图像
|
||||
|
||||
1. 搜索:`mask` → `MaskToImage`
|
||||
2. 连接:`Sam2Segmentation` 的 `mask` → `MaskToImage` 的 `mask`
|
||||
3. 输出:`IMAGE`(可视化的 mask 图像批次)
|
||||
|
||||
### 6.2 合成视频
|
||||
|
||||
1. 搜索:`video` → `VHS_VideoCombine`
|
||||
2. 连接:`MaskToImage` 的 `IMAGE` → `VHS_VideoCombine` 的 `images`
|
||||
3. 参数:
|
||||
- `frame_rate`: `10`(与抽帧间隔匹配)
|
||||
- `format`: `video/nvenc_h264-mp4`
|
||||
- `filename_prefix`: `AnimateDiff`
|
||||
- `save_output`: `true`
|
||||
|
||||
### 6.3 实时预览
|
||||
|
||||
1. 搜索:`VHS` → `PreviewAnimation`
|
||||
2. 连接:
|
||||
- `VHS_LoadVideo` 的 `IMAGE` → `PreviewAnimation` 的 `images`(原视频)
|
||||
- `Sam2Segmentation` 的 `mask` → `PreviewAnimation` 的 `masks`(分割 mask)
|
||||
3. 功能:同时播放原视频和 mask,便于逐帧检查分割效果
|
||||
|
||||
---
|
||||
|
||||
## 第七步:后续扩展方向
|
||||
|
||||
当前 JSON 只实现了**逐帧独立分割**。下一步扩展为**真正的视频追踪**:
|
||||
|
||||
### 扩展 1:接入 SAM2 视频追踪核心
|
||||
|
||||
在现有链路基础上,将 `Sam2Segmentation` 替换或并行为:
|
||||
|
||||
```
|
||||
[Sam2VideoSegmentationAddPoints] ──→ [Sam2VideoSegmentation] ──→ [MaskToImage]
|
||||
↑ ↑
|
||||
[(Down)Load SAM2Model] [(Down)Load SAM2Model]
|
||||
↑
|
||||
[coordinates_positive / coordinates_negative]
|
||||
[PointsEditor(positive_coords)]
|
||||
```
|
||||
|
||||
---
|
||||
| 步骤 | 操作 |
|
||||
|:---|:---|
|
||||
| 1 | 添加 `Sam2VideoSegmentationAddPoints`,`image` 接入完整视频批次,`coordinates_positive` 接入 `PointsEditor` |
|
||||
| 2 | 添加 `Sam2VideoSegmentation`,`inference_state` 接入上一步输出 |
|
||||
| 3 | `Sam2VideoSegmentation` 的 `mask` → `MaskToImage` |
|
||||
| 4 | 此时 `PointsEditor` 的坐标只在第 0 帧生效,SAM2 会自动追踪目标运动到后续帧 |
|
||||
|
||||
## 第七步:人工纠正与多关键帧(Fast Muter 应用)
|
||||
### 扩展 2:人工纠正分支(Fast Muter)
|
||||
|
||||
`Sam2VideoSegmentationAddPoints` 的 `prev_inference_state` 输入天然支持**链式追加**多帧标注。这是实现"第一帧标注 + 中途修正"的核心机制。
|
||||
|
||||
### 7.1 多关键帧链式结构(无修正时的标准链路)
|
||||
|
||||
如果你只想用第一帧推广到全视频,链路如下:
|
||||
|
||||
```
|
||||
[Sam2VideoSegmentationAddPoints(第0帧标注)]
|
||||
↓ inference_state
|
||||
[Sam2VideoSegmentation]
|
||||
↓ mask
|
||||
[Preview / Save]
|
||||
```
|
||||
|
||||
### 7.2 中途人工纠正链路
|
||||
|
||||
当视频较长、目标发生遮挡/形变导致追踪漂移时,可在中间帧追加标注:
|
||||
当追踪漂移时,在 `prev_inference_state` 路径上链式追加修正节点:
|
||||
|
||||
```
|
||||
[Sam2VideoSegmentationAddPoints(第0帧)]
|
||||
↓ inference_state
|
||||
[Sam2VideoSegmentationAddPoints(第45帧修正, prev_inference_state接入)]
|
||||
[Sam2VideoSegmentationAddPoints(第N帧修正, 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 帧为锚点,综合追踪整个视频
|
||||
实现方式:
|
||||
1. 安装 `rgthree-comfy`
|
||||
2. 创建第二个 `Sam2VideoSegmentationAddPoints`(修正节点)
|
||||
3. 默认对该修正节点执行 **Bypass**(右键 → Bypass),使其不参与运算
|
||||
4. 需要修正时,取消 Bypass,修改 `frame_index` 和坐标,重新运行
|
||||
|
||||
---
|
||||
### 扩展 3:语义提示自动化
|
||||
|
||||
## 第八步:输出与可视化
|
||||
|
||||
### 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 (控制开关)]
|
||||
[Text Prompt] ──→ [Florence2 / Grounding DINO] ──→ [Florence2 Coordinates]
|
||||
──→ [Sam2Segmentation / Sam2VideoSegmentationAddPoints]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 运行前检查清单
|
||||
|
||||
- [ ] 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 状态符合预期(首次运行应为关闭)
|
||||
- [ ] 输出节点的保存路径可写
|
||||
- [ ] SAM2 模型已下载到 `ComfyUI/models/sam2/`(`sam2.1_hiera_base_plus.safetensors`)
|
||||
- [ ] `VHS_LoadVideo` 的视频路径有效
|
||||
- [ ] `Select Images` 的 `indexes` = `0`
|
||||
- [ ] `PointsEditor` 已生成至少一个 `positive_coords`(点击图像)
|
||||
- [ ] `Sam2Segmentation` 的 `image` 接入的是**视频批次**(来自 `VHS_LoadVideo`)
|
||||
- [ ] `VHS_VideoCombine` 的 `frame_rate` 与抽帧间隔匹配
|
||||
|
||||
---
|
||||
|
||||
## 常见问题速查
|
||||
## 常见问题
|
||||
|
||||
| 问题 | 排查方向 |
|
||||
|------|---------|
|
||||
| 节点呈红色/无法创建 | 节点包未安装或加载失败,检查 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`
|
||||
|:---|:---|
|
||||
| `PointsEditor` 点击无反应 | 确保 `bg_image` 已连接且有图像输出;检查节点是否支持当前浏览器 |
|
||||
| 分割结果全黑/全白 | 检查 `coordinates_positive` 是否传入;确认坐标在图像范围内 |
|
||||
| 后续帧分割漂移 | **正常现象**(当前是逐帧独立分割,非追踪)。解决:扩展接入 `Sam2VideoSegmentation` |
|
||||
| 显存不足 | `DownloadAndLoadSAM2Model` 的 `precision` 改为 `fp16`,或降低视频分辨率 |
|
||||
| 视频合成帧率不对 | 确保 `select_every_nth` 与 `VideoCombine` 的 `frame_rate` 匹配 |
|
||||
|
||||
Reference in New Issue
Block a user