Extensions/ComfyUI-VideoSeal
ComfyUI Extension

ComfyUI-VideoSeal

A ComfyUI extension with 4 custom nodes.

By jc2shile·Created about a month ago·Updated about a month ago· 1
jc2shile/ComfyUI-VideoSeal
Nodes4
On cloudLocal install
CategoryVideoSeal
Stars1
Updatedabout a month ago
Readme

ComfyUI-VideoSeal

<p align="center"> <a href="README.md"><b>🇨🇳 中文</b></a> • <a href="README_EN.md">🇬🇧 English</a> </p>

为 ComfyUI 添加视频/图像水印嵌入与检测能力,基于 Meta AI 的 VideoSeal 系列模型。

工作原理

水印嵌入流程

输入图像/视频  ──┐
                 ├──→ [编码器 UNet] ──→ 扰动图(watermark pattern)
随机二进制消息 ──┘                           │
                                            ↓
                    原始图 + 扰动图 × scaling_w ──→ [JND 衰减] ──→ 含水印图
                                                                   │
                                                                   ↓
                                                           输出图像/视频

核心组件:

| 组件 | 作用 | |------|------| | 编码器 (UNet) | 将二进制消息编码为与内容相关的扰动图,保证在不同画面下有自适应强度 | | 混合器 (Blender) | scaling_w 控制水印强度,在可见性与鲁棒性之间权衡 | | JND 衰减 | 利用视觉感知模型,在纹理复杂区域嵌入更强水印,平滑区域减弱,保持视觉无损 |

水印检测流程

含水印图 ──→ [ConvNeXt 编码器] ──→ [像素解码器] ──→ 每个像素的消息概率图
                                                      │
                                                      ↓
                                              空间聚合 → 256/1024 bit 消息

检测器对每一帧独立输出消息位概率,对视频自动跨帧聚合提高准确性。

模型系列

| 模型 | 消息位长 | 特点 | |------|----------|------| | VideoSeal v1.0 | 256 bit | 均衡稳定,默认推荐 | | PixelSeal | 256 bit | SOTA 鲁棒性与不可见性权衡 | | ChunkySeal | 1024 bit | 高容量(4 倍),适合需要嵌入更多信息的场景 |


安装

方法一:ComfyUI Manager(推荐)

在 ComfyUI Manager 中搜索 "VideoSeal",点击安装即可。依赖会自动处理。

方法二:手动安装

cd ComfyUI/custom_nodes
git clone https://github.com/your-username/ComfyUI-VideoSeal
cd ComfyUI-VideoSeal

# 激活 ComfyUI 的 Python 环境后安装依赖
pip install -r requirements.txt

前置依赖

  • Python: >= 3.10
  • PyTorch: >= 2.3(ComfyUI 自带)
  • CUDA: 推荐 12.1+(CPU 可用但极慢)

模型下载

首次使用 VideoSeal Model Loader 节点时自动下载,无需手动操作。

| 模型 | 下载地址 | 本地路径 | 大小 | |------|----------|----------|------| | videoseal | https://dl.fbaipublicfiles.com/videoseal/y_256b_img.pth | ComfyUI/models/videoseal/y_256b_img.pth | ~500 MB | | pixelseal | https://dl.fbaipublicfiles.com/videoseal/pixelseal/checkpoint.pth | ComfyUI/models/videoseal/pixelseal/checkpoint.pth | ~1.2 GB | | chunkyseal | https://dl.fbaipublicfiles.com/videoseal/chunkyseal/checkpoint.pth | ComfyUI/models/videoseal/chunkyseal/checkpoint.pth | ~2 GB |

存放目录 ComfyUI/models/videoseal/ 由 ComfyUI 的 folder_paths.models_dir 决定,通常位于 ComfyUI 根目录下的 models/videoseal/

注意:PyPI 分发的 videoseal pip 包(v1.0.1)存在打包缺陷,缺少运行所需的配置文件和模型卡片。本节点在首次加载时自动检测并补充缺失文件,无需用户干预。如果遇到模型加载失败,请确认网络可访问 dl.fbaipublicfiles.com


节点参考

1. VideoSeal Model Loader

加载预训练模型。

| 输入 | 类型 | 说明 | |------|------|------| | model_name | 下拉 | videoseal / pixelseal / chunkyseal | | device | 下拉 | auto(默认)/ cuda / cpu |

| 输出 | 类型 | 说明 | |------|------|------| | model | VIDEOSEAL_MODEL | 传入嵌入/检测节点 | | nbits | INT | 该模型的消息位长 |

2. VideoSeal Embed Watermark

向图像/视频中嵌入水印。

