写了个图像去水印工具,分享一下

写了个图像去水印工具,分享一下

最近需要处理一些带水印的图片,在网上找了一圈工具,要么收费太贵,要么效果不太理想。后来发现了 lama-cleaner 这个项目,思路挺不错的,但用起来有些地方不太顺手,于是就想着自己写一个更适合自己的版本。

这个工具能做什么?

上传图片,用画笔涂抹要去掉的区域(水印、文字、多余物体都行),AI 自动填充背景。另外还集成了 RealESRGAN 4 倍超分,可以在去水印的同时把图片放大。

核心用的是 LaMa 模型,这是开源的图像修复模型,只占 ~30MB 显存,处理速度很快。大面积缺失区域的话可以切换到 SDXL 做生成式填充,效果更完整,但需要 ~5GB 显存。

引擎和模式

引擎 用途 显存占用 速度
LaMa 纯去除(水印、文字、小物体) ~30 MB 极快
SDXL 生成式填充(大面积补全) ~5 GB 较慢
RealESRGAN 4 倍超分辨率 ~200 MB 中等

有几种模式可以选:

模式 引擎 说明
auto 自动选择 小面积用 LaMa,大面积用 SDXL
remove LaMa 纯去除,只填充背景不生成新内容
quick SDXL 20步 快速生成式填充
hq SDXL 30步 高质量生成式填充
cpu LaMa on CPU 无 GPU 时使用

超分有四种选择:不超分、修复后超分、先超分再修复(适合小图)、仅超分不修复。

设计上的一些考量

  1. 引擎互斥加载:LaMa 和 RealESRGAN 不会同时占显存,所以即使只有 ~200MB 显存也能同时使用去水印+超分
  2. 大图分块处理:超分遇到大图会自动切块,避免爆显存
  3. 显存不足自动回退:LaMa 和 RealESRGAN 显存不够时会自动切到 CPU 跑,不会直接报错
  4. 模型懒加载:不需要 SDXL 就不用装 diffusers,LaMa 和超分照样能用

使用方式

# 安装依赖
pip install -r lama-cleaner-plusplus/requirements.txt
pip install modelscope

# 下载模型(交互式菜单,按需选)
python download_models.py

# 启动
python lama-cleaner-plusplus/app.py

下载脚本也支持命令行直接指定:

python download_models.py lama        # 只下载 LaMa(~391 MB,最小安装)
python download_models.py realesrgan  # 只下载 RealESRGAN
python download_models.py sdxl        # 只下载 SDXL
python download_models.py all         # 下载全部
python download_models.py --check     # 查看模型状态

Windows 用户也可以双击 启动.bat 直接启动,会自动打开浏览器。

启动参数:--port 7860(端口)、--share(生成公网分享链接,方便给别人演示用)。

高级参数

界面上有几个可以调的参数,一般用默认值就行:

  • Mask 膨胀:涂抹区域向外扩展的像素数,水印边缘模糊的时候加大到 20-30 效果会好一些
  • Mask 羽化:mask 边缘的柔化程度,让修复区域和周围更自然地融合
  • Prompt / Negative Prompt:留空使用默认值就行,一般不需要改

实际体验

  • 简单背景的水印去除效果还不错
  • 复杂背景有时候需要多试几次,或者调整 mask 膨胀和羽化参数
  • remove 模式只做背景填充,不会生成奇怪的东西,比较靠谱
  • 第一次启动需要下载模型,之后就快了

常见问题

显存不足怎么办?

超分和修复引擎互斥加载,不会同时占用显存。如果还是 OOM,可以试试用 remove 模式代替 quick/hq,LaMa 只需 ~30MB 显存。

只想去水印,结果图片变成了别的东西?

大概率是用了 quickhq 模式,换成 remove 就行。remove 只做背景填充,不会生成新内容。

不需要 SDXL 可以吗?

可以。SDXL 是懒加载的,不装 diffusers 也不影响 LaMa 和 RealESRGAN 使用。最小安装只下载 LaMa 模型(~391MB)就够了。

目前的问题

  • SDXL 显存占用还是高,低配机器跑不了生成式填充
  • 部分复杂场景下边缘融合还不够自然

硬件要求

配置 最低 推荐
GPU 无(可用 CPU 模式) RTX 3060 12GB
GPU 显存 无(纯 CPU) 2 GB(LaMa + RealESRGAN)
内存 8 GB 16 GB
磁盘 1 GB(仅 LaMa) 6 GB(全部模型)

代码地址

参考的项目:https://github.com/Sanster/IOPaint

我的实现:GitHub - LJL454/lama-cleaner-plusplus: AI图像修复 · GitHub

项目结构大概长这样:

去图像水印/
├── 启动.bat
├── download_models.py
├── remove_fp32_weights.py
├── models/
└── lama-cleaner-plusplus/
    ├── app.py
    ├── config.py
    ├── core/
    │   ├── engine_manager.py   # 引擎管理(懒加载、互斥)
    │   ├── pipeline.py         # 修复流水线
    │   ├── service.py          # 业务逻辑
    │   ├── strategy.py         # 引擎选择策略
    │   ├── mask_processor.py   # Mask 处理
    │   ├── roi.py              # ROI 裁剪
    │   └── engines/
    │       ├── base.py
    │       ├── lama.py
    │       ├── sdxl.py
    │       └── realesrgan.py
    ├── ui/
    │   └── gradio_app.py
    └── utils/
        ├── gpu.py
        ├── image.py
        └── logger.py

有兴趣的朋友可以看看,有问题欢迎交流。


PS:模型都是开源的,LaMa(Apache 2.0)、RealESRGAN(BSD-3)、SDXL(OpenRAIL-M),感谢原作者们的贡献。

1 个赞