- 人工智能
- 计算机视觉
- 深度学习
- 图像处理
- 视频处理
【免费下载链接】Inpaint-Anything
Inpaint anything using Segment Anything and inpainting models.
LaMa(Large 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 Convolution,FFC)。在仓库源码 lama/saicinpainting/training/modules/ffc.py 中可以看到其实现:
FourierUnit(ffc.py 第 49 行起)在 forward 中会对输入特征做 FFT 频谱变换,通过 1×1 卷积在频域完成特征混合,再经逆变换回到空间域;FFCSE_block在频域分支上引入 SE(Squeeze-and-Excitation)注意力,让模型按通道自适应地融合"局部细节(local)"与"全局频谱(global)"两条路径的信息;- 该实现源自 NeurIPS 2020 的 Fast Fourier Convolution 论文(文件头部注释有原始项目出处)。
频域操作天然具有全局感受野,这正是 LaMa 能理解大面积缺失区域上下文、并流畅补全重复纹理结构的底层原因。
环境搭建:三种可选方案
仓库提供了三条环境安装路径,对应 lama/requirements.txt、lama/conda_env.yml 与 lama/docker/Dockerfile。
1. Python virtualenv
virtualenv inpenv --python=/usr/bin/python3 source inpenv/bin/activate pip install torch==1.8.0 torchvision==0.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 cudatoolkit=10.2 -c pytorch -y pip install pytorch-lightning==1.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-LaMa):
curl -L $(yadisk-direct https://disk.yandex.ru/d/ouP6l8VJ0HpMZg) -o big-lama.zip unzip big-lama.zip或一次性下载全部模型(Places 与 CelebA-HQ):
curl -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-lama) |
indir | 输入图像与掩码所在目录 |
outdir | 结果输出目录 |
model.checkpoint | 使用的 checkpoint 文件名,默认best.ckpt |
refine | 是否启用精修(refiner),默认关闭 |
4. 运行预测(Docker)
bash docker/2_predict.sh $(pwd)/big-lama $(pwd)/LaMa_test_images $(pwd)/output device=cpudocker/2_predict.sh 会把项目目录、模型目录、输入目录、输出目录分别挂载到容器内的固定路径,并透传model.path、indir、outdir、dataset.img_suffix等参数,容器内执行/home/user/project/bin/predict.py。脚本还支持追加任意predict.py参数($@透传),例如追加model.checkpoint=last.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 refine=True model.path=$(pwd)/big-lama indir=$(pwd)/LaMa_test_images outdir=$(pwd)/outputrefine=True会启用图像-掩码金字塔式的多尺度精修(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×512 | CelebA 256×256 |
|---|---|---|
| 窄(Narrow/Thin) | random_thin_512.yaml | random_thin_256.yaml |
| 中(Medium) | random_medium_512.yaml | random_medium_256.yaml |
| 宽(Wide/Thick) | random_thick_512.yaml | random_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-Standard(Train 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 location=places_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.checkpoint=last.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.zip,256×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_size=10 # 在 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.checkpoint=last.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 location=my_dataset data.batch_size=10训练过程中框架会依据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.checkpoint=epoch32.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_size=10 run_title=my-title其中-cn后省略.yaml后缀。这一机制贯穿整个仓库——例如前文中的data.batch_size=10、model.checkpoint=last.ckpt、refine=True都是同一种覆盖方式。
论文中的模型配置
官方文档列出了可替换进训练命令的模型配置名(位于 lama/configs/training/):
| 配置名 | 说明 |
|---|---|
big-lama | 论文最优模型(Places2 / Places Challenge,FFC 生成器 + 大训练集) |
big-lama-regular | Big-LaMa 的 regular 变体 |
lama-fourier | 标准 LaMa(Fourier 卷积主干) |
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 通常承接 SAM(Segment 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.md):
@article{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-Anything
Inpaint anything using Segment Anything and inpainting models.
相关推荐
突破分辨率限制:LaMa大掩码图像修复技术原理解析
突破分辨率限制:LaMa大掩码图像修复技术原理解析 1. 图像修复的分辨率困境与LaMa的革新 传统图像修复 Image Inpainting 技术长期面临"分
人工智能计算机视觉深度学习图像处理Inpaint-Anything终极指南:基于Segment Anything的智能图像修复神器
Inpaint Anything终极指南:基于Segment Anything的智能图像修复神器 Inpaint Anything是一款革命性的AI图像修复工具
人工智能计算机视觉深度学习图像处理视频处理OpenRTX协议栈实现原理:深入理解M17数字语音传输机制
OpenRTX协议栈实现原理:深入理解M17数字语音传输机制 OpenRTX 作为一款开源无线电固件,其 M17数字语音传输协议栈 实现展现了现代业余无线电技术
嵌入式物联网音视频
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考