
remove-ai-watermarks v0.37.1
移除图像和视频中可见与不可见的 AI 水印及来源元数据。用于 SynthID、C2PA、EXIF、IPTC、XMP 以及常见生成式 AI 标记的 Python 库和 CLI。
移除 AI 水印
从你自己生成的图像和视频中移除 AI 溯源标记:
- 已知的可见标签,例如 Google Gemini 星芒水印和厂商文字标记;
- 通过直接本地格式破坏或扩散再生成来移除不可见像素水印;
- C2PA、EXIF、XMP、IPTC 及相关 AI 元数据。
视频支持涵盖溯源识别、完整的可见标记加元数据清理、目录批量处理、可见的 Sora、Veo、Seedance、Doubao、Dola、Hailuo AI 和 Kling AI 标记移除,以及用于视频 SynthID 移除的 oracle 认证 VAE 再生成。
raiw.cc 将此库作为托管服务运行,包含 GPU,无需安装任何东西。在那里,标准输出下最高 12 MP 的可见标记和元数据移除是免费的;超过 12 MP 的原始分辨率和不可见水印移除是付费的。
本项目用于对你拥有的内容进行合法使用。它不针对图库机构预览图或其他保护第三方付费内容的水印。 参见范围、安全和法律说明。
选择你想做的事情
| 目标 | 命令 | GPU |
|---|---|---|
| 查找溯源信号和水印 | identify | 否 |
| 从像素对照片进行分类(可选加入,非溯源) | classify | 否 |
| 移除已知的可见 AI 标记 | visible | 否 |
| 擦除你选择的区域 | erase | 否 |
| 剥离 AI 元数据 | metadata | 否 |
| 识别支持的视频溯源 | video identify | 否 |
| 从视频中移除可见标记和 AI 元数据 | video all | 否 |
| 从视频中剥离 AI 元数据 | video metadata | 否 |
| 从视频中移除已注册的可见 AI 标记 | video visible | 否 |
| 处理视频目录 | video batch | 取决于模式 |
| 应用校准的视频像素 SynthID 移除配置 | video invisible | 推荐 |
| 再生成图像以破坏不可见水印 | invisible | 必需(CUDA) |
| 运行可见、不可见和元数据移除 | all | 推荐 |
| 处理目录 | batch | 取决于模式 |
Microsoft Paint 和 Photos InvisMark 声明会自动路由到像素再生成。all 命令会同时移除隐藏的像素水印及其关联的 C2PA 清单;仅元数据剥离只移除清单。专门的 Python API 可以在不进行扩散的情况下检查并破坏已验证的本地 Watermarker.dll 载荷。
安装模式
| 需求 | 安装 |
|---|---|
| 元数据检查和剥离 | remove-ai-watermarks |
| 照片 AI 与相机分类 | remove-ai-watermarks[classify] |
| OpenAI/Google/未知来源导出分类 | remove-ai-watermarks[source-classify] |
| 可见检测和移除 | remove-ai-watermarks[visible] |
| 可见视频处理 | remove-ai-watermarks[video] |
| 视频 SynthID 移除 | remove-ai-watermarks[video,diffusion] |
| 无 Torch 的 DWT-DCT 检测 | remove-ai-watermarks[detect] |
| 直接本地 Paint InvisMark 破坏 | remove-ai-watermarks[pixels] |
| 不可见图像移除(需要 CUDA) | remove-ai-watermarks[qwen-zimage] |
| 活动 Python 上可用的所有生产功能 | remove-ai-watermarks[all] |
较低层级和专门的附加项包括 pixels、heif、trustmark、migan、lama、diffusion、classify-onnx 和 source-classify。安装指南记录了它们的确切依赖组成、Python 兼容性和模型要求。
快速开始
安装以元数据为重点的默认 CLI:```bash uv tool install remove-ai-watermarks
检查镜像:```bash
remove-ai-watermarks identify image.png
要从像素对照片进行分类(AI 与相机,可选提供者),请安装额外组件并调用 classify。identify 永远不会启动它:```bash
uv tool install --force "remove-ai-watermarks[classify]"
remove-ai-watermarks classify image.png
指南:[照片像素分类](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/photo-classify.md)。
若需在移除元数据后获得一个轻量级、可弃权的 OpenAI/Google/未知来源导出信号,请使用单独的 Python API。它并非 SynthID 检测器:```python
import remove_ai_watermarks as raiw
result = raiw.classify_source("image.png")
print(result.label, result.reason)
安装 remove-ai-watermarks[source-classify]。指南:
source-pipeline classification。
签名溯源是 SynthID 的受支持途径,identify 会读取它。
该包中没有本地 SynthID 像素检测器。关于
周期性晶格专家的研究位于 scripts/synthid_runtime/ 和
synthid-detector-research.md。
对于可见水印移除,请安装像素依赖:```bash uv tool install --force "remove-ai-watermarks[visible]"
然后移除一个已知的可见标记和 AI 元数据:```bash
remove-ai-watermarks visible image.png -o clean.png
去除元数据,而不运行可见的修复或扩散:```bash remove-ai-watermarks metadata image.png --remove -o clean.png
不带 `-o` 时,此命令会就地覆盖源文件。
检查或移除 MP4、MOV、M4V、WebM、MKV、AVI 或 FLV 文件中的 AI 元数据:```bash
remove-ai-watermarks video metadata input.mp4 --check
remove-ai-watermarks video metadata input.mp4 --remove -o clean.mp4
video metadata 命令不会对视频或音频流进行转码。与上面的 image 命令不同,当省略 -o 时,它会写入 <source>_clean 并保留原始文件。MP4 和 MOV 检查会包含 moov.udta.meta.keys/ilst 中的原生 TC260 AIGC 标签,包括位于媒体负载之后的 moov,以及豆包 iOS 导出所写入的 QuickTime 形式 meta 变体(作为 moov 直接子级的裸 meta box,以及无键的 hdlr=mdir 元数据列表)。同一元数据列表结构中带键的 workflow 和 prompt 条目也会被检测并移除,包括 ComfyUI 导出。MKV 和 WebM 检查会读取规范性的 Segment.Tags.Tag.SimpleTag 位置。AVI 使用 LIST/INFO/AIGC,而 FLV 使用 script.onMetaData.AIGC。非 ISOBMFF 格式通过流复制进行重封装以移除。
使用面向产品的视频路径来识别或清理文件:```bash uv tool install --force "remove-ai-watermarks[video]" remove-ai-watermarks video identify input.mp4 remove-ai-watermarks video all input.mp4 -o clean.mp4
`video all` 在存在稳定注册的可见标记时将其移除,并始终剥离已验证的 AI 元数据。如果两种信号都未找到,它仍会写入同容器透传文件,因此应用程序调用方获得一个可预测的输出契约。专有隐形视频移除默认被排除。
`--invisible` 选择启用有损的、经 oracle 认证的视频 SynthID 配置文件。
使用相同契约处理目录:```bash
remove-ai-watermarks video batch ./videos --mode all
移除受支持的可见视频标记:```bash remove-ai-watermarks video visible input.mp4 -o clean.mp4 remove-ai-watermarks video visible veo.mp4 --mark veo -o veo_clean.mp4 remove-ai-watermarks video visible seedance.mp4 --mark seedance -o seedance_clean.mp4 remove-ai-watermarks video visible dola.mp4 --mark dola -o dola_clean.mp4 remove-ai-watermarks video visible hailuo.mp4 --mark hailuo -o hailuo_clean.mp4 remove-ai-watermarks video visible kling.mp4 --mark kling -o kling_clean.mp4
此路径在更改像素之前会扫描完整序列。它只接受在相邻帧中稳定位置重复出现的标记,然后复用与图像移除相同的 OpenCV、MI-GAN 或 LaMa 填充后端。音频直接复制而不重新编码,并允许其自然结束;视频流则因像素变化而进行转码。默认情况下,一个受保护的光流处理会对先前接受的填充进行运动对齐,并且仅在附近源上下文一致时才进行混合;使用 `--no-temporal-consistency` 可将其禁用。
编码器保留受支持的
8 位源色度采样、颜色标签以及 MP4/MOV 轨道时间刻度,而不是依赖 ffmpeg 隐式的原始 BGR 默认值。可变帧间隔通过带时间戳的内存 NUT 桥接得以保留,而不是被展平为平均帧率。非零源起始时间戳与复制的音频偏移一起保留。默认的 `--mark auto`
在一次解码过程中扫描所有提供程序,并按下面显示的特异性顺序选择第一个稳定匹配项。传入显式标记可将检测限制为单个提供程序。
Sora 覆盖移动的 Sora 2 吉祥物和字标。Veo 覆盖当前的四点菱形以及旧版 `Veo` 文本。Seedance 覆盖固定的带框
`AI` 标签,Dola 覆盖固定的 `Dola AI` 文本,Hailuo AI 覆盖复合的
`MINIMAX | hailuo AI` 标签,Kling AI 覆盖右下角的 `KLING AI` 或
`KlingAI` 标签及其版本后缀。完成的编码以原子方式发布。未找到稳定标记时不写入任何输出。
HDR、PQ/HLG 以及大于 8 位的输入会在编码前被拒绝,而不是通过 OpenCV 的 8 位 BGR 边界被静默降级。
应用校准后的视频像素 SynthID 移除配置文件:```bash
uv tool install --force "remove-ai-watermarks[video,diffusion]"
remove-ai-watermarks video invisible input.mp4 -o clean.mp4
此路径通过一个跨时间共享的潜在噪声场重新生成完整序列,复制完整音频,剥离源元数据,并以原子方式发布完成的编码。默认的 noise_std=0.15 配置同时通过了两载波校准和完整的公开八秒 Veo oracle 检查。Google 不发布本地解码器,因此对于异常重要的文件或提供商变更后,重新进行提供商检查仍然有用,但这并非产品结果状态。因此,CLI 描述的是视频像素重新生成,而非声称逐文件的 SynthID 判定,并将复制的音频水印报告为 UNVERIFIED。
若要通过 CLI 或高级 API 进行不可见水印移除,请安装 qwen-zimage 附加组件。需要 NVIDIA GPU:所有扩散配置均为仅限 CUDA,没有 CPU 或 MPS 回退。专用的本地 Paint API 使用 pixels 附加组件,无需 CUDA。```bash
uv tool install --force "remove-ai-watermarks[qwen-zimage]"
remove-ai-watermarks invisible image.png -o clean.png
如果本地检测器无法确认不可见水印,但你知道该图像来自 AI 生成器,请添加 `--force`:```bash
remove-ai-watermarks invisible image.png -o clean.png --force
排版密集型图像可以选择启用实验性的已验证文本后处理。
它接受人工审核过的字符串和行框,或操作员验证过的
仅几何清单;它从不将原始 OCR 输出视为基准真值,也不会
自动运行:```bash
uv tool install --force "remove-ai-watermarks[text-restoration]"
remove-ai-watermarks invisible image.png -o clean.png
--text-manifest verified-lines.json --force
有关 manifest 模式、兼容性限制和 oracle 注意事项,请参阅 [CLI 指南](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/cli.md#restore-operator-verified-text)。
有关 Homebrew、uv、可选功能和开发环境设置,请参阅 [安装指南](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/installation.md)。
## 示例
### 可见的 Gemini 标记
| 之前 | 之后 |
| --- | --- |
|  |  |
`after` 光栅图由已跟踪的 `before` 光栅图通过公共路径生成:```bash
uv run remove-ai-watermarks visible demo_banana_before.png \
--backend cv2 -o demo_banana_after.png
高质量无痕移除
qwen-zimage 是默认配置:在 Canny ControlNet 下执行一次 Qwen-Image-2512 Lightning 处理,随后对检测到的任何人脸进行 SAM 掩码的 Z-Image 修复。替代方案 sdxl-zimage 将全局阶段替换为 SDXL,并保留相同的人脸阶段。第三种配置 chroma-zimage 使用 Apache-2.0 Chroma1 全局处理及其自身的扁平供应商下限;校准信息请参见 docs/chroma1-engine-research.md。--pipeline auto 会为 Google 选择 sdxl-zimage,为 Microsoft 选择 chroma-zimage,其他情况则选择 qwen-zimage。所有配置均仅支持 CUDA。```bash
uv tool install --force "remove-ai-watermarks[qwen-zimage]"
remove-ai-watermarks invisible image.png -o clean.png --force
| OpenAI 示例处理前 | OpenAI 示例处理后 |
| --- | --- |
| [](data/synthid/originals/ChatGPT%20Image%20May%2030,%202026,%2010_31_08%20AM.png) | [](docs/images/qwen-zimage/ChatGPT/ChatGPT%20Image%20May%2030,%202026,%2010_31_08%20AM_full_clean.png) |
| Gemini 示例处理前 | Gemini 示例处理后 |
| --- | --- |
| [](data/synthid/originals/Gemini_Generated_Image_633uuy633uuy633u.png) | [](docs/images/qwen-zimage/Gemini/Gemini_Generated_Image_633uuy633uuy633u_full_clean.png) |
这些确切的输出文件已使用匹配的提供商验证器进行检查。该结果适用于这些文件,而不适用于每个种子、图像或未来的水印版本。
## 常用配方
### 移除所有检测到的可见标记```bash
remove-ai-watermarks visible image.png -o clean.png
默认的 --mark auto 会检查所有已注册的可见标记并移除每一个匹配项。如果标记对你可见但检测器未能识别,请显式选择其区域:```bash
remove-ai-watermarks erase image.png
--region 1640,1930,400,100
-o clean.png
`--region` 使用 `x,y,width,height`,并且可以重复指定。
### 使用学习型填充后端
当未安装学习型后端时,`visible` extra 会使用 OpenCV 修复。
对于更复杂的背景,学习型后端 extra 会自动包含相同的
像素依赖项:```bash
uv tool install --force "remove-ai-watermarks[migan]"
remove-ai-watermarks visible image.png -o clean.png --backend migan
工具
- C2 框架
- 反病毒规避
- 漏洞利用
- 网络钓鱼
- Web 应用利用
- 后利用
- 命令与控制
- 横向移动
- 持久化
- 权限提升
- 侦察
- 凭据访问
- 社会工程学
- 杂项```bash uv tool install --force "remove-ai-watermarks[lama]" remove-ai-watermarks visible image.png -o clean.png --backend lama
### 减少 CUDA 内存占用```bash
remove-ai-watermarks invisible image.png -o clean.png \
--cpu-offload --force
CPU offload 通过在 CPU 和 GPU 之间移动模型组件来降低 CUDA 内存压力,代价是速度。
处理目录```bash
remove-ai-watermarks batch ./images --mode visible remove-ai-watermarks batch ./images --mode all
## 工具可识别的标记
可见标记支持包括:
- Google Gemini 和 Nano Banana 可见闪光水印;
- 豆包、即梦字标及左上角 `AI生成` 胶囊标签、通义千问、可灵 AI、
腾讯元宝、百度、LiblibAI 底部居中字标及紧凑左上角胶囊标签,
以及 RunningHub 标签;
- 一个经过校准的 Microsoft 右上角白色 AI 徽章变体;
- 一个经过校准的 Samsung Galaxy AI 标签变体。
元数据与来源信息检查涵盖 C2PA、EXIF、XMP、IPTC、图像和视频容器中的常见
生成器参数、中国 TC260 AIGC 标签,
以及若干厂商特定信号。可选解码器增加了对开放 DWT-DCT 水印和 Adobe TrustMark 的支持。
完整的支持矩阵,包括重要的区域设置和检测器限制,见
[支持的信号](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/supported-signals.md)。
[合成示例库](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/data/fixtures/visible/README.md) 为每个已注册的图像和视频标记
提供了一个标准样本。
## 工作原理
可见标记移除遵循三个步骤:
1. 在预期区域内检测已注册的标记。
2. 围绕标记构建掩码。
3. 仅使用 OpenCV、MI-GAN 或 LaMa 填充掩码区域。
元数据移除采用格式感知的剥离方式。JPEG 元数据移除会保留已编码的图像扫描数据,
而不是重新压缩它。原生 MP4/MOV TC260 值和键控生成参数
在不改变盒子大小或媒体偏移的情况下被清空。其他支持的容器使用其对应的元数据
路径。
通过 CLI 和高级 API 进行的不可见移除会通过
扩散管道重新生成图像。专用调用方也可以改为解码并干扰
已明确识别的本地 Microsoft Paint 格式,且像素改动要小得多。
两种路径都无法保证每个专有验证器都会拒绝每一个输出。
完整的技术边界见[支持的信号](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/supported-signals.md)和
[已知限制](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/known-limitations.md)。
## Python API
可见标记移除 API 需要 `remove-ai-watermarks[visible]`。```python
import remove_ai_watermarks as raiw
result, removed = raiw.remove_visible("watermarked.png", "clean.png")
print(removed)
report = raiw.remove_visible_detailed("watermarked.png", "clean.png")
print(report.status) # cleaned | partial | unvalidated | no_watermark
complete = raiw.remove_all("watermarked.png", "clean.png")
print(complete.visible_status, complete.visible_marks)
images = raiw.remove_batch("images", "images_clean", mode="visible")
for item in images.items:
print(item.source, item.visible_status, item.visible_marks)
provenance = raiw.identify_video("input.mp4")
report = raiw.inspect_video_metadata("input.mp4")
complete = raiw.remove_video_all("input.mp4", "clean.mp4")
print(complete.visual_invisible_action, complete.audio.watermark_status)
batch = raiw.remove_video_batch("videos", "videos_clean")
cleaned = raiw.remove_video_metadata("input.mp4")
synthid_cleaned = raiw.remove_video_invisible("input.mp4", "synthid_clean.mp4")
print(synthid_cleaned.visual_invisible_action, synthid_cleaned.audio.watermark_status)
visible = raiw.remove_video_visible("input.mp4", "clean.mp4")
print(visible.mark)
veo = raiw.remove_video_visible("veo.mp4", "veo_clean.mp4", mark="veo")
seedance = raiw.remove_video_visible(
"seedance.mp4",
"seedance_clean.mp4",
mark="seedance",
)
dola = raiw.remove_video_visible("dola.mp4", "dola_clean.mp4", mark="dola")
高级 API 接受文件路径或 BGR NumPy 数组。对于路径输入,它还会读取来源元数据、保留 alpha 通道,并可从写入结果中剥离 AI 元数据。
有关可见水印移除、完整的 remove_all 和 remove_batch 流水线、来源检查、元数据剥离以及扩散模型用法,请参阅 Python API 指南。
Agent 技能
编码代理可以安装已发布的技能并驱动此 CLI:```bash npx skills add wiltodelta/remove-ai-watermarks
Claude Code 可以将此仓库添加为插件市场:```text
/plugin marketplace add wiltodelta/remove-ai-watermarks
/plugin install remove-ai-watermarks@remove-ai-watermarks
该技能拒绝图库机构及其他第三方付费素材标记。参见 代理技能指南。
ComfyUI
独立的 ComfyUI Remove AI Watermarks 包提供了用于可见移除、检测、区域擦除和 不可见移除的节点。
重要限制
- 缺少本地信号意味着未知,而非干净。在元数据被剥离后,专有像素 水印可能仍然存在。
- 可见移除会重建一个小区域。结果取决于背景 和所选的填充后端。
- 不可见移除会改变整张图像,并可能改变人脸、文字或精细 细节。
- 可见视频移除可识别移动的 Sora 2 字标、当前的 Veo
菱形标志及旧版
Veo文字、Seedance 方框AI标签,以及固定的 Doubao、Dola、Hailuo AI 和 Kling AI 标签。它不识别较旧的 Sora Turbo 角落漩涡标志或来自这些提供商的未注册布局。 经典 OpenCV 后端可能会涂抹结构化背景;当恢复质量很重要时,请使用 MI-GAN 或 LaMa。 - 视频 SynthID 重新生成会改变分辨率、帧率和图像细节。 随附的配置文件已通过 oracle 认证,但没有任何公开的本地解码器能在运行时 认证任意输出。在提供商变更后,请重新检查特别重要的输出。
- 通过 CLI 和高级 API 进行不可见水印移除需要 CUDA。
所有扩散配置文件在构造时都会拒绝任何其他设备,而不是
回退到无法运行它们的设备。专用的本地 Paint API、
可见移除、元数据剥离和
identify无需 CUDA 即可运行。 - 提供商水印系统可能会发生变化。在可用时,请使用 提供商自己的验证器验证重要输出。
随附的 video invisible 命令使用经过认证的 noise_std=0.15
配置文件。配套的 scripts/video_synthid_sweep.py 研究工具会构建
一个匹配的重新编码对照以及 VAE 重新生成的候选样本,并将验证器判定留空:```bash
uv run --extra video --extra diffusion python scripts/video_synthid_sweep.py input.mp4 -o sweep/
要评估输出实际付出的代价,请使用 `scripts/video_fidelity_probe.py`:
引擎自身的 PSNR 是在输入缩放之后、最终编码之前测量的,
因此只有探针能看到实际交付的画面。```bash
uv run --extra video python scripts/video_fidelity_probe.py input.mp4 input_clean.mp4
控制样本在阴性候选样本能够作为移除证据之前,仍必须保持 SynthID 阳性。在 2026-07-29 的双片段校准中,两个匹配的对照样本在 Gemini 内置的 SynthID 验证器中均为阳性;较强的候选样本在两个载体上均为阴性,而较弱的候选样本仅在一个载体上为阴性。随后进行的一项对抗性跟进测试要求普通 Gemini 重新解释像素结果,返回了 UNAVAILABLE;该跟进测试并非验证器重跑,因此不会使内置判定失效。2026-07-31 对一段公开的八秒 Veo 样本进行的全片段检查发现,0.10 仍被检测到,而 0.15 未被检测到,因此 0.15 现已成为认证默认值。该全片段检查的可复现哈希与判定结果——一个载体,两行——位于 data/evaluations/video-synthid-oracle.csv。较早的双片段校准仅为叙述性内容:其判定结果未记录在受跟踪的清单中,因此应将认证默认值视为基于 2026-07-31 的行。
文档
请从文档索引开始。
研究笔记和历史实验单独列在文档索引中。它们解释了过去的决策,但不定义当前的公共 API。
贡献
安装开发环境并运行项目门禁:```bash uv sync --frozen --extra dev bash maintain.sh
在更改具有文档化不变量的子系统之前,请参阅[模块内部机制](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/docs/module-internals.md)。
## 许可证
[Apache 2.0](https://github.com/wiltodelta/remove-ai-watermarks/blob/main/LICENSE)。版权所有 2025-2026 wiltodelta。