返回更新列表
新发布Sep 4, 2026

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 的原始分辨率和不可见水印移除是付费的。

PyPI Python Downloads License Tests Sponsor skills.sh

本项目用于对你拥有的内容进行合法使用。它不针对图库机构预览图或其他保护第三方付费内容的水印。 参见范围、安全和法律说明

选择你想做的事情

目标命令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]

较低层级和专门的附加项包括 pixelsheiftrustmarkmiganlamadiffusionclassify-onnxsource-classify安装指南记录了它们的确切依赖组成、Python 兼容性和模型要求。

快速开始

安装以元数据为重点的默认 CLI:```bash uv tool install remove-ai-watermarks

检查镜像:```bash
remove-ai-watermarks identify image.png

要从像素对照片进行分类(AI 与相机,可选提供者),请安装额外组件并调用 classifyidentify 永远不会启动它:```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 元数据列表)。同一元数据列表结构中带键的 workflowprompt 条目也会被检测并移除,包括 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 标记

| 之前 | 之后 |
| --- | --- |
| ![带有可见 Gemini 水印的图像](https://assets.kitploit.com/production/public/readmes/7369/4f6643f46057e4a4ec503f5bf0daf7243768915090f2d7fc5ac183c2d928c5ca.png) | ![移除可见水印后的图像](https://assets.kitploit.com/production/public/readmes/7369/45193ef965a27342b183a1834b01ef812f653da2ec356a81fce1aed79f1ef814.png) |

`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 示例处理后 |
| --- | --- |
| [![OpenAI portrait grid before qwen-zimage](https://assets.kitploit.com/production/public/readmes/7369/28ff8732b037f98a4ef5bc277bbcdaa32e5eb9ccbd00b6c8c616e46ef68ae8a0.png)](data/synthid/originals/ChatGPT%20Image%20May%2030,%202026,%2010_31_08%20AM.png) | [![OpenAI portrait grid after qwen-zimage](https://assets.kitploit.com/production/public/readmes/7369/8066deab6162ef4fba352ffb475a119bfe94f097a4f5531e0fe141cbb8e089b5.png)](docs/images/qwen-zimage/ChatGPT/ChatGPT%20Image%20May%2030,%202026,%2010_31_08%20AM_full_clean.png) |

| Gemini 示例处理前 | Gemini 示例处理后 |
| --- | --- |
| [![Gemini sign before qwen-zimage](https://assets.kitploit.com/production/public/readmes/7369/4affd7f27767a445db6abf741355743ba8d95108ad922c9fff045feed8492236.png)](data/synthid/originals/Gemini_Generated_Image_633uuy633uuy633u.png) | [![Gemini sign after qwen-zimage](https://assets.kitploit.com/production/public/readmes/7369/42858417874f6cd8bc7c9bdb39f6bde8aa32310a3e219e7ee2dff23a4742c7b1.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

工具

### 减少 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_allremove_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。

分类