批量去水印新利器:基于 YOLOv11 + LaMA 的开源 Python 脚本,1000 张图/分钟

9 days ago

批量去水印新利器:基于 YOLOv11 + LaMA 的开源 Python 脚本,1000 张图/分钟

背景

处理大规模图片数据集时,水印是个棘手的问题。训练扩散模型如果用了带水印的图片,生成结果会在角落出现水印图案的伪影。但手动一张张去水印在数万张图片面前完全不现实。

Reddit 上一位开发者 jferments 遇到了这个问题——他要处理一个 360 万张图片、超过 500GB 的数据集,分布在 18 万个子目录中。现有的去水印工具用于单张或小批量没问题,但对于这种规模的数据集,没有一个工具能胜任。

他的解决方案是写了一个 Python 脚本:watermark_remover,结合 YOLOv11 进行水印检测、LaMA 进行修复填充,支持多 GPU 并行处理。在一台双 RTX 4090 的机器上,速度可以达到 每分钟处理 1000 张以上图片

核心流程

脚本的工作流非常简洁:

  1. 递归扫描输入目录,保持目录结构不变
  2. YOLOv11(专门针对水印检测微调的版本)检测每张图中的水印位置
  3. 生成水印遮罩,并支持膨胀(dilate)参数来覆盖边缘虚影
  4. LaMA(Simple-LaMa) 模型智能修复遮罩区域
  5. 输出到目标目录,保持原始目录结构

整个过程支持随时 暂停和恢复——按下 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, --weightsYOLOv11 模型权重路径yolo11x-train28-best.pt
--conf检测置信度阈值(0.0-1.0),越低检测越多但可能误检0.1
--dilate遮罩膨胀像素数,覆盖边缘虚影;设为 0 禁用15
-R, --recursive递归扫描输入目录的所有子目录
--cpu-workersCPU 写入进程数全部 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 40901000+ 张/分钟数百万级数据集
单 RTX 4090400-600 张/分钟数十万级数据集
RTX 3060/4060100-200 张/分钟数万级数据集
CPU only5-20 张/分钟少量图片

暂停和恢复机制

处理大规模数据集时,意外中断是家常便饭。这个脚本的处理方式很贴心:

  • 它会在输出目录中维护一个 .processing_log.txt,记录已处理的文件路径
  • 中断后重新运行相同的命令,会自动读取日志、跳过已处理文件
  • 新增的图片也会被正确处理——不会因为日志中有同名文件就跳过不同内容的图片

这使得脚本可以安全地运行在长时间任务中,即使服务器重启也能从中断处继续。

与其他批量方案对比

方案适用规模是否需要 GPU自动化程度
watermark_remover 脚本百万级✅需要全自动,支持暂停恢复
ComfyUI 工作流千级✅需要半自动
在线批量工具百级❌不需要全自动,有数量限制
手动 PS 处理十级❌不需要手动

注意事项

脚本自带了明确的使用声明:仅供教育和演示目的使用。移除水印可能涉及版权问题,用户需要自行确保法律合规性。如果是处理自己拥有的图片或明确授权的素材,这个工具就很合适。

小结

watermark_remover 解决了一个很具体但也很痛的问题——大规模数据集的批量去水印。它不追求华丽的界面或丰富功能,而是专注于一件事:快速、可靠地处理大量图片。YOLOv11 的精准检测加上 LaMA 的自然修复,配合多 GPU 并行和断点续传,构成了一个实用主义者会欣赏的工程方案。

项目地址:https://github.com/jferments/watermark_remover

Author
Admin
Category