diff --git a/.claudian/sessions/conv-1776871296744-2ksok7n1u.meta.json b/.claudian/sessions/conv-1776871296744-2ksok7n1u.meta.json index 25027ca..55ed02a 100644 --- a/.claudian/sessions/conv-1776871296744-2ksok7n1u.meta.json +++ b/.claudian/sessions/conv-1776871296744-2ksok7n1u.meta.json @@ -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 } } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 694a8c6..d691c0c 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -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", diff --git a/自动语义分割系统/ComfyUI 搭建操作指南.md b/自动语义分割系统/ComfyUI 搭建操作指南.md index 2ef8324..e775eda 100644 --- a/自动语义分割系统/ComfyUI 搭建操作指南.md +++ b/自动语义分割系统/ComfyUI 搭建操作指南.md @@ -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` 等)。 +| 节点包 | 用途 | JSON 中使用的节点 | +|:---|:---|:---| +| `ComfyUI-VideoHelperSuite` | 视频加载、帧提取、视频合成 | `VHS_LoadVideo`, `VHS_SelectImages`, `VHS_VideoCombine`, `PreviewAnimation` | +| `ComfyUI-segment-anything-2` | SAM2 模型加载与分割 | `DownloadAndLoadSAM2Model`, `Sam2Segmentation` | +| `ComfyUI-KJNodes` | 交互式坐标编辑器 | `PointsEditor` | --- -## 第二步:搭建视频输入端 +## 当前工作流拓扑 -### 2.1 加载视频 +``` +[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 (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 中,鼠标从一个节点的**圆形输出端**拖拽到另一个节点的**圆形输入端**即可完成连线。 +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` --- -## 第三步:放置 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`(推荐,省显存) - -将这个节点放在画布**中上部**,作为公共模型源。 +1. 回到 **Video Helper Suite**,选择 `图像` → **`Select Images`** +2. 连接:`VHS_LoadVideo` 的 `IMAGE` → `Select Images` 的 `image` +3. 参数:`indexes` = `0`(取第 0 帧) +4. 该帧将作为 `PointsEditor` 的背景图,方便你在原图上点击标注 --- -## 第四步:SAM2 节点功能总览与选型 +## 第三步:交互式坐标生成(PointsEditor) -`comfyui-segment-anything-2` 提供了 6 个核心节点。以下是它们的功能定位: +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 字符串) -### 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` | +> **这是解决"手动填坐标不直观"问题的关键节点。** 你可以反复点击、调整,每次修改后直接运行,无需重新连线。 --- -## 第五步:单帧分割测试(确认第一帧标注) +## 第四步:加载 SAM2 模型 -在接入视频追踪前,建议先用单帧节点快速验证标注位置是否准确。 +1. 搜索:`SAM2` → `DownloadAndLoadSAM2Model` +2. 参数: + - `model`: `sam2.1_hiera_base_plus.safetensors` + - `segmentor`: `video`(选择视频模式,为后续扩展做准备) + - `device`: `cuda` + - `precision`: `bf16` +3. 输出:`sam2_model` -### 5.1 手动点/框标注(Sam2Segmentation) +--- -1. 添加节点:`SAM2` → `Sam2Segmentation` -2. 连线: - - `Select Images`(第一帧)的图像输出 → `Sam2Segmentation` 的 `image` - - `(Down)Load SAM2Model` 的模型输出 → `Sam2Segmentation` 的 `sam2_model` +## 第五步:单帧分割广播到全视频(Sam2Segmentation) -3. 选择以下**任意一种**提示方式填入: +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` - **方式 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` 的数值,再次点击「运行」 +> **当前行为**:`Sam2Segmentation` 对视频批次中的**每一帧**都使用 `PointsEditor` 生成的同一组坐标进行独立分割。如果目标在视频中有大幅位移,后续帧可能分割不准。 > -> 建议先用 **方式 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 Mask 转图像 -### 6.1 Sam2VideoSegmentationAddPoints(视频交互注入) +1. 搜索:`mask` → `MaskToImage` +2. 连接:`Sam2Segmentation` 的 `mask` → `MaskToImage` 的 `mask` +3. 输出:`IMAGE`(可视化的 mask 图像批次) -1. 添加节点:`SAM2` → `Sam2VideoSegmentationAddPoints` -2. 连线: - - `(Down)Load SAM2Model` → `sam2_model` - - `Load Video` 的完整图像批次 → `image`(视频源) - - `coordinates_positive`: 填入第一帧的正选点坐标 - - `coordinates_negative`: 填入反选点坐标(可选) +### 6.2 合成视频 + +1. 搜索:`video` → `VHS_VideoCombine` +2. 连接:`MaskToImage` 的 `IMAGE` → `VHS_VideoCombine` 的 `images` 3. 参数: - - `frame_index`: `0`(表示在第 0 帧添加这些点标注) - - `object_index`: `0`(单目标保持默认,多目标时递增) - - `prev_inference_state`: **首次追踪时留空**;链式追加关键帧时接入上一步的 `inference_state` -4. 输出:`inference_state`(携带了视频帧信息和标注状态) + - `frame_rate`: `10`(与抽帧间隔匹配) + - `format`: `video/nvenc_h264-mp4` + - `filename_prefix`: `AnimateDiff` + - `save_output`: `true` -### 6.2 Sam2VideoSegmentation(视频推理引擎) +### 6.3 实时预览 -1. 添加节点:`SAM2` → `Sam2VideoSegmentation` -2. 连线: - - `(Down)Load SAM2Model` → `sam2_model` - - `Sam2VideoSegmentationAddPoints` 的 `inference_state` → `inference_state` -3. 参数: - - `keep_model_loaded`: 推荐开启(避免重复加载模型) -4. 输出:`mask`(完整视频的分割结果,批次形式) +1. 搜索:`VHS` → `PreviewAnimation` +2. 连接: + - `VHS_LoadVideo` 的 `IMAGE` → `PreviewAnimation` 的 `images`(原视频) + - `Sam2Segmentation` 的 `mask` → `PreviewAnimation` 的 `masks`(分割 mask) +3. 功能:同时播放原视频和 mask,便于逐帧检查分割效果 -### 6.3 标准视频工作流连线示意 +--- + +## 第七步:后续扩展方向 + +当前 JSON 只实现了**逐帧独立分割**。下一步扩展为**真正的视频追踪**: + +### 扩展 1:接入 SAM2 视频追踪核心 + +在现有链路基础上,将 `Sam2Segmentation` 替换或并行为: ``` -[Load Video] ───────────────────────┐ - │ │ - ↓ ↓ -[Sam2VideoSegmentationAddPoints] ──→ [Sam2VideoSegmentation] ──→ [Preview / Save] - ↑ ↑ +[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` 匹配 | diff --git a/自动语义分割系统/安装步骤.md b/自动语义分割系统/参考内容/安装步骤.md similarity index 100% rename from 自动语义分割系统/安装步骤.md rename to 自动语义分割系统/参考内容/安装步骤.md diff --git a/自动语义分割系统/插件功能大全.md b/自动语义分割系统/参考内容/插件功能大全.md similarity index 100% rename from 自动语义分割系统/插件功能大全.md rename to 自动语义分割系统/参考内容/插件功能大全.md diff --git a/自动语义分割系统/视频笔记-ComfyUI SAM2 Easy Tutorial.md b/自动语义分割系统/参考内容/视频笔记-ComfyUI SAM2 Easy Tutorial.md similarity index 100% rename from 自动语义分割系统/视频笔记-ComfyUI SAM2 Easy Tutorial.md rename to 自动语义分割系统/参考内容/视频笔记-ComfyUI SAM2 Easy Tutorial.md