Remove All Watermarks (RAIW)
Visible mark, invisible watermark, and metadata in a single pass
- image
- output_path
- info
Remove All Watermarks (RAIW) is the kitchen-sink node of this pack: point it at one original file and it runs the entire pipeline - detect and remove visible registered AI marks, remove the invisible watermark, and strip the AI metadata with verification - all in a single pass. The pack's other nodes split those jobs apart; this one exists because when you want a file actually clean, you want it clean in one shot, consistently.
Because it's the full pipeline, it's also the one that carries the real requirements. The visible-mark stage uses OpenCV inpainting and needs no GPU. The invisible stage does not: both qwen-zimage (the default) and sdxl-zimage are CUDA-only diffusion profiles - there's no CPU or MPS path, which is why there's no device widget. There are also no steps, guidance_scale, or model inputs; each profile pins its own model stack, a per-stage distilled schedule, and CFG 1.0. You don't tune that stuff because you can't - and honestly, the distilled recipe means the defaults are the sane settings anyway.
The inputs that matter
Only a handful of these are worth touching as a beginner:
- source_path - the file, on disk, readable by the ComfyUI server. The node reads the original so it can use the file's actual vendor provenance (an IMAGE tensor carries none).
- pipeline -
qwen-zimage(default, heavier, higher-quality regeneration) orsdxl-zimage(same recipe over an SDXL base). If you're on a smaller GPU, the SDXL profile is the lighter first try. - backend - how visible marks get filled:
auto/cv2(the default, dependency-free, no GPU), plusmiganandlamawhich needpip install "remove-ai-watermarks[migan]"or[lama]respectively. Stick with the default until you're unhappy with a fill. - sensitivity -
autoorstrict, detection strictness for visible marks. - force_invisible - off by default, which is right: invisible removal runs only when the node detects a matching watermark vendor. Force it on and it regenerates regardless.
- strength - 0 means "use the profile default" (resolution-adaptive for qwen-zimage, unknown-vendor strength for sdxl-zimage). Above 0 overrides. Higher removes more but drifts further from the original. Start at 0.
- tile and cpu_offload - for large inputs and low VRAM. Turn on
tile(default tile size 1024) for big images andcpu_offloadto stream the diffusion stacks instead of pinning them.
The rest (seed, controlnet_scale, humanize, unsharp, max_resolution, adaptive_polish, tile_size, tile_overlap) are fine-tuning. adaptive_polish is worth one look: it's three-way - profile default lets the library decide (off for qwen-zimage since its output already matches the source's detail, on for sdxl-zimage), with on/off to override. Old workflows that saved it as a checkbox still load fine.
What comes out
Three outputs: the cleaned image tensor, the output_path string (blank input path = <source>_clean.<ext> beside the original, never overwriting it), and an info string that's actually a progress log - stage by stage, what got done. It's the debugging aid: wire it into a text-display node and you'll see exactly where the pipeline stopped. If invisible removal couldn't run, the info string appends warning: invisible removal unavailable so you're not silently handed a half-cleaned file. Model weights aren't bundled - the diffusion stack downloads on first use, so budget for a chunky first run.
Install and the one real gotcha
Same as the whole pack: search "Remove AI Watermarks" in ComfyUI Manager, or
cd ComfyUI/custom_nodes
git clone https://github.com/wiltodelta/ComfyUI-remove-ai-watermarks
pip install -r ComfyUI-remove-ai-watermarks/requirements.txt
The dependency installs opencv-python-headless alongside the library. If your ComfyUI already ships opencv-python, both provide cv2 and usually coexist - but if you hit a cv2 conflict, keep exactly one OpenCV distribution in the environment. On a CPU-only machine the whole invisible stage is off the table; the node will still warn you through the info string rather than hard-crashing, but you won't get invisible removal out of it. And the usual honest note: this is the tool the pack's r/comfyui launch got called out for, the "evading detection" argument. It's a legitimate one-shot cleanup node, but what you're removing is provenance, so have your reasons squared before you run it.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| source_path | STRING | — | |
| pipeline | COMBO | qwen-zimage | 4 options: qwen-zimage, sdxl-zimage, chroma-zimage, auto |
| output_pathopt | STRING | — | |
| force_invisibleopt | BOOLEAN | false | — |
| backendopt | COMBO | auto | 4 options: auto, cv2, migan, lama |
| sensitivityopt | COMBO | auto | 2 options: auto, strict |
| strengthopt | FLOAT | 0.000–1 | — |
| seedopt | INT | 00–18446744073709550000 | — |
| controlnet_scaleopt | FLOAT | 1.000–2 | — |
| humanizeopt | FLOAT | 0.00–10 | — |
| unsharpopt | FLOAT | 0.00–3 | — |
| max_resolutionopt | INT | 00–8192 | — |
| adaptive_polishopt | COMBO | profile default | 3 options: profile default, on, off |
| cpu_offloadopt | BOOLEAN | false | — |
| tileopt | BOOLEAN | false | — |
| tile_sizeopt | INT | 1024256–4096 | — |
| tile_overlapopt | INT | 1280–1024 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| output_path | STRING | — |
| info | STRING | — |