项目详情
watermarks-remover
隐私优先的去水印工具——从你自己拥有的内容里剥掉 AI 厂商埋下的溯源标记:隐形 Unicode、统计水印、C2PA 元数据
GitHub 地址
MIT
21.8k Stars · 33 天
Python stdlib 零依赖
v0.7.0
更新于 2026-09-13
← 返回汇总
项目速览
一句话定位
AI 溯源水印的「反编译器」
Agent skill + 纯 stdlib Python 服务,多层剥离 AI 内容溯源标记:Layer A 确定性清除隐形 Unicode(零宽字符、双向控制、标签密文);Layer B 用改写博弈对抗统计型文本水印(SynthID-Text / Kirchenbauer / keyed-Gumbel 类);文件层清除 C2PA / EXIF / XMP 元数据,覆盖 20+ 格式。定位「content you own」的隐私与卫生需求。配套 MarkLLM/CtrlRegen 等研究级验证链。伦理敏感:它同时是透明度基建的对手方。
项目速览
核心数据
- 病毒式增长:2026-08-11 创建,一个月 21.8k stars / 45 贡献者 / 286 commits——pent-up 需求的爆发样本
- 发布节奏密集:v0.0.1 → v0.7.0 一个月内七版,从 Claude 专用(remove-claude-marks)扩展到多厂商
- 零依赖哲学:核心全 Python stdlib(3.10+),无 pip 依赖;重工具(MarkLLM/CtrlRegen)全部外挂运行时加载
- 工程克制:1.7 MB Python 代码量,测试/CI/pre-commit/hooks 配套齐全(CodeRabbit 审查配置都在)
为什么存在
一场被法规点燃的军备竞赛
EU AI Act Art.50 / SB 942 强制披露
→
厂商埋两层水印
→
用户要拿掉自己内容上的标记
→
本项目:三层反制
厂商的两层水印模型
- 硬绑定层:C2PA 清单(图像/文档元数据),行业标准,可验证
- 软绑定层:SynthID 类不可感知水印——文本改 token 采样分布,图像藏像素域信号
需求侧的真实焦虑
- 「AI 味」污名:带水印=被识别为 AI 生成,内容贬值
- 隐私:内容会暴露用了哪家模型、什么时候用的
- 所有权边界:自己付费生成的 内容,标记算谁的?
注:Google 已于 2026-08 在 API 上退役 SynthID 文本水印(项目 vendor-notes 有记录);行业攻防仍在演变。
🔥 核心架构
三层武器库:确定性 → 统计博弈 → 元数据
Layer A 确定性
Layer B 统计博弈
文件层元数据
🔥 分发设计
Skill 是薄客户端,Hook 是确定性轨道
主链路
确定性 Hook(不依赖模型配合)
概率/可选路径
- 双轨设计是点睛之笔:skill 是「模型自觉」(会忘),hook 是「harness 强制」(忘不掉)——README 原话:让模型配合的指令,不如不需要配合的钩子
- 两条命令装完:Claude Code plugin marketplace 分发,自动更新;skill 本体零代码、零 Python 依赖
核心机制
Layer A:肉眼不可见 ≠ 检测不到
| 类别 | 代表码点 | 说明 |
| 零宽字符 | U+200B/C/D · U+FEFF | 零宽空格/非连接符/连接符——最经典的隐形载体,插在词中完全不可见 |
| 软连字符 | U+00AD | 只在断行时显示的连字符,正文中隐形 |
| 双向控制 | U+202A-E · U+2066-9 | 文本方向覆盖/隔离,既能藏标记也能做视觉欺骗攻击 |
| 变体选择符 | U+FE00-FE0F | emoji 修饰位,16 个可用作信息编码 |
| 标签字符 | U+E0000-E007F | 可拼出完整 ASCII 密文(如隐藏 TRACK-ID),渲染完全不可见但机器可读——本项目可解码显示 |
| 异形空格 | U+00A0 · U+2000-A · U+3000 | 上下文相关:法文排版合法使用,提供 --no-normalize-spaces 保留选项 |
工程细节见真章:文本工具拒绝二进制输入(防把 docx 当文本写坏)、未知格式拒绝自动清洗(exit 2 不写输出)、magic number + 控制字节比例双保险识别。
核心机制
Layer B:与统计水印的改写博弈
- 问题本质不同:统计水印不藏在某个字符里——它改变 token 采样的概率分布(绿名单偏置 / Gumbel 哈希),没有「删掉哪一行」的答案
- 解法是改写:默认策略
paraphrase@0.8 + mlm@0.2(LLM 意译 + RoBERTa 掩码重写混合),把分布偏置稀释掉
- 检测引导迭代:每轮生成候选 → 评估器检测 → 未过则再改,
--max-loops 封顶;评估器优先级 gumbel 同 key 重放 > MarkLLM > 词汇散度
- 防重盖章:必须用非同源模型改写(用水印模型自己改会重新印上水印),
--restamp-control 专门度量此事
- 诚实边界:MarkLLM/Gumbel 都是「同配置/同密钥验证 harness」,不是厂商 oracle——检测不出 ≠ 厂商也检测不出,README 反复强调
- 质量代价:改写会损失文风与精度(v0.2.0 changelog 明确加了 disclaimer)
核心机制
图像域:像素级水印的再生清除
- CtrlRegen 再生管线(ICLR 2025):ControlNet + DINOv2 条件再生,从干净噪声重建图像——水印埋在生成分布里,重生成即甩掉
- 强度阶梯保守:0.15 最小 / 0.25 默认 / 0.35 平衡 / 0.5 激进 / 0.7 上限——强度越高去得越净但图像变形越多
- 512×512 原生 + 自动瓦片:大图 512px 块 + 192px 重叠 + 余弦融合接缝,输出回原尺寸并色彩匹配
- 验证闭环:reverse-SynthID 评分器(外挂)出 before/after 分数,官方 Google SynthID 检查仍是最终裁判
# 元数据 + 像素域一条龙
python3 clean_image.py shot.png \
-o shot.cleaned.png \
--remove-pixel ctrlregen
# 顺序:元数据剥离 →
# CtrlRegen 像素再生 →
# SynthID 前后评分(可选)
# ~10GB 模型下载 · GPU 推荐
# 依赖隔离在专用 venv,
# 不污染主服务镜像
另备 MarkDiffusion 的 DiffusionPurification(盲再生)作为对照引擎,默认更保守(0.3)。
研究深水区
stealer:黑盒水印窃取
大量良性 prompt 询问水印模型
→
统计上下文→token 提升比
→
估计 s*(token|context)
→
清洗时降权「绿」token
- ETH SRI 研究路线的实现:不破解密钥,而是统计估计水印偏置哪些 token——s* 是估计器,不是真实绿名单
- 为什么有意义:把「盲目改写」升级为「定向降权」——知道模型偏爱哪些 token,就能精准避开,减少改写损伤
- 工程配套:prompt 语料下载器(默认 30k C4 RealNewsLike)+ tokenizer 计数 + 评分器 CLI
- 定位克制:明确标注「research / robustness tooling,仅限授权测试的模型」+ honest-use 章节
工程质量
这份 README 的诚实度是范本级
- harness ≠ oracle 全程划清:MarkLLM「同配置才有效,不能证明厂商检测器会失败」;Gumbel「同密钥重放,阴性不说明任何事」——每个验证器都写明失效条件
- 许可证合规隔离:reverse-SynthID(非商业研究许可)与 noai-watermark(无 LICENSE,按保留所有权利处理)绝不打包发布——本地构建、pinned commit、运行时加载,镜像不重新分发上游代码
- fail-soft 设计:检测器未配置/超时/报错 → 返回
available: false,清洗不受阻;改写循环回退到词汇散度选择
- 拒绝模式:文本工具拒二进制、未知格式拒自动清洗、配置文件 1MiB 上限、
trust_remote_code 永不开启、API key 永不进 argv
- 安全隐患自己招:引文收了「Removing the Watermark Is Not Enough」——清除仍留法证痕迹,所以强度默认保守
- 密码学细节可审计:Gumbel 检测用精确 Poisson 求和恒等式,模块 docstring 说明哪些部分需要适配才能对上具体引擎
适用场景
谁该用,谁离远点
适合
- 付费生成内容的个人/团队,要求交付物不带厂商遥测(隐私立场)
- 水印鲁棒性研究者:现成的清除基线 + 验证 harness + benchmark 协议
- 出版/法务:检测内容里被恶意植入的隐藏字符(如供应链投毒的 tag 密文)——只跑 /inspect 不清除
- AI 工程师学习 skill/hook 双轨架构与许可证合规分发
跳过
- 想洗掉他人作品的溯源标记再冒充原创——法律与道德双重红线
- 平台合规团队:你的对手正在用这类工具,但你不该用它
- 期望「完美清除」:Layer B 改写有质量代价,像素再生有保真损失
- 把 detect 的阴性当安全结论——项目自己说了那什么都不是
风险提示
需要警惕
- 法律灰色中的灰色:清除自己内容上的标记可能违反厂商 ToS;用于他人内容可能构成欺诈/版权侵权;EU AI Act 透明度义务的「规避」在部分司法辖区有专门罚则——「content you own」是作者的自我设限,不是法律护身符
- 不可能定理在对面:「Watermarks in the Sand」(ICML 2024)证明生成模型强水印不可能——厂商终会输掉军备竞赛,但赛程以年计,期间检测手段也在进化(如法证残留)
- 双重用途无法杜绝:同一把刀,隐私派当瑞士军刀,造假者当洗白流水线——项目用文档自律(own content / 授权测试),代码拦不住用途
- 项目极年轻:33 天历史、v0.7.0,API 与规则表仍在快速变动;单一主维护者
- 对抗成本不对称:Layer B 需要配 LLM 后端与 GPU 工具链,个人「隐私卫生」场景实际用起来并不轻
潜力评估
评分:8.0 / 10 · tracking
作为软件:一个月内做到「研究级深度 + 范本级诚实文档 + 零依赖分发」,工程罕见。作为社会现象:它是水印军备竞赛的第一块公开阵地,无论存活与否都会被论文引用。跟踪它的正确姿势:当「攻方能力上限」的仪表盘看,而不是当日常工具囤。
在线体验
Layer A 隐形字符检测器
粘贴任意文本,扫描藏在里面的零宽字符、双向控制符和标签密文——试着解码一段藏了 TRACK-ID 的污染样本,再一键清除。与真实项目 clean_text.py 同一套规则语义的浏览器版。
进入 Playground →