Detect Watermarks
Stop eyeballing your training set for logos
- image
- model
- image
- mask
This is the node that actually finds the watermarks. You feed it an image, it draws a box around every logo, signature, and username it can find, and - this is the good part - it hands you a mask you can wire straight into an inpainting step. For anyone cleaning a training set or stripping watermarks from a batch of images, this is the half of the job that used to require squinting at thumbnails for an afternoon.
Why you'd reach for it
Watermark removal got easy fast. Flux Fill, then Flux Kontext and Qwen-Image-Edit, turned "get rid of the logo" into a one-sentence edit. The part that stayed annoying was finding the watermarks in the first place - people on r/StableDiffusion were literally asking for "automated watermark detection & masking" and getting told to try Florence2 with a "text logo watermark" prompt plus a mask-expansion node. This node is the more direct answer: a YOLOv11x detector trained by the JoyCaption team specifically for this, with a mask output built in.
The original author's pitch was dataset hygiene. Before you train a LoRA or fine-tune on scraped images, you want to know which of them are watermarked so you can filter them out, or mask them so the model never learns to draw logos in the first place. The model's definition of "watermark" is broad on purpose: regular logos, artist signatures, social handles, corner text. It was trained on photos, drawings, sketches, anime, vector art - all the messy stuff a real dataset is made of.
How it works
Under the hood it's plain YOLO inference: the image gets run through YOLOv11x at 1024px with test-time augmentation and an IoU threshold of 0.5, and the confidence cutoff is exactly the threshold input you see. One thing to know before you expect magic: the mask is box-level, not pixel-level. The node takes each detected bounding box and fills it in as a solid rectangle. Good enough for feeding an inpaint region or masking a training sample, but it's not a per-pixel segmentation of the watermark shape, so don't expect clean edges.
The inputs and outputs that matter
Three inputs, all required:
image- the IMAGE you want scanned. Detector node's single biggest limitation lives here: it only processes the first frame of the batch (image[0]), so you can't batch 50 frames through a Load Image and get 50 detections. One at a time.model- theYOLO_MODELfrom the pack's loader node.threshold- confidence cutoff, 0 to 1, default 0.5. This is the dial you'll actually touch. Higher means fewer but more certain detections; if you're missing faint watermarks, drop it to 0.3 or so and accept a few false positives.
Two outputs:
image- the input image with detection boxes (and class labels) drawn on, ready to preview or save. Good for eyeballing whether the detector is on target.mask- a binary MASK covering the detected regions. This is the useful one: wire it into an inpaint node, or use it for loss masking in a training pipeline.
Installing and the first-run reality check
Install via ComfyUI Manager (search "Watermark Detection") or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/lrzjason/ComfyUI-Watermark-Detection
Restart ComfyUI. First time you run the loader, the ~110 MB weights download automatically from Hugging Face into ComfyUI/models/yolo/. The pack ships no requirements.txt, so ultralytics and huggingface_hub may not be installed for you - if you hit ModuleNotFoundError, pip install ultralytics fixes it. Just be aware ultralytics pulls a big dependency tree and likes to bump torch, which can ripple through the rest of your ComfyUI install.
Where people get burned
The mask being boxes rather than shapes surprises most people first run. It's also worth remembering this is a detector, not a remover - if you're building a remove-watermarks pipeline, you'll chain this into an inpaint or edit model. And a fair warning the community will absolutely leave on any thread about this: removing a watermark you don't own is legally dicey in most places. Fine for cleaning your own data, a problem when it's someone else's. The model itself is MIT-licensed and happy to just tell you where the logo is.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | YOLO_MODEL | — | |
| threshold | FLOAT | 0.500–1 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |