Files
2026-07-04 13:38:50 +08:00

289 lines
6.8 KiB
Markdown

# ComfyUI-UniversalRemove
一个自包含的 ComfyUI remove 核心扩展。
## 设计目标
- 不硬编码任何本地路径
- 不依赖其他自定义节点
- 只使用 ComfyUI 常见核心类型:`IMAGE` / `MASK` / `STRING` / `INT` / `FLOAT`
- 面向 **图像批 / 视频帧批** 工作,适合作为通用 remove 流程的中间层
## 当前提供的节点
### 0. `UR Demo Image`
生成一个无需外部图片文件的测试图像,主要用于示例工作流和安装验证。
### 1. `UR Remove Prompt Builder`
输入目标描述,输出三路提示词:
- `segmentation_prompt`
- `remove_positive_prompt`
- `remove_negative_prompt`
用途:
- `segmentation_prompt` 给任意文本选目标模块
- `remove_positive_prompt` 给关键帧修复模型
- `remove_negative_prompt` 给关键帧修复模型的负向提示
### 2. `UR Region Editor`
交互式前端 region 编辑器,输出标准 `regions_json`。
支持:
- 加载本地图片作为编辑背景
- 加载本地视频作为编辑背景并拖动时间轴
- 使用当前视频时间写入关键帧编号
- 绘制矩形区域
- 绘制圆形区域
- 绘制多边形区域
- 删除选中区域
- 清空全部区域
注意:背景图片 / 视频只用于前端交互预览,不会写进 workflow。真正可移植、可复用的是输出的 `regions_json`。
### 3. `UR Boxes To Mask Batch`
把 JSON 形式的矩形框转换成 `MASK` 批次。
支持:
- `xyxy`
- `xywh`
- 归一化坐标
- 三种广播模式:
- `repeat_to_batch`
- `single_frame_only`
- `hold_after_frame`
用途:
- 手工框选移除区域
- 从外部工具导入 bbox
### 4. `UR Regions To Mask Batch`
把关键帧 region JSON 转换成整段图像批 / 视频帧批的 `MASK`。
支持:
- `rect`
- `circle`
- `polygon`
- 单关键帧
- 多关键帧
- 四种广播模式:
- `repeat_to_batch`
- `single_frame_only`
- `hold_after_frame`
- `hold_until_next_keyframe`
用途:
- 用 JSON 描述“关键帧上的圈选区域”
- 为视频帧批生成对应 mask
- 后续接 `UR Mask Processor` / `UR Keyframe Prep` / `UR Soft Composite`
### 5. `UR Mask Processor`
对 mask 做 remove 常用处理:
- 扩张
- 高斯羽化
- 预览叠加
### 6. `UR Keyframe Prep`
从图像批中选出关键帧,并准备 remove 输入:
- 选关键帧
- 对应 mask 对齐
- 按最长边缩放
- pad 到指定倍数
- 用填充色生成 `filled_frame`
其中 `filled_frame` 可以直接送进任意关键帧修复 / inpaint / edit 模型。
### 7. `UR Soft Composite`
一个不依赖 BrushNet 的软融合节点,用于把修复结果融合回原图 / 原视频帧批。
## 推荐工作流
> 这个扩展刻意只负责 remove 核心流程,不强绑某个检测器、分割器、视频模型或视频 IO 节点。
### A. 手工框选 remove
```text
Frames/Image Batch
-> UR Region Editor
-> UR Regions To Mask Batch
-> UR Mask Processor
-> UR Keyframe Prep
-> 关键帧修复模型
-> (可选) 视频传播模型
-> UR Soft Composite
-> Output
```
### B. 提示词驱动 remove
```text
Frames/Image Batch
-> UR Remove Prompt Builder
-> 任意文本选目标模块(输出 MASK)
-> UR Mask Processor
-> UR Keyframe Prep
-> 关键帧修复模型
-> (可选) 视频传播模型
-> UR Soft Composite
-> Output
```
## 为什么没有内置“文本直接找目标”
这是刻意的设计边界:
- remove 核心流程应该通用、可复用
- 文本找目标属于检测 / 分割 / 跟踪能力
- 这部分通常意味着额外模型、额外权重、额外依赖
因此当前版本先把 remove 主流程做成稳定、自包含、无外部节点硬依赖的核心层。
如果后续要继续扩展,最自然的下一步是在这个扩展内部新增:
- `UR Prompt Mask Locator`
- `UR Video Track Mask`
- `UR Model Bundle`
但这些应当作为后续迭代,而不是在 V1 就把依赖链做死。
## 安装方式
把整个目录放进:
- `ComfyUI/custom_nodes/ComfyUI-UniversalRemove`
然后重启 ComfyUI。
## 示例工作流
当前已提供一个可直接导入的最小工作流:
- `example_workflows/Universal Remove - Interactive Region Editor.json`
这个 workflow 的特点:
- 只依赖 ComfyUI core + 本扩展
- 可直接导入并运行,不需要额外图片文件
- 可用 `UR Region Editor` 交互绘制 `regions_json`
- 也可以手工编辑 `regions_json`
- 可预览:
- mask preview
- filled keyframe
- soft composite result
这个示例是 **remove 核心流程示例**,不内置外部检测模型或修复模型,因此更适合作为:
- remove 管线起点
- 接入你自己的 inpaint / edit / video propagation 模型前的可运行 scaffold
## 测试
仓库内已提供基础单元测试:
- `tests/test_universal_remove.py`
运行方式:
```bash
uv pip install --python /path/to/ComfyUI/.venv/bin/python -r requirements-dev.txt
/path/to/ComfyUI/.venv/bin/python -m pytest tests/test_universal_remove.py
```
## 视频输入与关键帧圈选
当前扩展不内置视频读取器,但已经内置 `UR Region Editor` 前端交互式圈选 UI。
推荐接法是:
```text
任意视频读取节点 / 你的脚本
-> IMAGE frame batch
-> UR Region Editor 输出 regions_json
-> UR Regions To Mask Batch
```
也就是说,本扩展支持的是:
- 输入视频拆帧后的 `IMAGE` 批次
- 通过 `frame_index` 指定关键帧
- 通过 `UR Region Editor` 鼠标绘制或手写 `regions_json` 描述关键帧上的圈选区域
- 输出整段帧批可用的 `MASK`
`UR Region Editor` 的本地视频背景只用于交互定位,不替代实际视频读取节点;真正进入后端计算的是上游 `IMAGE` frame batch 和编辑器输出的 `regions_json`。
## region JSON 示例
### 单关键帧矩形 + 圆形
```json
[
{"type": "rect", "frame_index": 0, "x": 160, "y": 120, "w": 260, "h": 140},
{"type": "circle", "frame_index": 0, "cx": 520, "cy": 250, "r": 70}
]
```
### 多关键帧多边形
```json
[
{
"type": "polygon",
"frame_index": 0,
"points": [[120, 160], [240, 150], [280, 260], [150, 290]]
},
{
"type": "polygon",
"frame_index": 48,
"points": [[180, 170], [310, 160], [350, 280], [210, 310]]
}
]
```
配合 `broadcast_mode=hold_until_next_keyframe` 时,第一个关键帧 mask 会使用到下一个关键帧之前,第二个关键帧 mask 会使用到结尾。
## bbox JSON 示例
### `xyxy`
```json
[
[100, 120, 420, 220],
[520, 50, 700, 160]
]
```
### `xywh`
```json
[
{"x": 100, "y": 120, "w": 320, "h": 100},
{"x": 520, "y": 50, "w": 180, "h": 110}
]
```
## 备注
这个扩展当前最适合做:
- 通用 remove 流程骨架
- 去水印 / 去字幕 / 去 logo
- 有上游 mask 时的角色移除 / 物体移除
如果你下一步要做“文本直接选目标并跟踪整段视频”,建议继续在这个目录里加新节点,而不是让核心 remove 节点反向依赖别的 custom nodes。