remove-ai-watermarks

wiltodeltaApache-2.0活跃维护

从图片和视频中清除可见与不可见的 AI 水印,并移除 C2PA、EXIF 等来源元数据,提供 Python 库、CLI 和 agent skill。

Remove visible and invisible AI watermarks from images and video, and AI provenance metadata from images, video, and audio. Python library, CLI, and agent skill for SynthID, C2PA, EXIF, IPTC, XMP, and common generative-AI marks. By Victor Kuznetsov.

v0.56.0发布于 2026-11-11 00:43 UTC6,341star +35 / 7 天592fork同步于 2026-11-10 23:35 UTC

怎么上手

由 README 提炼,执行前请确认
uv tool install "remove-ai-watermarks[visible]"
remove-ai-watermarks visible image.png -o clean.png
硬件要求按 README 说明

不可见图像水印移除需要 CUDA GPU;视频 SynthID 移除建议使用 GPU;识别、可见水印移除和元数据剥离可不用 GPU。README 未说明具体显存和 GPU 型号要求。

需要 CUDA
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

移除自己生成的图像和视频中可见与不可见的 AI 水印及来源元数据

从图片和视频中清除可见与不可见的 AI 水印,并移除 C2PA、EXIF 等来源元数据,提供 Python 库、CLI 和 agent skill。

核心能力

  • 识别并移除 Gemini 闪光标等已知可见水印
  • 剥离 C2PA、EXIF、XMP、IPTC 等 AI 元数据
  • 用扩散重生成扰动不可见像素水印
  • 支持 Sora、Veo、Kling 等视频可见标记移除
  • 提供 Python 库、CLI 与 agent skill 三种用法

容易踩的坑

默认安装只含元数据功能,可见水印和不可见水印需分别安装 visible、qwen-zimage 等 extras;不可见图像水印移除依赖 CUDA,无 GPU 无法运行;metadata 命令不加 -o 会原地覆盖源文件,视频命令则默认另存 _clean。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.56.0
  1. v0.56.0最新正式版2026-11-11 · 2026-11-11 00:43 UTC

    This release adds text provenance tools, an opt-in Seedance video profile, and automatic FFmpeg setup for video installations.

    • Add experimental Seedance reconstruction to the Python API and existing video invisible, all, and batch pipelines, with delivery and master exports.
    • Include FFmpeg and ffprobe in the video extra. The library uses a complete system pair when available, otherwise extracts the installed offline bundle into the user cache without a runtime download.
    • Add text provenance inspection and stripping for C2PA wrappers, VSRMark, and Unicode steganography, plus span-protected local regeneration for token-level text watermarks.
    • Detect and strip CapCut provenance metadata, including MP4/MOV metadata beyond the initial scan window.
    • Preserve reordered frame ends, timestamps, and copied audio across FFmpeg versions, and reduce visible-label false positives on interface elements.
    • Update CLI, Python API, installation instructions, and Agent Skill 1.0.17. Fix README links and images on PyPI.

    The Seedance profile is experimental and opt-in. Original audio is copied and remains unverified for audio watermarks.

    Validation: 3,289 local tests passed, 4 skipped; all 13 CI jobs passed on the release commit, including Linux, macOS, Windows, offline video tools, and the full-clip video tests.

    Install video processing:

    pip install "remove-ai-watermarks[video]==0.56.0"
    

    Install the diffusion runtime for the experimental Seedance profile:

    pip install "remove-ai-watermarks[video,diffusion]==0.56.0"
    

    Full changes: https://github.com/wiltodelta/remove-ai-watermarks/compare/v0.55.0...v0.56.0

  2. v0.55.00.55.02026-11-09 · 2026-11-09 19:29 UTC
    查看更新说明

    Changes

    • 10-provider classify-source model (wiltodelta/raiw-source-classify, revision 32a52ed694f6287d5de35beb0c030e0b1b57f90c): updates the multi-provider-source-v3.npz weights (SHA-256 f65dac7cd7a6d8025e0b849bba9117635d6280628c226f47b599332898580f3c, Wave 24) trained on the expanded 204,050-sample corpus (185,099 train, 8,365 calibration, 10,586 locked test).
      • Stage-1 / Stage-1.5 router (54 primary specialist units + 1,590 auxiliary descriptors): achieves 69.97% aggregate target recall (4,231 / 6,047 TPs; 76.72% native recall, 35.74% recompressed recall; +804 TPs over v0.53.0), 98.42% provider accuracy among classified AI (97.92% overall precision), and 0.9577 binary ROC-AUC / 0.9682 PR-AUC.
      • Real-image specificity: 99.52% unknown specificity (22 / 4,539 FP, 0.48% FPR; 0.73% photographic FPR and 0.25% structured non-photographic FPR) on the locked 10,586-sample evaluation split, 99.91% (2 / 2,267 FP, 0.09% FPR; 0 FP on vector, interface, diagram, document, and stress_recompressed) on the external untouched selective-v8 blind benchmark, and 100.00% (0 / 60 FP) on uncurated phone receipts.
      • Stage-2 version attribution (2600-d): upgrades version_subfamily accuracy across multi-version providers (firefly 100.0%, google 93.7%, bytedance 92.0%, midjourney 91.1%, stable_diffusion 90.8%, flux 87.1%, openai 86.5%, xai 72.9%, ideogram 65.3%).
    • Non-SynthID image watermark routing, TrustMark P/Q/C removal, and benchmark adapters (bc199dd): extends non-SynthID invisible watermark identification and TrustMark variant P/Q/C removal routing plus Perth/PixelSeal/VideoSeal benchmark adapters.
    • Gemini visible sparkle detector (46a92bd): tightens the corner-geometry false-positive gate on bright edge highlights.

    Release verification

    Full changelog: https://github.com/wiltodelta/remove-ai-watermarks/compare/v0.54.1...v0.55.0

  3. source-classify-freeze-2026-11-09Multi-provider source-classify v3 freeze (2026-11-09)pre-release2026-11-09 · 2026-11-09 18:49 UTC
    查看更新说明

    Frozen pickle-free multi-provider-source-v3.npz (Wave 24, SHA-256: f65dac7cd7a6d8025e0b849bba9117635d6280628c226f47b599332898580f3c).

  4. v0.54.10.54.12026-11-06 · 2026-11-06 01:27 UTC
    查看更新说明

    Changes

    • Update locked Torch to 2.15.0, DiffSynth to 2.2.0, torchvision to 0.29.2 and their CUDA dependencies (#142).
    • Update locked OpenAI SDK and pytest dependencies.
    • Exclude incomplete C2PA releases from grouped dependency updates.
    • Document CI verification before release tagging.

    Validation

    The full local gate passed: 3,176 tests passed, four skipped. A clean Python 3.14 wheel installation reports 0.54.1. The release commit passed all 12 cross-platform CI jobs.

    Eight full qwen-zimage H100 runs compared four identical, previously processed JPEGs per runtime. Both versions completed with no new gross visual differences on this set. The original #140 inputs were unavailable. Forced reprocessing still exaggerates skin texture in one close-up in both runtimes.

    Full changelog: https://github.com/wiltodelta/remove-ai-watermarks/compare/v0.54.0...v0.54.1

  5. v0.54.02026-11-05 · 2026-11-05 01:41 UTC
    查看更新说明

    Fix color patches around the jaw and neck after the face pass (#140).

    The face stage now matches its smooth RGB tone to the regenerated global result before blending, while retaining regenerated fine detail. The correction uses the global result as its color reference.

    Also align OpenCV builds in the development environment and exclude C2PA releases missing binary wheels on affected platforms. Regression tests check wheel availability across the supported CI matrix.

    Validated the face correction on four full-resolution reporter images on CUDA. This checks the color fix; provider watermark verification of these new outputs remains unconfirmed.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Remove AI Watermarks

    Remove AI provenance marks from images and video you generated yourself:

    • known visible labels such as the Google Gemini sparkle watermark and vendor text marks;
    • invisible pixel watermarks through direct local-format disruption or diffusion regeneration;
    • C2PA, EXIF, XMP, IPTC, and related AI metadata.
    BeforeAfter
    Image with a visible Gemini watermarkImage after visible watermark removal
    uv tool install "remove-ai-watermarks[visible]"   # CLI for visible marks and metadata
    npx skills add wiltodelta/remove-ai-watermarks    # agent skill for Claude Code, Codex, Cursor, and other agents
    

    Video support covers provenance identification, complete visible-plus-metadata cleaning, directory batches, visible Sora, Veo, Seedance, Doubao, Dola, Hailuo AI, and Kling AI mark removal, and oracle-certified VAE regeneration for video SynthID removal.

    raiw.cc runs this library as a hosted service, with the GPU included and nothing to install. Visible mark and metadata removal at Standard output up to 12 MP are free there; original resolution above 12 MP and invisible watermark removal are paid.

    PyPI Python Downloads License Tests Sponsor skills.sh Glama MCP server

    This is a research project on AI provenance signals, for lawful use on content you own. It is provided as is, without warranty or liability, and each user is responsible for how they use it. It does not target stock agency previews or other watermarks that protect third party paid content. Some jurisdictions, including China, restrict removing AI labels or supplying tools that do. See scope, safety, and legal notes.

    Choose what you want to do

    GoalCommandGPU
    Find provenance signals and watermarksidentifyNo
    Classify a photograph from pixels (opt-in, not provenance)classifyNo
    Remove known visible AI marksvisibleNo
    Erase a region you selecteraseNo
    Strip AI metadatametadataNo
    Identify supported video provenancevideo identifyNo
    Remove visible marks and AI metadata from videovideo allNo
    Strip AI metadata from videovideo metadataNo
    Remove a registered visible AI mark from videovideo visibleNo
    Process a directory of videosvideo batchDepends on mode
    Apply the calibrated video-pixel SynthID-removal profilevideo invisibleRecommended
    Regenerate an image to disrupt invisible watermarksinvisibleRequired (CUDA)
    Run visible, invisible, and metadata removalallRecommended
    Process a directorybatchDepends on mode

    Microsoft Paint and Photos InvisMark declarations are routed automatically to pixel regeneration. The all command removes both the hidden pixel watermark and its linked C2PA manifest; metadata stripping alone removes only the manifest. A specialized Python API can inspect and disrupt the validated local Watermarker.dll payload without diffusion.

    Installation modes

    NeedInstall
    Metadata inspection and strippingremove-ai-watermarks
    Photograph AI-versus-camera classificationremove-ai-watermarks[classify]
    10-provider source-export & model-version classificationremove-ai-watermarks[source-classify]
    Visible detection and removalremove-ai-watermarks[visible]
    Visible video processingremove-ai-watermarks[video]
    Video SynthID removalremove-ai-watermarks[video,diffusion]
    Torch-free DWT-DCT detectionremove-ai-watermarks[detect]
    Direct local Paint InvisMark disruptionremove-ai-watermarks[pixels]
    Invisible image removal (needs CUDA)remove-ai-watermarks[qwen-zimage]
    Every production feature available on the active Pythonremove-ai-watermarks[all]

    Lower-level and specialized extras include pixels, heif, trustmark, migan, lama, diffusion, classify-onnx, and source-classify. The installation guide documents their exact dependency composition, Python compatibility, and model requirements.

    Quick start

    Install the metadata-focused default CLI:

    uv tool install remove-ai-watermarks
    

    Inspect an image:

    remove-ai-watermarks identify image.png
    

    To classify a photograph from pixels (AI versus camera, optional provider), install the extra and call classify. identify never starts it:

    uv tool install --force "remove-ai-watermarks[classify]"
    remove-ai-watermarks classify image.png
    

    Guide: photo pixel classification.

    For a lightweight, abstaining 10-provider source-export and model-version signal after metadata removal (classify_source and CLI classify-source), use the separate API or CLI command. It is not a SynthID detector:

    remove-ai-watermarks classify-source image.png
    
    import remove_ai_watermarks as raiw
    
    result = raiw.classify_source("image.png")
    print(result.label, result.version_subfamily, result.reason)
    

    Install remove-ai-watermarks[source-classify]. Guide: source-pipeline classification.

    Signed provenance is the supported route for SynthID and identify reads it. There is no local SynthID pixel detector in the package. Research on a periodic lattice expert is in scripts/synthid_runtime/ and synthid-detector-research.md.

    For visible watermark removal, install the pixel dependencies:

    uv tool install --force "remove-ai-watermarks[visible]"
    

    Then remove a known visible mark and AI metadata:

    remove-ai-watermarks visible image.png -o clean.png
    

    Strip metadata without running visible inpainting or diffusion:

    remove-ai-watermarks metadata image.png --remove -o clean.png
    

    Without -o this command overwrites the source in place.

    Inspect or remove AI metadata from an MP4, MOV, M4V, WebM, MKV, AVI, or FLV file:

    remove-ai-watermarks video metadata input.mp4 --check
    remove-ai-watermarks video metadata input.mp4 --remove -o clean.mp4
    

    The video metadata command does not transcode video or audio streams. Unlike the image command above, when -o is omitted it writes <source>_clean and preserves the original. MP4 and MOV inspection includes the native TC260 AIGC tag in moov.udta.meta.keys/ilst, including a moov placed after the media payload, plus the QuickTime-form meta variants Doubao's iOS export writes (a bare meta box as a direct moov child, and a keyless hdlr=mdir metadata list). Keyed workflow and prompt entries in the same metadata-list structure are also detected and removed, including ComfyUI exports. MKV and WebM inspection reads the normative Segment.Tags.Tag.SimpleTag placement. AVI uses LIST/INFO/AIGC, while FLV uses script.onMetaData.AIGC. The non-ISOBMFF formats are remuxed with stream copy for removal.

    Use the product-oriented video path to identify or clean a file:

    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 removes a stable registered visible mark when present and always strips verified AI metadata. If neither signal is found, it still writes a same-container passthrough, so application callers get one predictable output contract. Proprietary invisible-video removal is excluded by default. --invisible opts into the lossy, oracle-certified video SynthID profile.

    Process a directory with the same contract:

    remove-ai-watermarks video batch ./videos --mode all
    

    Remove a supported visible video mark:

    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
    

    This path scans the complete sequence before changing pixels. It accepts only a mark that repeats at a stable position across adjacent frames, then reuses the same OpenCV, MI-GAN, or LaMa fill backends as image removal. Audio is copied without re-encoding and is allowed to reach its natural end; the video stream is transcoded because its pixels change. By default, a guarded optical-flow pass motion-aligns the preceding accepted fill and blends it only when the nearby source context agrees; use --no-temporal-consistency to disable it. The encoder preserves supported 8-bit source chroma sampling, color tags, and MP4/MOV track timescale instead of relying on ffmpeg's implicit raw-BGR defaults. Variable frame intervals are preserved through a timestamped in-memory NUT bridge instead of being flattened to the average frame rate. Non-zero source start timestamps are retained together with the copied audio offset. The default --mark auto scans all providers in one decode pass and selects the first stable match in the specificity order shown below. Valid Google AI-video provenance breaks a Sora/Veo cross-match in favor of Veo when the diamond is nested in the Sora region or Veo persists through the complete clip while Sora does not. Pass an explicit mark to restrict detection to one provider. Sora covers the moving Sora 2 mascot, with or without the wordmark; mascot-only matches also require the complete two-eye shape. Veo covers both the current four-point diamond and the legacy Veo text. Seedance covers the fixed boxed AI label, Dola covers the fixed Dola AI text, Hailuo AI covers the composite MINIMAX | hailuo AI label, and Kling AI covers the bottom-right KLING AI or KlingAI label with its version suffix. A completed encode is published atomically. No output is written when no stable mark is found. HDR, PQ/HLG, and greater-than-8-bit inputs are rejected before encoding rather than silently reduced through OpenCV's 8-bit BGR boundary.

    Apply the calibrated video-pixel SynthID-removal profile:

    uv tool install --force "remove-ai-watermarks[video,diffusion]"
    remove-ai-watermarks video invisible input.mp4 -o clean.mp4
    

    This path regenerates the complete sequence with one latent-noise field shared across time, copies complete audio, strips source metadata, and publishes the completed encode atomically. The default noise_std=0.15 profile passed both the two-carrier calibration and a complete public eight-second Veo oracle check. Google does not publish a local decoder, so a fresh provider check remains useful for unusually important files or after provider changes, but it is not a product result state. The CLI therefore describes video-pixel regeneration instead of claiming a per-file SynthID verdict, and reports the copied audio watermark as UNVERIFIED.

    For invisible watermark removal through the CLI or high-level API, install the qwen-zimage extra. An NVIDIA GPU is required: all diffusion profiles are CUDA-only, and there is no CPU or MPS fallback. The specialized local Paint API uses the pixels extra without CUDA.

    uv tool install --force "remove-ai-watermarks[qwen-zimage]"
    remove-ai-watermarks invisible image.png -o clean.png
    

    If the local detectors cannot confirm an invisible watermark but you know the image came from an AI generator, add --force:

    remove-ai-watermarks invisible image.png -o clean.png --force
    

    Typography-heavy images can opt into the experimental verified-text post-pass. It accepts manually reviewed strings and line boxes or an operator-verified geometry-only manifest; it never treats raw OCR output as ground truth or runs automatically:

    uv tool install --force "remove-ai-watermarks[text-restoration]"
    remove-ai-watermarks invisible image.png -o clean.png \
      --text-manifest verified-lines.json --force
    

    See the CLI guide for the manifest schema, compatibility restrictions, and oracle caveats.

    See the installation guide for Homebrew, uv, optional features, and development setup.

    Examples

    Visible Gemini mark

    The after raster at the top of this page is generated from the tracked before raster by the public path:

    uv run remove-ai-watermarks visible demo_banana_before.png \
      --backend cv2 -o demo_banana_after.png
    

    High quality invisible removal

    qwen-zimage is the default profile: a Qwen-Image-2512 Lightning pass under Canny ControlNet, followed by SAM-masked Z-Image repair of any detected face. The alternative, sdxl-zimage, swaps the global stage for SDXL and keeps the same face stage. chroma-zimage uses the Apache-2.0 Chroma1 global pass with its own flat vendor floors; see docs/chroma1-engine-research.md for the calibration. An opt-in fourth profile, qwen21-zimage, swaps the global stage for Qwen-Image-2.1 (with madebyollin/texture-fix-vae-for-qwen-image-2.1 and Qwen-Image-2.1-Fun-Controlnet-Union Canny); because Qwen/Qwen-Image-2.1 is released under the Qwen Research License, qwen21-zimage is for non-commercial research, evaluation, and personal use only (not for commercial use). --pipeline auto picks sdxl-zimage for Google, chroma-zimage for Microsoft, and qwen-zimage otherwise, keeping auto commercial-safe. All are CUDA only.

    uv tool install --force "remove-ai-watermarks[qwen-zimage]"
    remove-ai-watermarks invisible image.png -o clean.png --force
    
    OpenAI example beforeOpenAI example after
    OpenAI portrait grid before qwen-zimageOpenAI portrait grid after qwen-zimage
    Gemini example beforeGemini example after
    Gemini sign before qwen-zimageGemini sign after qwen-zimage

    These exact output files were checked with the matching provider verifiers. That result applies to these files, not to every seed, image, or future watermark version.

    Common recipes

    Remove every detected visible mark

    remove-ai-watermarks visible image.png -o clean.png
    

    The default --mark auto checks all registered visible marks and removes every match. If the mark is visible to you but the detector misses it, select its region explicitly:

    remove-ai-watermarks erase image.png \
      --region 1640,1930,400,100 \
      -o clean.png
    

    --region uses x,y,width,height and may be repeated.

    Use a learned fill backend

    The visible extra uses OpenCV inpainting when no learned backend is installed. For more difficult backgrounds, the learned-backend extras include the same pixel dependencies automatically:

    uv tool install --force "remove-ai-watermarks[migan]"
    remove-ai-watermarks visible image.png -o clean.png --backend migan
    
    uv tool install --force "remove-ai-watermarks[lama]"
    remove-ai-watermarks visible image.png -o clean.png --backend lama
    

    Reduce CUDA memory use

    remove-ai-watermarks invisible image.png -o clean.png \
      --cpu-offload --force
    

    CPU offload lowers CUDA memory pressure by moving model components between CPU and GPU, at the cost of speed.

    Process a directory

    remove-ai-watermarks batch ./images --mode visible
    remove-ai-watermarks batch ./images --mode all
    

    What the tool can recognize

    Visible mark support includes:

    • Google Gemini and Nano Banana visible sparkle watermark;
    • Doubao, the Jimeng wordmark and top-left AI生成 layouts, Qwen, Kling AI, Yuanbao, Dola, WorkBuddy, Baidu, LiblibAI's bottom-center wordmark and compact top-left pill, and RunningHub labels;
    • calibrated Microsoft top-right white and beige AI-badge layouts;
    • calibrated Italian and Korean Samsung Galaxy AI disclosures;
    • a generic brand-less bottom-right AI生成 fallback for OS/gallery-level AI-edit stamps that carry no vendor wordmark of their own (vivo and Xiaomi Gallery confirmed); synthetic-only calibration, weaker evidence than the vendor-tuned detectors above;
    • the OpenArt wordmark, placed at the frame center rather than a corner; uncalibrated (one confirmed real case, no captured corpus).

    Metadata and provenance inspection covers C2PA, EXIF, XMP, IPTC, common generator parameters in image and video containers, China TC260 AIGC labels, and several vendor specific signals. Optional decoders add support for open DWT-DCT watermarks and Adobe TrustMark.

    The exact support matrix, including important locale and detector limits, lives in supported signals. The synthetic example gallery carries one canonical sample for every registered image and video mark.

    How it works

    Visible removal follows three steps:

    1. Detect a registered mark in its expected area.
    2. Build a mask around the mark.
    3. Fill only the masked region with OpenCV, MI-GAN, or LaMa.

    Metadata removal uses format aware stripping. JPEG metadata removal preserves the encoded image scan instead of recompressing it. Native MP4/MOV TC260 values and keyed generation parameters are blanked without changing box sizes or media offsets. Other supported containers use their corresponding metadata path.

    Invisible removal through the CLI and high-level API regenerates the image through a diffusion pipeline. Specialized callers can instead decode and disrupt the positively identified local Microsoft Paint format with much smaller pixel changes. Neither path can guarantee that every proprietary verifier will reject every output.

    See supported signals and known limitations for the full technical boundary.

    Python API

    The visible-removal API requires remove-ai-watermarks[visible].

    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")
    

    The high level API accepts a file path or a BGR NumPy array. For path inputs it also reads provenance metadata, preserves alpha, and can strip AI metadata from the written result.

    See the Python API guide for visible removal, the full remove_all and remove_batch pipeline, provenance inspection, metadata stripping, and diffusion usage.

    Agent skill

    Coding agents can install the published skill and drive this CLI:

    npx skills add wiltodelta/remove-ai-watermarks
    

    Claude Code can add this repository as a plugin marketplace:

    /plugin marketplace add wiltodelta/remove-ai-watermarks
    /plugin install remove-ai-watermarks@remove-ai-watermarks
    

    Codex reads the same skill through .codex-plugin/plugin.json. The skill refuses stock-agency and other third-party paid-asset marks. See the agent skill guide.

    MCP server

    remove-ai-watermarks mcp serves identify, remove and batch as Model Context Protocol tools over stdio, each a thin wrapper around one CLI command:

    {"mcpServers": {"remove-ai-watermarks": {"command": "uvx", "args": ["remove-ai-watermarks", "mcp"]}}}
    

    See the MCP server guide.

    ComfyUI

    The separate ComfyUI Remove AI Watermarks package provides nodes for visible removal, detection, region erasing, and invisible removal.

    Important limitations

    • A missing local signal means unknown, not clean. Proprietary pixel watermarks may remain after metadata has been stripped. What each path leaves behind lists, per command, what may remain and how to check it.
    • Visible removal reconstructs a small region. Results depend on the background and selected fill backend.
    • Invisible removal changes the whole image and may alter faces, text, or fine detail.
    • Visible video removal recognizes the moving Sora 2 wordmark, the current Veo diamond plus legacy Veo text, the Seedance boxed AI label, and the fixed Doubao, Dola, Hailuo AI, Vidu, and Kling AI labels. It does not recognize the older Sora Turbo corner swirl or unregistered layouts from those providers. The classical OpenCV backend can smear structured backgrounds; use MI-GAN or LaMa when recovery quality matters.
    • Video SynthID regeneration changes resolution, frame rate, and image detail. The shipped profile is oracle-certified, but no public local decoder can certify an arbitrary output at runtime. Recheck unusually important outputs after provider changes.
    • Invisible-watermark removal through the CLI and high-level API requires CUDA. All diffusion profiles refuse any other device at construction rather than falling back to one that cannot run them. The specialized local Paint API, visible removal, metadata stripping and identify run without CUDA.
    • Provider watermark systems can change. Validate important outputs with the provider's own verifier when one is available.

    The shipped video invisible command uses the certified noise_std=0.15 profile. The companion scripts/video_synthid_sweep.py research harness builds a matched re-encode control plus VAE-regenerated candidates and leaves the verifier verdict blank:

    uv run --extra video --extra diffusion python scripts/video_synthid_sweep.py input.mp4 -o sweep/
    

    To score what an output actually cost, use scripts/video_fidelity_probe.py: the engine's own PSNR is measured after the input resize and before final encoding, so only the probe sees the delivered picture.

    uv run --extra video python scripts/video_fidelity_probe.py input.mp4 input_clean.mp4
    

    The control must still be SynthID-positive before a negative candidate can count as removal evidence. In the 2026-07-29 two-clip calibration, both matched controls were positive in Gemini's built-in SynthID verifier; the stronger candidate was negative on both carriers, while a weaker candidate was negative on one. A later adversarial follow-up that asked ordinary Gemini to reinterpret the pixel result returned UNAVAILABLE; that follow-up was not a verifier rerun and does not invalidate the built-in verdicts. A 2026-07-31 full-clip check on a public eight-second Veo sample found 0.10 still detected and 0.15 not detected, so 0.15 is now the certified default. The reproducible hashes and verdicts for that full-clip check -- one carrier, two rows -- live in data/evaluations/video-synthid-oracle.csv. The earlier two-clip calibration is narrative only: its verdicts were not recorded in a tracked manifest, so treat the certified default as resting on the 2026-07-31 rows.

    Documentation

    Start with the documentation index.

    Research notes and historical experiments are listed separately in the documentation index. They explain past decisions but do not define the current public API.

    Contributing

    Install the development environment and run the project gate:

    uv sync --frozen --extra dev
    bash maintain.sh
    

    See module internals before changing a subsystem with documented invariants. Report vulnerabilities as described in SECURITY.md.

    License

    Apache 2.0. Copyright 2025-2026 wiltodelta.

    Made by Victor Kuznetsov.