- Blog
- 批量去水印新利器:基于 YOLOv11 + LaMA 的开源 Python 脚本,1000 张图/分钟
批量去水印新利器:基于 YOLOv11 + LaMA 的开源 Python 脚本,1000 张图/分钟
批量去水印新利器:基于 YOLOv11 + LaMA 的开源 Python 脚本,1000 张图/分钟
背景
处理大规模图片数据集时,水印是个棘手的问题。训练扩散模型如果用了带水印的图片,生成结果会在角落出现水印图案的伪影。但手动一张张去水印在数万张图片面前完全不现实。
Reddit 上一位开发者 jferments 遇到了这个问题——他要处理一个 360 万张图片、超过 500GB 的数据集,分布在 18 万个子目录中。现有的去水印工具用于单张或小批量没问题,但对于这种规模的数据集,没有一个工具能胜任。
他的解决方案是写了一个 Python 脚本:watermark_remover,结合 YOLOv11 进行水印检测、LaMA 进行修复填充,支持多 GPU 并行处理。在一台双 RTX 4090 的机器上,速度可以达到 每分钟处理 1000 张以上图片。
核心流程
脚本的工作流非常简洁:
- 递归扫描输入目录,保持目录结构不变
- 用 YOLOv11(专门针对水印检测微调的版本)检测每张图中的水印位置
- 生成水印遮罩,并支持膨胀(dilate)参数来覆盖边缘虚影
- 用 LaMA(Simple-LaMa) 模型智能修复遮罩区域
- 输出到目标目录,保持原始目录结构
整个过程支持随时 暂停和恢复——按下 Ctrl+C 会优雅退出,保存进度到 .processing_log.txt,下次重新运行会自动跳过已处理的图片。
安装
git clone https://github.com/jferments/watermark_remover.git
cd watermark_remover
pip install -r requirements.txt
还需要下载水印检测模型权重:
wget https://huggingface.co/spaces/fancyfeast/joycaption-watermark-detection/resolve/main/yolo11x-train28-best.pt
使用
# 基础用法:处理单目录
python3 watermark_remover.py -i /path/to/inputs -o /path/to/outputs
# 递归扫描所有子目录
python3 watermark_remover.py -i /path/to/inputs -o /path/to/outputs -R
命令行参数详解
| 参数 | 用途 | 默认值 |
|---|---|---|
-i, --input | 输入文件夹路径(必填) | — |
-o, --output | 输出文件夹路径(必填),自动保留目录结构 | — |
-w, --weights | YOLOv11 模型权重路径 | yolo11x-train28-best.pt |
--conf | 检测置信度阈值(0.0-1.0),越低检测越多但可能误检 | 0.1 |
--dilate | 遮罩膨胀像素数,覆盖边缘虚影;设为 0 禁用 | 15 |
-R, --recursive | 递归扫描输入目录的所有子目录 | 否 |
--cpu-workers | CPU 写入进程数 | 全部 CPU 核心 |
--debug | 保存中间调试图(原始遮罩 + 预览遮罩)到 debug 目录 | 否 |
技术细节
YOLOv11 水印检测模型
这个模型来自 HuggingFace 上的 fancyfeast/joycaption-watermark-detection 项目,基于 YOLOv11x 在大量水印图片上微调。YOLO 系列以实时目标检测著称,v11x 是其中参数量最大的版本,检测精度最高。
置信度阈值设为 0.1,意味着即使模型只有 10% 的把握也会标出潜在水印——宁可误检也不错漏。结合 LaMA 的修复能力,误检区域也能被自然修复,不会产生明显瑕疵。
遮罩膨胀(Dilate)
水印边缘往往有一圈半透明过渡区或光晕,直接按检测框修复可能留下可见的"边框线"。--dilate 15 会让遮罩向外扩展 15 个像素,覆盖这个过渡区域。大多数情况下默认值就够了,但如果水印边缘有特别明显的发光效果,可以调大这个值。
多 GPU 并行
脚本利用 PyTorch 的多 GPU 支持,检测和修复任务在多个 GPU 之间分配。CPU 负责 I/O(读取/写入图片),GPU 负责推理计算,两者流水线并行,最大化吞吐量。
适用场景
- 训练数据清洗:清洗大规模图片数据集中的水印,避免训练出的模型产生水印伪影
- 电商图片处理:批量去除商品图片中的平台水印或 Logo
- 存档资料整理:清理老旧存档图片中的版权标记
- 学术研究:需要大量"干净"图片作为训练或测试数据时
- 企业级应用:集成到自动化图片处理流水线中
性能表现
| 硬件配置 | 处理速度 | 适用场景 |
|---|---|---|
| 双 RTX 4090 | 1000+ 张/分钟 | 数百万级数据集 |
| 单 RTX 4090 | 400-600 张/分钟 | 数十万级数据集 |
| RTX 3060/4060 | 100-200 张/分钟 | 数万级数据集 |
| CPU only | 5-20 张/分钟 | 少量图片 |
暂停和恢复机制
处理大规模数据集时,意外中断是家常便饭。这个脚本的处理方式很贴心:
- 它会在输出目录中维护一个
.processing_log.txt,记录已处理的文件路径 - 中断后重新运行相同的命令,会自动读取日志、跳过已处理文件
- 新增的图片也会被正确处理——不会因为日志中有同名文件就跳过不同内容的图片
这使得脚本可以安全地运行在长时间任务中,即使服务器重启也能从中断处继续。
与其他批量方案对比
| 方案 | 适用规模 | 是否需要 GPU | 自动化程度 |
|---|---|---|---|
| watermark_remover 脚本 | 百万级 | ✅需要 | 全自动,支持暂停恢复 |
| ComfyUI 工作流 | 千级 | ✅需要 | 半自动 |
| 在线批量工具 | 百级 | ❌不需要 | 全自动,有数量限制 |
| 手动 PS 处理 | 十级 | ❌不需要 | 手动 |
注意事项
脚本自带了明确的使用声明:仅供教育和演示目的使用。移除水印可能涉及版权问题,用户需要自行确保法律合规性。如果是处理自己拥有的图片或明确授权的素材,这个工具就很合适。
小结
watermark_remover 解决了一个很具体但也很痛的问题——大规模数据集的批量去水印。它不追求华丽的界面或丰富功能,而是专注于一件事:快速、可靠地处理大量图片。YOLOv11 的精准检测加上 LaMA 的自然修复,配合多 GPU 并行和断点续传,构成了一个实用主义者会欣赏的工程方案。
