Watermark Remover
Automatically detect and remove watermarks (especially MLS watermarks) from listing photos using Florence-2 for detection and IOPaint (LaMa) for inpainting.
Prerequisites
pip install iopaint transformers torch pillow
# Optional OCR fallback:
pip install paddleocr paddlepaddle
Models auto-download on first run (~560MB total): LaMa (~100MB) + Florence-2 (~460MB).
Quick Start
# Single image
python ~/.openclaw/workspace/skills/watermark-remover/scripts/remove_watermark.py \
--input photo.jpg --output photo_clean.jpg
# Batch directory
python ~/.openclaw/workspace/skills/watermark-remover/scripts/remove_watermark.py \
--input ./photos/ --output ./photos_clean/ --suffix _clean
Script: remove_watermark.py
--input— file or directory--output— file or directory (created if missing)--suffix— append to output filenames (e.g._clean)--model—lama(default),mat,migan, orldm--device—cpu,cuda, ormps(auto-detected)--confidence— detection threshold 0.0–1.0 (default: 0.5)--padding— mask expansion in pixels (default: 10)--dry-run— detect only, skip inpainting--preserve-exif— copy EXIF metadata (default: on)
Supported: .jpg, .jpeg, .png, .webp, .tiff
Pipeline
- Detect — Florence-2 object detection (or PaddleOCR fallback) finds watermark regions
- Mask — Generate binary mask with padding around detected boxes
- Inpaint — IOPaint LaMa fills masked region with contextually appropriate pixels
Model Selection
- LaMa (default) — Fast, excellent for small text watermarks. Handles ~90% of MLS watermarks.
- MAT — Same speed/quality, different artifacts. Try if LaMa isn't clean enough.
- MIGAN — Lightest (~30MB). For CPU-only or low-VRAM environments.
- LDM — Slow but highest quality. For complex textures (patterned carpet, wallpaper).
Start with lama. Switch to ldm only if LaMa leaves visible artifacts.
Troubleshooting
- Ghost text remains — increase
--paddingor tryldm - Blurry patch — switch to
ldmfor complex backgrounds - Watermark not detected — lower
--confidenceto 0.3 - OOM — use
--device cpuormiganmodel - Color mismatch — add
--match-histograms(IOPaint ≥1.5)
Notes
- Original images never modified in-place
- Fully deterministic (LaMa is non-stochastic)
- MLS watermarks (VMLS, CRMLS, etc.) are ideal LaMa use case: small, corner-positioned, semi-transparent text
See references/model-comparison.md for detailed model benchmarks.
