LaMa图像修复完整实战指南:用傅里叶卷积把“大窟窿“补得天衣无缝

发布时间:2026/8/19 19:54:02
LaMa图像修复完整实战指南:用傅里叶卷积把“大窟窿“补得天衣无缝 LaMa图像修复完整实战指南用傅里叶卷积把大窟窿补得天衣无缝【免费下载链接】lama LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022项目地址: https://gitcode.com/GitHub_Trending/la/lamaLaMaLarge Mask Inpainting是 2022 年 WACV 收录的开源图像修复项目主打大掩码 高分辨率场景它只在 256×256 上训练却能在约 2K 分辨率上稳定推理靠的核心是一套叫做傅里叶卷积的架构。本文不绕弯子直接按先跑通、再理解、后调优的顺序把从推理、训练到部署的全过程踩坑记录写给你看。大块破损为什么难修先认清问题的形状先做一个思想实验。你手里有一张老照片中间被水渍糊掉了一整块面积占画面的三分之一。用常见的图像补全工具处理你会发现两种典型翻车修不出结构砖墙、栅栏这类周期性纹理模型要么糊成一片要么补出明显错位的接缝修出假细节边缘是接上了但光影、走向全不对一眼假。这不是工具不给力而是问题本身的性质决定的。常规卷积网络是局部视野——一个卷积核一次只能看到周围几十个像素。小划痕、细水印在局部就能找到足够线索属于好修的范畴但大块掩码意味着局部线索整片消失模型必须有能力从图像最远端借信息过来。局部操作做这件事要么靠堆叠层数很慢要么靠注意力机制很贵。LaMa 给出的答案是别在空间域里硬搬把信息搬到频域去处理。三分钟跑通推理最小可用版本长这样在啃原理之前先让你看到一个能跑的版本。整个推理流程只有三步拉代码、放模型、跑预测。# 1. 获取代码 git clone https://gitcode.com/GitHub_Trending/la/lama cd lama export TORCH_HOME$(pwd) export PYTHONPATH$(pwd) # 2. 准备模型与测试图片 # 官方推荐从公开渠道下载 big-lama.zipPlaces2 预训练解压到项目根目录 unzip big-lama.zip # 3. 跑推理输入图片 同名掩码输出修复结果 python3 bin/predict.py \ model.path$(pwd)/big-lama \ indir$(pwd)/LaMa_test_images \ outdir$(pwd)/output输入侧的约定只有一条图片和掩码同名同目录掩码文件名追加_mask字样即可。image1_mask001.png # 掩码白色待修复区域 image1.png # 原图预测时的关键行为由configs/prediction/default.yaml控制默认device: cuda图片会先按pad_out_to_modulo: 8对齐尺寸如果你想让结果更精细可以在命令末尾追加refineTrue会启用一个多尺度迭代细化器默认 15 轮迭代、最多 3 个降采样层级。如果你连模型都不想找直接用仓库里的 Google Colab 链接也能在线体验属于零成本验证这个方案适不适合你的场景。傅里叶卷积原理大白话给图像装一个全局耳朵现在解释核心创新。想象你在一个嘈杂的房间里找人。普通卷积的做法是挨个问身边的人你看见他了吗信息一格格传递传播慢、还容易传错。傅里叶卷积的做法是给房间装一个广播系统——把所有人的位置信号变成一组频率全局瞬间共享。在实现上saicinpainting/training/modules/ffc.py里的FourierUnit做了这样一件事先用 FFT 把特征图从空间域转到频域在频域上做一次 1×1 卷积再逆变换回空间域class FourierUnit(nn.Module): def forward(self, x): fft_dim (-2, -1) # 对最后两维做 FFT ffted torch.fft.rfftn(x, dimfft_dim, normself.fft_norm) # 空间 → 频域 ffted torch.stack((ffted.real, ffted.imag), dim-1) ffted self.conv_layer(ffted) # 在频域上做卷积 ffted torch.fft.irfftn(ffted, sx.shape[-2:], dimfft_dim, normself.fft_norm) # 频域 → 空间 return ffted这一步的收益是结构性的全局感受野频域里任意一个系数都包含全图信息一次操作就完成全图广播正好对症大掩码复杂度友好FFT 是 O(N log N)比用深网络堆出的长距离传播便宜得多分辨率鲁棒周期结构砖墙、织物在频域里是稀疏尖峰天然好补——这也是 LaMa 能在没见过的 2K 分辨率上依然稳住的关键。值得注意的是LaMa 不是把整个网络都换成傅里叶卷积而是用ratio_gin / ratio_gout控制频域通道占比。以configs/training/generator/ffc_resnet_075.yaml为例ResNet 主干里75% 的通道走频域分支其余 25% 仍走普通卷积resnet_conv_kwargs: ratio_gin: 0.75 # 输入中 75% 通道进入频域分支 ratio_gout: ${generator.resnet_conv_kwargs.ratio_gin} enable_lfu: False # 关闭局部傅里叶单元降低开销这种局部 全局混合的设计兼顾了两头细节纹理靠空间卷积保真大结构靠频域分支补全。端到端实战从自定义数据集到训练评估的完整链路推理只是消费端。如果业务场景特殊比如专修医学影像、工业零件你必须用自己的数据训练。仓库把这条链路拆成了四步每一层都有独立的bin/脚本和configs/配置可单独替换。第一步造掩码。LaMa 训练时掩码是随机构造的测试集则需要固定掩码保证可复现。bin/gen_mask_dataset.py会做裁剪缩放 掩码生成两件事python3 bin/gen_mask_dataset.py \ configs/data_gen/random_thick_512.yaml \ # 掩码风格thin / medium / thick × 256 / 512 my_dataset/val_source/ \ # 输入原图 my_dataset/val/random_thick_512/ \ # 输出图片 掩码 --ext jpg掩码的风格由 YAML 控制。看configs/data_gen/random_thick_256.yaml你会发现它是多重随机的不规则笔划irregular_proba: 1最大宽度 100、矩形块box_proba: 0.3、以及裁剪与缩放策略out_min_size: 256、handle_small_mode: upscale。论文中的测试集就是用 thin/medium/thick 三档分别生成的。第二步配路径。训练前需要告诉 Hydra 数据在哪方法是在configs/training/location/下放一个自定义配置# configs/training/location/my_dataset.yaml data_root_dir: /path/to/my_dataset/ out_root_dir: /path/to/experiments/ tb_dir: /path/to/tb_logs/第三步启动训练。仓库预置了多个模型配置从轻到重分别是lama-regular、lama-fourier、big-lama等全部位于configs/training/。训练命令支持命令行直接覆盖参数python3 bin/train.py -cn lama-fourier locationmy_dataset data.batch_size10第四步评估。训练期间会自动根据验证集挑选最优 checkpoint之后在没见过的新数据集上推理并算指标python3 bin/predict.py \ model.path$(pwd)/experiments/run_id_lama-fourier_/ \ indir$(pwd)/my_dataset/eval/random_thick_512/ \ outdir$(pwd)/inference/my_dataset/random_thick_512 \ model.checkpointepoch32.ckpt python3 bin/evaluate_predicts.py \ configs/eval2_gpu.yaml \ $(pwd)/my_dataset/eval/random_thick_512/ \ $(pwd)/inference/my_dataset/random_thick_512 \ $(pwd)/inference/my_dataset/random_thick_512_metrics.csv评估脚本会输出 FID、SSIM、LPIPS 等指标configs/eval2_gpu.yaml里定义了用哪套损失和采样方式。掩码与分割类数据在项目里也有现成的可视化素材比如saicinpainting/evaluation/masks/countless/images/segmentation.png展示的就是典型的分割/掩码形态数据可以作为你理解掩码长什么样的参考。高频翻车点与解法对照表下面是社区里最常见的几个坑以及仓库里对应的解法症状根因解法推理报错model.path找不到模型目录结构不对best.ckpt缺位检查big-lama/下是否有 checkpointmodel.checkpoint可显式指定last.ckpt输出图有黑边/尺寸对不上图片尺寸不是 8 的倍数交给pad_out_to_modulo: 8或预处理时手动对齐掩码没生效结果原图掩码命名不符合xxx_mask001.png约定用docker/1_generate_masks_from_raw_images.sh或bin/gen_mask_dataset.py重新生成中文路径/特殊字符导致读取失败文件系统编码问题路径统一用英文避免空格训练时val_ssim_fid100_f1_total_mean一直不涨验证集太小或掩码太单一参考 README 的val_source至少 2000 张的建议多用几档掩码风格GPU 显存溢出batch 太大命令行data.batch_size2直接压下去另外一个容易忽略的点论文里的 Places 指标是在 3 万张图、thick/medium/thin 三档掩码下算出来的。你自己评估时若只跑一小批图数字偏大是正常的不要直接拿去和论文对比。从能用到好用五个值得动手的调优旋钮训练与推理的调优集中在三处损失权重、训练器参数、推理细化器。旋钮一损失配比。configs/training/big-lama.yaml里定义了完整的损失体系LaMa 用的是一种分工明确的组合losses: l1: weight_missing: 0 # 掩码区域不直接吃 L1避免糊化 weight_known: 10 # 已知区域强约束保边缘清晰 adversarial: kind: r1 # R1 梯度惩罚型对抗损失 weight: 10 feature_matching: weight: 100 # 特征匹配权重最大保结构一致 resnet_pl: weight: 30 # ResNet 感知损失保语义真实理解这套配比的价值在于你要调自己的任务时先想清楚我要保像素、保结构还是保感知。比如掩码区域若总被修复得太平滑可以把l1.weight_missing从 0 往上抬一点试试。旋钮二混合精度。训练器配置configs/training/trainer/any_gpu_large_ssim_ddp_final.yaml默认precision: 32但把precision: 16的注释掉的行留着说明官方就是用这招来吃下大模型的。显存吃紧时直接开 16 位通常能省近一半显存。旋钮三梯度裁剪。同一份配置里gradient_clip_val: 1已经默认开启训练不稳定loss 突然飙高时优先检查这个值不要急着换学习率。旋钮四推理细化器。不加参数跑出来的结果已经可用但如果你要的是发出去的成品强烈建议加refineTrue。细化器默认 15 轮迭代、lr: 0.002会对图像做多尺度金字塔式的精修。代价是耗时明显上升——适合离线批处理不适合实时接口。旋钮五显存与批量的匹配。官方没有给出硬性显存表但经验区间是8GB 显存跑 512×512 推理 batch 开 124GB 以上才谈得上 batch 4。优先保证单图单次推理的稳定性再谈吞吐。三种部署环境的横向对比与选型建议仓库官方给出了三种环境方案各有取舍维度Python 虚拟环境Conda 环境Docker安装成本低pip install -r requirements.txt中需创建conda_env.yml零安装镜像开箱即用环境一致性差依赖版本易漂移中最好CI/CD 友好GPU 支持需自行装 CUDA 版 PyTorchcudatoolkit10.2一行搞定需 NVIDIA Container Toolkit--gpus all适用场景快速验证、单人调试研究实验、复现论文生产环境、团队协作维护成本高中低个人开发者的建议路径是先用 Conda 复现、再用 Docker 上生产。Docker 侧官方封装好了两个脚本掩码生成和推理都有现成入口# 生成掩码Docker 版 bash docker/1_generate_masks_from_raw_images.sh \ configs/data_gen/random_medium_512.yaml \ /path/to/input_images \ /path/to/output_masks \ --ext png # GPU 推理Docker 版 bash docker/2_predict_with_gpu.sh \ $(pwd)/big-lama \ $(pwd)/input_images \ $(pwd)/output \ devicecuda:0生产环境里把bin/predict.py包一层 HTTP 服务即可接入业务线模型文件可提前加载进内存避免每次请求都重新载入权重。客观存在的短板三个必须知道的限制写到这里如果你觉得 LaMa 无所不能那就跑偏了。它的短板同样值得摆上桌面看不见的语义缺口。LaMa 擅长补结构和纹理但不理解这是什么。比如一张照片里的人物整块被抹掉它补出的可能是合理的背景而不是另一个人。凡是需要语义推理人物、文字、特定物体的场景应该上 SAM LaMa 这类先分割再修复的组合方案而不是裸用 LaMa。迭代效率是硬伤。refineTrue虽然质量好但多尺度迭代对 CPU 推理几乎是灾难没有 GPU 的生产环境里要么放弃 refine要么接受秒级延迟。官方 README 也明确说训练/评估的 Docker 支持是 TODO社区在这块的自动化并不完整。评估指标的不可比性。掩码生成是随机的官方特意不固定随机种子这意味着两次评估的掩码不同、指标也不同。做横向对比时必须固定同一批掩码否则结论站不住。下一步走向LaMa 之后的技术演进判断LaMa 诞生至今围绕它长出了一个很典型的基建型项目生态lama-cleaner 提供了交互式网页修复CoreMLaMa 把它搬上了 iOSInpaint-Anything 把 SAM 的分割能力和 LaMa 的修复能力串了起来。这个生态本身就是信号——图像修复正在从单点能力变成通用能力底座。顺着这个趋势有两个判断值得记录分割 修复会成为默认工作流。当 SAM 这类分割模型把该修哪里的问题解决后LaMa 只需专注怎么修好两者解耦后各自的迭代都更快移动端和浏览器端会吃掉一大块需求。Core ML、WebAssembly 方向的移植已经在发生说明抹掉路人、去掉水印这类日常需求不一定要上云。结语与下一步行动LaMa 的价值不是又一个图像补全模型而是证明了大掩码 高分辨率这个曾经很难的问题可以通过频域视角的架构创新系统性解决。它用 256 分辨率训练、2K 分辨率部署的泛化能力至今仍是这类任务里少见的标杆。如果你只取一个行动我建议先跑通推理拿你自己的三张图一张砖墙、一张织物、一张人物试一遍用 30 分钟判断它是否命中你的业务痛点。命中再顺着本文的链路走自定义训练没命中你也用最低成本排除了一个选项。这就是评测一个开源项目的正确姿势。【免费下载链接】lama LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022项目地址: https://gitcode.com/GitHub_Trending/la/lama创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考