完整记录:我用fft npainting lama做的第一次图像修复
这不是一篇冷冰冰的工具说明书,而是一次真实、有温度、带点手忙脚乱的初体验。从双击启动脚本那一刻起,到最终看到那张“被抹去水印却依然呼吸自然”的照片——我想把整个过程里踩过的坑、顿悟的瞬间、甚至浏览器卡住时的抓狂,都原原本本地记下来。
1. 为什么是它?不是别的修复工具
在试过七八个在线图修平台、折腾了三款本地部署的Stable Diffusion插件之后,我停在了这个镜像名有点长的项目前:fft npainting lama重绘修复图片移除图片物品 二次开发构建by科哥。
名字里带着“fft”和“lama”,第一反应是——这应该不是又一个套壳的扩散模型。查了下背景:LAMA(LaMa)是2021年俄罗斯Skolkovo团队开源的基于频域建模的图像修复模型,核心思想是把修复任务从像素空间搬到傅里叶频域(FFT),让模型更关注图像的全局结构与纹理连续性,而不是逐像素“猜颜色”。而这个镜像,是科哥在原始LAMA基础上做了工程化重构:去掉PyTorch训练依赖,精简推理流程,封装成开箱即用的WebUI,并且关键——它不生成“新内容”,而是智能“延续原有内容”。
这恰恰是我最需要的:一张老照片上有个突兀的日期戳,我不想要AI编造一朵花来盖住它,我只想让那块区域“本来就没存在过”。
2. 启动:三行命令,一次心跳暂停
按照文档,我SSH进服务器,执行:
cd /root/cv_fft_inpainting_lama bash start_app.sh终端滚出几行日志,然后——停住了。
没有“✓ WebUI已启动”,没有地址提示。
我盯着光标,等了47秒。
翻看start_app.sh,发现它调用了app.py,而app.py开头有一行注释:“首次运行需预加载FFT权重,耗时约90秒”。原来不是卡死,是它在后台默默加载一个387MB的.pth文件。
我泡了杯茶,回来时终端终于亮起那行绿色文字:
===================================== ✓ WebUI已启动 访问地址: http://0.0.0.0:7860 本地访问: http://127.0.0.1:7860 按 Ctrl+C 停止服务 =====================================那一刻的感觉,像看着火箭点火后第三秒才传来轰鸣——延迟,但真实。
3. 界面初印象:极简,但藏着巧思
打开http://我的服务器IP:7860,页面干净得近乎朴素:
- 左侧是大块画布区,顶部写着“ 图像编辑区”,右下角小字:“webUI二次开发 by 科哥 | 微信:312088415”
- 右侧是结果预览窗,下方一行状态栏,实时显示“等待上传图像并标注修复区域...”
没有炫酷的3D预览,没有参数滑块瀑布,只有四个按钮:** 开始修复**、** 清除**、画笔图标、橡皮擦图标。
我拖入一张测试图——公司宣传册扫描件,右下角印着半透明“SAMPLE”水印。
上传成功,画布自动适配尺寸,边缘无拉伸失真。这点很关键:很多WebUI会把高分辨率图强行缩放到固定画布,导致标注失准。而这里,它保持原始比例,仅通过CSS缩放显示,实际运算仍基于原图。
4. 标注:不是画画,是“告诉模型哪里该呼吸”
修复效果的70%取决于这一步。文档说“涂抹白色区域”,但实操中我发现,这不是填色游戏,而是一场与模型的默契对话。
我先用默认画笔(大小15)粗略圈住水印。点击“ 开始修复”,5秒后右侧弹出结果——水印消失了,但周围区域像被PS“内容识别填充”过度拉扯,纹理发虚,颜色偏灰。
回退,重新标注。这次我做了三件事:
- 缩小画笔到5像素,沿着水印边缘“描边”,确保白色只覆盖水印本体,绝不侵入旁边的文字;
- 在水印正上方和正下方,各加一条细长的白色横线(约2像素宽),长度略超水印宽度——这是给模型的“上下文锚点”,提示它:“这里上下都是同一段文字,修复时请对齐行高”;
- 用橡皮擦轻轻擦掉水印中心最浓的几个像素点,只留边缘轮廓——因为LAMA在频域建模时,强边缘信息反而会干扰纹理延续,适度“柔化”标注,效果更自然。
再次点击修复。这一次,结果让我停顿了两秒:水印区域被完全抹去,但周围的文字行距、字体粗细、甚至纸张纤维的走向,都严丝合缝地延续下来。没有生硬的拼接感,像那块区域从来就该是空白。
5. 深度拆解:它到底怎么“想”的?
为了理解为什么第二次标注更成功,我翻出了科哥文档里没明说、但代码里埋着的关键逻辑:
5.1 频域修复的底层逻辑(人话版)
普通修复模型(如SD inpaint)在像素空间工作,相当于让AI“看图说话”:你圈一块,它猜“这里该是什么”。而LAMA的FFT路径是:
- 把整张图做快速傅里叶变换(FFT)→ 拆成“亮度基底”+“纹理高频”+“结构低频”三组数据;
- 在频域里,只修改被标注区域对应的频谱分量,其余部分原样保留;
- 再逆变换(IFFT)回像素空间。
所以,它不是“生成”,而是“修补频谱缺口”。这就解释了为什么我的“描边+锚点”策略有效:边缘线条提供了清晰的结构低频信号,上下横线则强化了文字行的周期性纹理特征——模型拿到的是更可靠的“频域坐标”,而非模糊的“像素坐标”。
5.2 为什么PNG比JPG好?
文档提了一句“上传PNG获得最佳质量”,我验证了:同一张图,JPG上传后修复区域出现轻微色块(尤其在渐变背景上)。原因在于JPG的离散余弦变换(DCT)压缩,会破坏原始图像的频谱连续性,而LAMA的FFT修复高度依赖频谱保真度。PNG无损,频谱完整,模型“听”得更清楚。
6. 实战复盘:四类典型场景的真实表现
我用同一张1920×1080的风景照(含天空、山体、树木、小径),测试了四种常见需求:
6.1 去除水印(半透明文字)
- 操作:小画笔沿文字边缘描边,标注略宽于文字本身。
- 效果:天空区域修复完美,云层纹理无缝延续;山体阴影处有微弱接缝(因纹理复杂),但放大200%才可见。
- 耗时:12秒(中图档位)。
6.2 移除前景人物(背影)
- 操作:大画笔(大小30)快速覆盖人物全身,边缘用橡皮擦精细修正。
- 效果:小径自然延伸,两侧草丛密度、朝向一致;人物原站位处无“空洞感”,地面反光过渡柔和。
- 注意:若人物紧贴树干,需手动擦除树干被遮挡部分再修复,否则模型会误判为“树干缺失”。
6.3 修复老照片划痕
- 操作:最小画笔(大小1)单点点击划痕起点,拖拽至终点,形成细线标注。
- 效果:划痕消失,纸张肌理(包括泛黄程度、细微折痕)100%保留;未出现“过度平滑”导致的老照片失真。
- 优势:相比传统算法(如OpenCV inpaint),对方向性划痕(如垂直刮擦)修复更精准。
6.4 去除电线(细长高对比)
- 操作:画笔大小设为8,沿电线轨迹单次拖拽;两端超出电线1-2像素。
- 效果:电线消失,背景天空无色差;但电线穿过树枝时,部分树叶边缘略显模糊(因模型优先保证天空连续性)。
- 技巧:对穿枝类电线,分段标注(避开树枝交叉点),效果提升显著。
7. 那些没写在文档里的“暗知识”
7.1 关于“清除”按钮的真相
我以为“ 清除”只是清空画布,实测发现:它还会重置内部缓存的频域特征图。如果修复失败后直接重传新图,旧图的频谱残留可能导致新图修复异常(表现为局部色偏)。务必先点清除,再上传。
7.2 输出路径的隐藏逻辑
文档说文件保存在/root/cv_fft_inpainting_lama/outputs/,但实际命名规则是:outputs_YYYYMMDDHHMMSS_<width>x<height>.png
例如outputs_20240520143022_1920x1080.png。
这意味着:同一天多次修复,文件不会覆盖,且分辨率信息直接嵌入文件名——对批量处理管理极其友好。
7.3 为什么不用“撤销”?
界面有Undo按钮,但我在多次操作中从未启用。原因:LAMA的修复是端到端推理,每次“开始修复”都基于当前标注+原始图重新计算。所谓“撤销”,只是回退到上一次标注状态,而非回退修复结果。与其依赖Undo,不如养成“小步快跑”习惯:每标一小块,立刻修复验证。
8. 性能实测:速度与精度的平衡点
我在不同配置服务器上测试了同一张1200×800人像图(需修复耳环):
| 服务器配置 | 处理时间 | 效果评价 |
|---|---|---|
| 4核CPU + 16GB内存 | 28秒 | 耳垂皮肤纹理略平,但无明显瑕疵 |
| RTX 3060 + 12GB显存 | 6.2秒 | 皮肤毛孔、光影过渡完全自然 |
| RTX 4090 + 24GB显存 | 3.8秒 | 与3060无肉眼差异,提速边际递减 |
结论:GPU加速收益巨大,但3060已是甜点卡;继续升级显卡,对单图修复体验提升有限,更适合批量处理。
9. 我的第一次修复,到底值不值得推荐?
值。但必须说清它的边界:
它擅长的:
- 结构清晰、纹理可预测的区域(文字、天空、墙面、织物);
- 中小面积修复(<图像面积30%);
- 对“真实性”要求高于“创意性”的场景(证件照修复、档案数字化)。
❌它不擅长的:
- 极度复杂的多层遮挡(如:电线+树叶+人脸重叠);
- 需要“生成新内容”的任务(如:把单人照变成合影);
- 超高分辨率图(>3000px)的实时交互(标注会卡顿,建议先缩放)。
它不是一个万能画笔,而是一把精准的手术刀——当你明确知道“要切掉什么”,它就能让你几乎感觉不到刀锋的存在。
10. 给后来者的三条具体建议
标注宁窄勿宽,但边缘要“带钩”:
不必追求全覆盖,重点是在关键结构点(如文字起笔、物体轮廓转折处)加1-2像素的“钩状”延伸,给模型提供方向锚点。修复前,先用橡皮擦“松土”:
对于老照片划痕或JPEG压缩噪点,先用橡皮擦在标注区边缘轻擦一圈(力度30%),相当于告诉模型:“这里纹理可能失真,请以邻近区域为准”。接受“不完美”的第一次:
我的第一张修复图,水印去掉了,但右下角有0.5%区域颜色稍暖。没重来,直接下载。因为我知道:真正的价值不在像素级完美,而在于——我花了7分钟,做了一件过去需要专业修图师2小时才能完成的事,且结果足够交付。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。