| 输入 | 类型 | 默认值 | 说明 | |------|------|--------|------| | model | VIDEOSEAL_MODEL | - | 模型加载器的输出 | | images | IMAGE | - | 图像张量 [B, H, W, C];RGBA 自动截取 RGB | | is_video | 布尔 | true | 视频模式启用逐帧时空传播 | | message | STRING | "" | 消息:二进制 0101、十六进制 0xAB 或任意 UTF‑8 文本 | | scaling_w | FLOAT | 0.2 | 水印强度,范围 [0, 1] | | lowres_attenuation | 布尔 | true | 低分辨率下计算 JND 衰减(省显存) | | batch_size | INT | 64 | 每批帧数,调低可降低显存占用 | | audio | AUDIO | - | 可选音频输入,直通到输出(保留视频音轨) |

| 输出 | 类型 | 说明 | |------|------|------| | watermarked | IMAGE | 含水印图像/视频 | | message | STRING | 格式 原始文本 | 二进制...;随机消息仅含二进制 | | audio | AUDIO | 直通输入的音频(若提供) |

3. VideoSeal Detect Watermark

检测/提取图像/视频中的水印。

| 输入 | 类型 | 默认值 | 说明 | |------|------|--------|------| | model | VIDEOSEAL_MODEL | - | 模型加载器的输出 | | images | IMAGE | - | 待检测的图像/视频;RGBA 自动截取 RGB | | is_video | 布尔 | true | 视频模式下跨帧聚合结果 | | aggregation | 下拉 | avg | 帧聚合方式:avg / squared_avg / l1norm_avg / l2norm_avg | | batch_size | INT | 32 | 每批帧数,调低可降低显存占用 |

| 输出 | 类型 | 说明 | |------|------|------| | message | STRING | 格式 恢复的文本 | 二进制...;若无法恢复文本则显示占位符 | | confidence | FLOAT | 置信度(平均距决策边界的距离) | | detection_map | IMAGE | 检测位可视化热图 |

4. VideoSeal Message (Binary)

生成指定长度的二进制消息字符串。

| 输入 | 类型 | 默认值 | 说明 | |------|------|--------|------| | nbits | INT | 256 | 消息位长 | | seed | INT | 0 | 随机种子(相同种子产生相同消息) | | hex_string | STRING | "" | 可选十六进制串(如 a1b2c3)→ 转为二进制 |

| 输出 | 类型 | 说明 | |------|------|------| | message | STRING | 二进制消息字符串 |


使用指南

快速开始:图像水印

最简单的流程:加载图像 → 嵌入水印 → 保存结果。

[LoadImage] ──→ [VideoSealEmbed] ──→ [SaveImage]
                     ↑
[VideoSealModelLoader]
  1. 添加 VideoSeal Model Loader(选择 videoseal
  2. 添加 VideoSeal Embed Watermark,连接模型和图像
  3. 添加 SaveImage,连接出水印图像
  4. 可选:添加 VideoSeal Detect Watermark 验证水印能否被正确提取

视频水印

需要使用 ComfyUI-VideoHelperSuite 加载/合成视频。

[VHS_LoadVideo] ──→ [VideoSealEmbed] ──→ [VHS_VideoCombine]
                      │        ↑              ↑
                      │  [VideoSealModelLoader] │
                      └─── audio ───────────────┘(直通保留音轨)

使用自定义消息

支持三种格式的消息输入,自动识别:

| 格式 | 示例 | 说明 | |------|------|------| | 二进制 | 01011100... | 纯 0/1 字符 | | 十六进制 | 0xAB12AB12 | 0x 前缀或全为 hex 字符时自动识别 | | UTF‑8 文本 | FengXianBai | 以上都不是时,自动编码为 UTF‑8 字节 |

Embed 输出格式:原始文本 | 二进制...(随机消息仅含二进制部分)

Detect 输出格式:尝试将检测到的比特解码回 UTF‑8 文本,成功则显示 文本 | 二进制,失败则显示 (无法恢复文本) | 二进制

调节参数

  • scaling_w: 0.1 = 更隐蔽但鲁棒性降低;0.4 = 更鲁棒但可能可见
  • is_video: 处理单张图像时设为 false,视频设为 true
  • lowres_attenuation: 高分辨率视频建议开启以节省显存
  • batch_size: 默认 64(嵌入)/ 64(检测),显存不足时降低此值

工作流文件

项目 workflows/ 目录包含两个可直接拖入 ComfyUI 的样例工作流:

| 文件 | 内容 | |------|------| | videoseal_image_watermark.json | 图像水印嵌入 + 检测 + 保存 | | videoseal_video_watermark.json | 视频水印嵌入 + 检测 + 合成 |


注意事项

  1. 首次加载需要下载约 500MB 模型,请确保网络通畅
  2. 高分辨率视频建议开启 lowres_attenuation,否则可能 OOM
  3. 检测精度受视频压缩影响,H.264 压缩后准确率会下降(90% → 60–80%)
  4. 消息位长videosealpixelseal 为 256 bit,chunkyseal 为 1024 bit
  5. 节点内部会自动修复 pip 分发的 videoseal 包缺失的配置文件,无需手动操作

技术参考

许可证

MIT