写了个图像去水印工具,分享一下
最近需要处理一些带水印的图片,在网上找了一圈工具,要么收费太贵,要么效果不太理想。后来发现了 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 时使用 |
超分有四种选择:不超分、修复后超分、先超分再修复(适合小图)、仅超分不修复。
设计上的一些考量
- 引擎互斥加载:LaMa 和 RealESRGAN 不会同时占显存,所以即使只有 ~200MB 显存也能同时使用去水印+超分
- 大图分块处理:超分遇到大图会自动切块,避免爆显存
- 显存不足自动回退:LaMa 和 RealESRGAN 显存不够时会自动切到 CPU 跑,不会直接报错
- 模型懒加载:不需要 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 显存。
只想去水印,结果图片变成了别的东西?
大概率是用了 quick 或 hq 模式,换成 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),感谢原作者们的贡献。