LaMa 大掩码图像修复实战指南:基于 Fourier 卷积的分辨率鲁棒修复模型在 Inpaint-Anything 中的使用与训练 人工智能计算机视觉深度学习图像处理视频处理【免费下载链接】Inpaint-AnythingInpaint anything using Segment Anything and inpainting models.项目地址https://gitcode.com/gh_mirrors/in/Inpaint-Anything点击查看免费下载LaMaLarge Mask Inpainting是 Inpaint-Anything 项目默认使用的图像修复inpainting引擎它以 256×256 分辨率训练却能对 2k 左右的高分辨率大掩码图像保持良好的修复质量尤其擅长周期性结构如栅栏、建筑立面的补全。本文以 lama/README.md 为骨架结合仓库内的预测/训练配置、掩码生成配置、Docker 脚本与 FFC 模块源码完整讲解 LaMa 的环境搭建、推理、掩码生成、训练评估与配置覆盖并给出其在 Inpaint-Anything 中的集成调用方式读完即可上手跑通一条掩码 → LaMa 修复 → 结果输出的完整链路。LaMa 是什么核心能力与设计动机LaMa 由 Roman Suvorov 等人提出论文题目《Resolution-robust Large Mask Inpainting with Fourier Convolutions》论文引用信息可在 lama/README.md 末尾的 Citation 中找到。它有两个关键特点对大掩码鲁棒传统修复模型在小孔洞上表现尚可面对大面积缺失区域往往崩溃LaMa 针对大掩码场景做了针对性设计。分辨率鲁棒模型仅在 256×256 分辨率下训练但据官方文档所述它能够泛化到训练时未见过的约 2k 高分辨率并在周期性结构补全等困难场景下保持良好效果。这一能力的基础是Fourier 卷积Fast Fourier ConvolutionFFC。在仓库源码 lama/saicinpainting/training/modules/ffc.py 中可以看到其实现FourierUnitffc.py 第 49 行起在 forward 中会对输入特征做 FFT 频谱变换通过 1×1 卷积在频域完成特征混合再经逆变换回到空间域FFCSE_block在频域分支上引入 SESqueeze-and-Excitation注意力让模型按通道自适应地融合局部细节local与全局频谱global两条路径的信息该实现源自 NeurIPS 2020 的 Fast Fourier Convolution 论文文件头部注释有原始项目出处。频域操作天然具有全局感受野这正是 LaMa 能理解大面积缺失区域上下文、并流畅补全重复纹理结构的底层原因。环境搭建三种可选方案仓库提供了三条环境安装路径对应 lama/requirements.txt、lama/conda_env.yml 与 lama/docker/Dockerfile。1. Python virtualenvvirtualenv inpenv --python/usr/bin/python3 source inpenv/bin/activate pip install torch1.8.0 torchvision0.9.0 cd lama pip install -r requirements.txt2. Conda# 若尚未安装 miniconda可先通过官方安装脚本安装Linux 示例 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda $HOME/miniconda/bin/conda init bash cd lama conda env create -f conda_env.yml conda activate lama conda install pytorch torchvision torchaudio cudatoolkit10.2 -c pytorch -y pip install pytorch-lightning1.2.9lama/conda_env.yml 锁定了一整套可复现依赖Python 3.6.13、cudatoolkit 10.2、PyTorch Lightning 1.2.9、Hydra 1.1.0、OmegaConf 2.1.1、albumentations 0.5.2、kornia 0.5.0 等pip 段还包含wldhx-yadisk-direct用于解析 Yandex 网盘直链供下文下载模型使用。3. Docker无需手动安装任何 Python 依赖直接使用 lama/docker/Dockerfile 构建的镜像即可。该镜像基于nvidia/cuda:10.2-runtime-ubuntu18.04内置 miniconda 并预装 PyTorch 1.8.1、albumentations、pytorch-lightning、hydra-core 等依赖同时将PYTHONPATH指向/home/user/project容器内可直接运行项目脚本。无论采用哪种方案进入推理/训练前都要设置环境变量cd lama export TORCH_HOME$(pwd) export PYTHONPATH$(pwd)TORCH_HOME用于定位感知损失所需的预训练权重详见下文训练与评估PYTHONPATH保证脚本能导入saicinpainting包。推理从预训练模型到修复结果1. 下载预训练模型先安装 Yandex 直链提取工具pip3 install wldhx.yadisk-direct下载论文中最优模型Places2、Places Challenge即 Big-LaMacurl -L $(yadisk-direct https://disk.yandex.ru/d/ouP6l8VJ0HpMZg) -o big-lama.zip unzip big-lama.zip或一次性下载全部模型Places 与 CelebA-HQcurl -L $(yadisk-direct https://disk.yandex.ru/d/EgqaSnLohjuzAg) -o lama-models.zip unzip lama-models.zip模型压缩包解压后即为模型目录其中应包含config.yaml训练配置与models/下的 checkpoint 文件——lama_inpaint.py 中inpaint_img_with_lama正是从模型目录/config.yaml读取训练配置、从模型目录/models/checkpoint加载权重这一约定与 README 的下载流程一一对应。2. 准备图像与掩码可以下载官方测试图片curl -L $(yadisk-direct https://disk.yandex.ru/d/xKQJZeVRk5vLlQ) -o LaMa_test_images.zip unzip LaMa_test_images.zip也可以使用自己的数据。掩码与图像必须放在同一目录并遵循命名规则image1_mask001.png image1.png image2_mask001.png image2.png即掩码文件名为[图像名]_maskXXX[图像后缀]其中XXX为掩码编号。随后在预测配置 lama/configs/prediction/default.yaml 中指定dataset.img_suffix例如.png、.jpg或_input.jpg。随机掩码可用bin/gen_mask_dataset.py脚本批量生成用法见下文掩码生成。3. 运行预测宿主机python3 bin/predict.py model.path$(pwd)/big-lama indir$(pwd)/LaMa_test_images outdir$(pwd)/output关键命令行参数参数含义model.path预训练模型目录如$(pwd)/big-lamaindir输入图像与掩码所在目录outdir结果输出目录model.checkpoint使用的 checkpoint 文件名默认best.ckptrefine是否启用精修refiner默认关闭4. 运行预测Dockerbash docker/2_predict.sh $(pwd)/big-lama $(pwd)/LaMa_test_images $(pwd)/output devicecpudocker/2_predict.sh 会把项目目录、模型目录、输入目录、输出目录分别挂载到容器内的固定路径并透传model.path、indir、outdir、dataset.img_suffix等参数容器内执行/home/user/project/bin/predict.py。脚本还支持追加任意predict.py参数$透传例如追加model.checkpointlast.ckpt。Docker CUDA 版本在官方文档中标记为 TODO如需 GPU 运行请自行调整镜像。5. 预测配置逐项解读lama/configs/prediction/default.yaml 是预测入口的默认配置逐项说明如下indir: no # 输入目录命令行覆盖 outdir: no # 输出目录命令行覆盖 model: path: no # 模型目录命令行覆盖 checkpoint: best.ckpt # 默认加载 best.ckpt dataset: kind: default img_suffix: .png # 图像后缀决定匹配哪些文件 pad_out_to_modulo: 8 # 输入按 8 的倍数 padding device: cuda # 推理设备可改 cpu out_key: inpainted # 模型输出字典中取结果的键名 refine: False # 精修开关仅 True 时运行 refiner refiner: gpu_ids: 0,1 # 精修使用的 GPU id单卡写成 0, modulo: ${dataset.pad_out_to_modulo} # 继承上述 8 n_iters: 15 # 每个尺度的精修迭代次数 lr: 0.002 # 精修学习率 min_side: 512 # 所有尺度下图像边长应 min_side / sqrt(2) max_scales: 3 # 图像-掩码金字塔最大下采样尺度数 px_budget: 1800000 # 像素预算图像会被缩放使 height*width px_budget其中pad_out_to_modulo与refiner.modulo的对应关系在代码中有清晰印证lama_inpaint.py 的inpaint_img_with_lama使用pad_tensor_to_modulo(batch[image], mod)将输入 padding 到 8 的倍数推理完成后再按原始尺寸cur_res[:orig_height, :orig_width]裁回保证输出与输入严格同尺寸。6. 带精修的预测python3 bin/predict.py refineTrue model.path$(pwd)/big-lama indir$(pwd)/LaMa_test_images outdir$(pwd)/outputrefineTrue会启用图像-掩码金字塔式的多尺度精修refiner按n_iters、lr、max_scales、px_budget等参数逐尺度细化结果适合对修复质量有更高要求的场景相应地推理耗时会增加。掩码生成随机掩码数据集与参数命令行用法在 Docker 中一键生成随机掩码bash docker/1_generate_masks_from_raw_images.sh \ configs/data_gen/random_medium_512.yaml \ /directory_with_input_images \ /directory_where_to_store_images_and_masks \ --ext pngdocker/1_generate_masks_from_raw_images.sh 将三个参数映射为容器内的config.yaml / input / output其余参数如--ext通过$透传给bin/gen_mask_dataset.py。生成的掩码数据集格式image_crop000_mask000.png与image_crop000.png成对出现可直接作为indir喂给预测脚本。在宿主机上则直接调用python3 bin/gen_mask_dataset.py \ $(pwd)/configs/data_gen/random_medium_512.yaml \ my_dataset/val_source/ \ my_dataset/val/random_medium_512 \ --ext jpg掩码生成器会完成两件事先把输入图像 resize 并裁剪square crop后保存为.png再按配置生成随机掩码。--ext jpg表示输入图像后缀为 jpg。论文测试集对应的配置官方文档给出了论文中各测试集对应的数据生成配置注意官方未固定随机种子因此每次生成结果会略有差异掩码类型Places 512×512CelebA 256×256窄Narrow/Thinrandom_thin_512.yamlrandom_thin_256.yaml中Mediumrandom_medium_512.yamlrandom_medium_256.yaml宽Wide/Thickrandom_thick_512.yamlrandom_thick_256.yaml以上配置文件均位于 lama/configs/data_gen/。你可以把第一个参数替换为任意configs/data_gen下的配置或直接修改配置文件。掩码配置参数详解以 lama/configs/data_gen/random_thick_512.yaml 为例generator_kind: random # 随机掩码生成器 mask_generator_kwargs: irregular_proba: 1 # 不规则笔触状掩码的出现概率权重 irregular_kwargs: min_times: 1 # 每图不规则掩码最小数量 max_times: 5 # 每图不规则掩码最大数量 max_width: 250 # 笔触最大宽度像素 max_angle: 4 # 笔触最大角度 max_len: 450 # 笔触最大长度像素 box_proba: 0.3 # 矩形框掩码的出现概率权重 box_kwargs: margin: 10 # 框与图像边缘的最小间距 bbox_min_size: 30 # 矩形最小边长 bbox_max_size: 300 # 矩形最大边长 max_times: 4 min_times: 1 segm_proba: 0 # 语义分割掩码概率本配置未启用 squares_proba: 0 # 方块掩码概率本配置未启用 variants_n: 5 # 每张图生成的掩码变体数量 max_masks_per_image: 1 # 每张图像最多保留的掩码数 cropping: out_min_size: 512 # 裁剪输出最小边长 handle_small_mode: upscale # 小图放大策略 out_square_crop: True # 是否方形裁剪 crop_min_overlap: 1 # 裁剪与原图最小重叠度 max_tamper_area: 0.5 # 掩码面积占图像比例上限对比 lama/configs/data_gen/random_medium_256.yaml 可以看出 256 与 512 两套配置的差异256 版out_min_size: 256笔触更短更细max_width: 50、max_len: 100矩形框更小bbox_min_size: 10、bbox_max_size: 50说明掩码尺寸与训练/评估分辨率是配套设计的。max_tamper_area: 0.5则统一限制了掩码不超过图像面积的 50%。训练与评估Places、CelebA 与自定义数据训练前仍需执行cd lama export TORCH_HOME$(pwd) export PYTHONPATH$(pwd)并下载感知损失perceptual loss所需的语义分割模型权重mkdir -p ade20k/ade20k-resnet50dilated-ppm_deepsup/ wget -P ade20k/ade20k-resnet50dilated-ppm_deepsup/ http://sceneparsing.csail.mit.edu/model/pytorch/ade20k-resnet50dilated-ppm_deepsup/encoder_epoch_20.pth对应仓库中的 lama/models/ade20k/ 目录包含 resnet/mobilenet 骨干与segm_lib同步批归一化实现。训练配置 lama/configs/training/lama-fourier.yaml 中losses.resnet_pl.weights_path: ${env:TORCH_HOME}即引用该权重目录。Places 训练与评估# 下载 Places365-StandardTrain 105GB / Test 19GB / Val 2.1GB来自 High-resolution images 部分 wget http://data.csail.mit.edu/places/places365/train_large_places365standard.tar wget http://data.csail.mit.edu/places/places365/val_large.tar wget http://data.csail.mit.edu/places/places365/test_large.tar # 解压并生成 yaml 配置 bash fetch_data/places_standard_train_prepare.sh bash fetch_data/places_standard_test_val_prepare.sh # 为测试与 epoch 末尾可视化采样图像 bash fetch_data/places_standard_test_val_sample.sh bash fetch_data/places_standard_test_val_gen_masks.sh # 启动训练 python3 bin/train.py -cn lama-fourier locationplaces_standard # 采样论文评估所需的 3 万张未见过图像并生成掩码 bash fetch_data/places_standard_evaluation_prepare_data.sh # 在 thick 掩码512上推理 python3 bin/predict.py \ model.path$(pwd)/experiments/user_date:time_lama-fourier_/ \ indir$(pwd)/places_standard_dataset/evaluation/random_thick_512/ \ outdir$(pwd)/inference/random_thick_512 model.checkpointlast.ckpt # 计算指标FID/SSIM/LPIPS python3 bin/evaluate_predicts.py \ $(pwd)/configs/eval2_gpu.yaml \ $(pwd)/places_standard_dataset/evaluation/random_thick_512/ \ $(pwd)/inference/random_thick_512 \ $(pwd)/inference/random_thick_512_metrics.csv评估使用的三个指标分别来自仓库 lama/saicinpainting/evaluation/losses/ 下的ssim.py、lpips.py依赖 lama/models/lpips_models/ 中已提供的 alex/squeeze/vgg 权重与fid/fid_score.py。需要留意论文中 Places 的 FID/SSIM/LPIPS 数值是在上述评估流程产出的 30000 张图像上计算的评估数据的划分细节见论文附录。CelebA 训练与评估cd lama export TORCH_HOME$(pwd) export PYTHONPATH$(pwd) # 下载 CelebA-HQ 数据集data256x256.zip256×256 # 解压并切分 train/test/visualization、生成配置 bash fetch_data/celebahq_dataset_prepare.sh # 为 test 与 visual_test 生成掩码 bash fetch_data/celebahq_gen_masks.sh # 训练-cn 指定训练配置data.batch_size 覆盖批大小 python3 bin/train.py -cn lama-fourier-celeba data.batch_size10 # 在 thick 掩码256上推理 python3 bin/predict.py \ model.path$(pwd)/experiments/user_date:time_lama-fourier-celeba_/ \ indir$(pwd)/celeba-hq-dataset/visual_test_256/random_thick_256/ \ outdir$(pwd)/inference/celeba_random_thick_256 model.checkpointlast.ckpt用自己的数据训练官方文档给出了完整流程。首先按如下结构准备数据目录$ ls my_dataset train val_source # 2000 张以上 visual_test_source # 100 张以上 eval_source # 2000 张以上训练数据集的随机掩码由 LaMa 在训练时动态生成但验证集与可视化集需要固定掩码以保证评估一致性。假设要在 512×512 的 val 上按 thick/thin/medium 三种掩码评估且输入图像为 jpg# 对 val_source 生成三种掩码 python3 bin/gen_mask_dataset.py \ $(pwd)/configs/data_gen/random_thick_512.yaml \ my_dataset/val_source/ \ my_dataset/val/random_thick_512/ \ --ext jpg # random_medium_512 / random_thin_512 同理 # 对 visual_test_source 与 eval_source 重复上述过程生成结果形如image1_crop000_mask000.png/image1_crop000.png。接着创建 location 配置告诉训练框架各目录在哪touch my_dataset.yaml echo data_root_dir: $(pwd)/my_dataset/ my_dataset.yaml echo out_root_dir: $(pwd)/experiments/ my_dataset.yaml echo tb_dir: $(pwd)/tb_logs/ my_dataset.yaml mv my_dataset.yaml ${PWD}/configs/training/location/lama/configs/training/location/places_example.yaml 给出了同结构参考data_root_dir、out_root_dir、tb_dir、pretrained_models四个字段。随后检查数据配置 lama/configs/training/data/abl-04-256-mh-dist.yaml 是否与目录结构一致——该配置通过train.indir: ${location.data_root_dir}/train、val.indir: ${location.data_root_dir}/val、visual_test.indir: ${location.data_root_dir}/visual_test等插值引用 location并设置batch_size: 10、val_batch_size: 2、num_workers: 3其中visual_test.pad_out_to_modulo: 32表示可视化推理时按 32 对齐 padding。train 段的mask_gen_kwargs定义了训练时在线生成的掩码分布irregular 与 box 混合segm_proba: 0。确认无误后启动训练python3 bin/train.py -cn lama-fourier locationmy_dataset data.batch_size10训练过程中框架会依据my_dataset/val/上的得分挑选最优模型。对选中的某个 epoch如 epoch 32在未参与训练的eval上评估# 推理 python3 bin/predict.py \ model.path$(pwd)/experiments/user_date:time_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 \ $(pwd)/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官方文档同时提醒若在上述任一步骤卡住可参考 CelebA 部分的 bash 脚本lama/fetch_data/celebahq_dataset_prepare.sh、lama/fetch_data/celebahq_gen_masks.sh核对数据准备与掩码生成细节。配置覆盖与模型选项Hydra 参数覆盖所有训练配置基于 Hydra OmegaConf可用点号路径在命令行直接覆盖任意参数python3 bin/train.py -cn config data.batch_size10 run_titlemy-title其中-cn后省略.yaml后缀。这一机制贯穿整个仓库——例如前文中的data.batch_size10、model.checkpointlast.ckpt、refineTrue都是同一种覆盖方式。论文中的模型配置官方文档列出了可替换进训练命令的模型配置名位于 lama/configs/training/配置名说明big-lama论文最优模型Places2 / Places ChallengeFFC 生成器 大训练集big-lama-regularBig-LaMa 的 regular 变体lama-fourier标准 LaMaFourier 卷积主干lama-regular无 Fourier 分支的 regular 变体lama_small_train_masks训练掩码更小/更稀疏的变体训练配置 lama/configs/training/lama-fourier.yaml 展示了 LaMa 训练目标的全貌L1 损失仅作用于已知区域weight_known: 10、weight_missing: 0、R1 对抗损失kind: r1、weight: 10、特征匹配损失weight: 100、基于 ResNet 的感知损失weight: 30并通过defaults组装 location/data/generator/discriminator/optimizers/visualizer/evaluator/trainer/hydra 各子配置其中生成器默认ffc_resnet_075、判别器默认pix2pixhd_nlayer。在 Inpaint-Anything 中集成 LaMa本仓库在根目录提供了 lama_inpaint.py 作为 LaMa 的 Python 封装inpaint_img_with_lama函数承载了核心推理流程可从源码结构还原其步骤将输入图像归一化到[0,1]img.float().div(255.)掩码若取值{0,1}则先乘以 255加载预测配置 lama/configs/prediction/default.yaml并把model.path指向传入的 checkpoint 目录从模型目录读取训练时的config.yaml设置training_model.predict_only True、visualizer.kind noop推理时不产生可视化日志随后load_checkpoint加载权重并freeze()对 image/mask 张量做pad_tensor_to_modulo(…, 8)对齐将掩码二值化为(mask 0) * 1前向计算后取out_key: inpainted最后裁回原始尺寸并还原到uint8。该封装还提供build_lama_model/inpaint_img_with_builded_lama两函数用于先构建并驻留模型、再对多张图复用同一模型实例的批处理场景。命令行入口用法python lama_inpaint.py \ --input_img example/remove-anything/baseball.jpg \ --input_mask_glob results/baseball/mask*.png \ --output_dir results \ --lama_config lama/configs/prediction/default.yaml \ --lama_ckpt big-lama在 Inpaint-Anything 的整体链路中LaMa 通常承接 SAMSegment Anything等上游模块产出的分割掩码——例如 remove_anything.py 会把用户点击点交给 SAM 生成掩码再交给 LaMa 完成内容移除fill_anything.py、replace_anything.py 则在 LaMa 修复的基础上叠加 Stable Diffusion 等生成式模型完成填充与替换。仓库 example/remove-anything/ 下的样例即展示了原图 → 带掩码 → 修复结果的对应关系。因此掌握本指南的模型下载、掩码约定与lama_inpaint.py参数是把 LaMa 嵌入任意分割 修复流水线的关键一步。结语LaMa 以 Fourier 卷积获得全局感受野从而在大掩码 高分辨率这一组合上显著优于传统卷积修复模型。本指南从环境搭建、预训练模型下载、掩码数据生成到 Places/CelebA 训练评估与自定义数据训练再到 Inpaint-Anything 的 Python 封装完整覆盖了 LaMa 的落地路径。动手实践时建议先从big-lama预训练权重配合 lama/configs/prediction/default.yaml 跑通单图推理再逐步深入掩码生成参数与训练配置的调优。引用如果本文帮助你完成了相关工作可参考以下 BibTeX 引用原文载于 lama/README.mdarticle{suvorov2021resolution, title{Resolution-robust Large Mask Inpainting with Fourier Convolutions}, author{Suvorov, Roman and Logacheva, Elizaveta and Mashikhin, Anton and Remizova, Anastasia and Ashukha, Arsenii and Silvestrov, Aleksei and Kong, Naejin and Goka, Harshith and Park, Kiwoong and Lempitsky, Victor}, journal{arXiv preprint arXiv:2109.07161}, year{2021} }赞分享人工智能计算机视觉深度学习图像处理视频处理【免费下载链接】Inpaint-AnythingInpaint anything using Segment Anything and inpainting models.项目地址https://gitcode.com/gh_mirrors/in/Inpaint-Anything点击查看免费下载相关推荐突破分辨率限制LaMa大掩码图像修复技术原理解析突破分辨率限制LaMa大掩码图像修复技术原理解析 1. 图像修复的分辨率困境与LaMa的革新 传统图像修复 Image Inpainting 技术长期面临分人工智能计算机视觉深度学习图像处理Inpaint-Anything终极指南基于Segment Anything的智能图像修复神器Inpaint Anything终极指南基于Segment Anything的智能图像修复神器 Inpaint Anything是一款革命性的AI图像修复工具人工智能计算机视觉深度学习图像处理视频处理OpenRTX协议栈实现原理深入理解M17数字语音传输机制OpenRTX协议栈实现原理深入理解M17数字语音传输机制 OpenRTX 作为一款开源无线电固件其 M17数字语音传输协议栈 实现展现了现代业余无线电技术嵌入式物联网音视频上一篇openeuler/yocto-meta-renesas新手教程从安装到部署的完整路线图下一篇Ruby 文件读写与序列化实战从 File/IO 基础到 JSON、YAML 与状态持久化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考