一、介绍

LaMa image inpainting 采用FFT卷积+普通卷积的方式从而有效地进行图像填充,仅在256×256分辨率图像上训练,就能实现高分辨清晰图像(~2k)的填充,同时采用现在refinement策略,进一步提升高分辨率图像的填充效果。本模型适用范围为室外自然场景。

项目仓库

仓库链接:LaMa图像填充 · 模型库 (modelscope.cn)

前置条件

在执行项目安装之前,我们还需要安装GitConda,如果您的电脑还未安装这两款软件,请先根据本站所给出的教程安装。

Windows系统安装Git请参阅此文章:

Windows系统安装Conda请参阅此文章:

网络问题

在安装过程中,你可能即便开启了魔法上网也无法下载一些编程依赖库,关于魔法上网的相关配置问题不方便在站内讲解,请自行查看【魔法上网】的教程内容。

部署教程

如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键后,在弹出的新窗口内输入CMD并按下回车键,打开CMD窗口,按顺序执行如下的每一条命令。

环境部署

在CMD中执行下面的命令行,创建一个名为cv_fft_inpainting_lamaConda虚拟环境,且Python版本为3.7

conda create -y --name cv_fft_inpainting_lama python=3.7

初始化Conda环境,防止后续操作可能存在报错等问题。

conda init cmd.exe

激活名为cv_fft_inpainting_lamaConda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。

conda activate cv_fft_inpainting_lama

执行如下命令,安装阿里达摩院魔塔模块。

pip install modelscope

执行如下命令,安装阿里达摩院所提供魔塔CV相关环境依赖。

pip install "modelscope[cv]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html

此时我们已经完成了关于此项目的所有相关环境部署,该项目的安装还是非常简单的,下面进入使用环节的介绍。

二、模型下载

官方下载

在你首次使用Python调用该环境进行语音转文本操作时,项目将会自动从阿里云拉取相应模型至本地。

网盘下载

关于此项目的模型,本站已为您下载并整理好。如果你不方便通过官网下载,可以使用本站所提供的网盘下载地址。

该项目的模型默认路径为%USERPROFILE%\.cache\modelscope\hub\damo,如果你是初次使用,可能不存在此路径,可以在CMD中执行如下代码判断该路径是否存在,如果不存在则自动创建。

<strong>if</strong> not exist %USERPROFILE%\.cache\modelscope\hub\damo mkdir %USERPROFILE%\.cache\modelscope\hub\damo

执行完上面的代码之后,我们可以通过在CMD执行下面的代码自动打开模型目录

start %USERPROFILE%\.cache\modelscope\hub\damo

将我们下载完成的模型文件解压缩,然后将解压后的文件移动damo文件夹下即可。

三、使用教程

此模型官方并未给出一个详细的脚本,本站针对不同场景,写了几个简单的Python脚本,可以满足你在各个环境下的基本使用要求。

代码编辑器

使用pycharm运行以下Python脚本即可。在运行该脚本之前,请先对以下Python脚本中的名称格式路径根据自身情况进行修改。

注意:使用VS Code执行该脚本时,VS Code会提示您选择一个Python环境,此时您可以选择名为cv_fft_inpainting_lama的Python环境,这就是我们刚刚使用Conda所生成的虚拟环境。

示例文件要求

该项目需要你提供两张图像第1张是你的原始图像;第2张遮罩图像,保有黑白信息。

白色的部分也就是需要修改的部分,白色会保持原样进行输出。

示例文件

普通推理|示例代码|支持CPU/GPU

可对高分辨率图像(~2k)进行图像填充,修复等。右侧demo采用该普通推理模式以减少资源消耗,若想采用精细推理请使用code进行调用

请将其中save_imageinput_locationinput_mask_location变量的,修改为你需要的路径,然后运行脚本即可。

# 此脚本由openai.wiki提供,转载请注明出处,谢谢配合。

import cv2
from modelscope.outputs import OutputKeys

from modelscope.pipelines import pipeline

from modelscope.utils.constant import Tasks

# 图像保存路径

save_image = 'D:/image_finish.png'

# 图像文件路径

input_location = 'D:/image_inpainting.png'

# 遮罩文件路径

input_mask_location = 'D:/image_inpainting_mask.png'

# 以下代码不要修改保持默认即可

input = {

'img':input_location,

'mask':input_mask_location,

}

inpainting = pipeline(Tasks.image_inpainting, model='damo/cv_fft_inpainting_lama')

result = inpainting(input)

vis_img = result[OutputKeys.OUTPUT_IMG]

cv2.imwrite(save_image, vis_img)

执行此段代码后需要等待片刻,具体时间与硬件和系统配置相关。

精细推理|示例代码|仅支持GPU

可对高分辨率图像(~2k)进行精细的图像填充,修复等,获得更加逼真的修复图片。

请将其中save_imageinput_locationinput_mask_location变量的,修改为你需要的路径,然后运行脚本即可。

# 此脚本由openai.wiki提供,转载请注明出处,谢谢配合。

import cv2
from modelscope.outputs import OutputKeys

from modelscope.pipelines import pipeline

from modelscope.utils.constant import Tasks

# 图像保存路径

save_image = 'D:/image_finish.png'

# 图像文件路径

input_location = 'D:/image_inpainting.png'

# 遮罩文件路径

input_mask_location = 'D:/image_inpainting_mask.png'

# 以下代码不要修改保持默认即可

input = {

'img':input_location,

'mask':input_mask_location,

}

inpainting = pipeline(Tasks.image_inpainting, model='damo/cv_fft_inpainting_lama', refine=True)

result = inpainting(input)

vis_img = result[OutputKeys.OUTPUT_IMG]

cv2.imwrite(save_image, vis_img)

执行此段代码后需要等待片刻,具体时间与硬件和系统配置相关。

四、效果示例

如果你抠图比较干净的话,那效果还算说的过去。

如果你的抠图遮罩效果不好,留下了较为明显的边缘,那么就会变成这样丑陋不堪。

官方参考

以下为官方所提供的参考参数等,本站并未进行整理,大家可根据自身需求浏览自己需要的部分。

模型训练

import os
import shutil

import tempfile

import unittest

from modelscope.hub.snapshot_download import snapshot_download

from modelscope.metainfo import Trainers

from modelscope.models.cv.image_inpainting import FFTInpainting

from modelscope.msdatasets import MsDataset

from modelscope.trainers import build_trainer

from modelscope.utils.config import Config, ConfigDict

from modelscope.utils.constant import ModelFile

from modelscope.utils.test_utils import test_level

model_id = 'damo/cv_fft_inpainting_lama'

cache_path = snapshot_download(model_id)

cfg = Config.from_file(

os.path.join(cache_path, ModelFile.CONFIGURATION))

train_data_cfg = ConfigDict(

name='PlacesToydataset',

split='train',

mask_gen_kwargs=cfg.dataset.mask_gen_kwargs,

out_size=cfg.dataset.train_out_size,

test_mode=False)

test_data_cfg = ConfigDict(

name='PlacesToydataset',

split='test',

mask_gen_kwargs=cfg.dataset.mask_gen_kwargs,

out_size=cfg.dataset.val_out_size,

test_mode=True)

train_dataset = MsDataset.load(

dataset_name=train_data_cfg.name,

split=train_data_cfg.split,

mask_gen_kwargs=train_data_cfg.mask_gen_kwargs,

out_size=train_data_cfg.out_size,

test_mode=train_data_cfg.test_mode)

assert next(

iter(train_dataset.config_kwargs['split_config'].values()))

test_dataset = MsDataset.load(

dataset_name=test_data_cfg.name,

split=test_data_cfg.split,

mask_gen_kwargs=test_data_cfg.mask_gen_kwargs,

out_size=test_data_cfg.out_size,

test_mode=test_data_cfg.test_mode)

assert next(

iter(test_dataset.config_kwargs['split_config'].values()))

kwargs = dict(

model=model_id,

train_dataset=train_dataset,

eval_dataset=test_dataset)

trainer = build_trainer(

name=Trainers.image_inpainting, default_args=kwargs)

trainer.train()

上述训练代码仅仅提供简单训练的范例,对大规模数据,例如Places2可以进行数据替换,直接放置在对应cache中即可;此外configuration.json(~/.cache/modelscope/hub/damo/cv_fft_inpainting_lama/)可以进行自定义修改;

模型局限性以及可能的偏差

  • 人脸修复、填充图片暂不支持
  • 当前版本在python 3.8环境测试通过,其他环境下可用性待测试
  • 当前版本fine-tune在cpu和单机单gpu环境测试通过,单机多gpu等其他环境待测试

训练数据介绍

  • Places2:包括8M自然图像用于训练,30k图片用于测试和评估

模型训练流程

  • 在Places2上使用Adam优化器,初始学习率为1e-3,训练1M iterations。

预处理

测试时主要的预处理如下:

  • Pad:图像高宽镜像填充至8的倍数
  • Normalize:图像归一化,像素大小由0-255归一化到0-1即可

数据评估及结果

采用我们提供的PlacesToydataset数据进行finetune后得到的结果FID一般为 30-80 之间(由于我们提供的数据少,而FID的计算依赖大量数据,故此处FID结果偏高且不稳定)

PlacesToydataset:

modelsPretrainFID
big-lamaImageNet-1k30-80

注:LaMa官方模型在Places2上report结果如下:

Places val:

modelsPretrainFID
big-lamaImageNet-1k2.97

引用

如果你觉得这个该模型对有所帮助,请考虑引用下面的相关的论文:

@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}

}

@article{kulshreshtha2022feature,
title={Feature Refinement to Improve High Resolution Image Inpainting},

author={Kulshreshtha, Prakhar and Pugh, Brian and Jiddi, Salma},

journal={arXiv preprint arXiv:2206.13644},

year={2022}

}

五、总结

关于这个模型,站长感觉并没有那么好用。而且还需要自己手动提供遮罩,如果用代码和其它项目结合,然后协作一下,效率还是挺高的。

因为官方并没有给出WebUI的可交互界面源码,所以也没有办法直接绘制,目前只能手动抠图遮罩文件,这非常不方便。如果你感兴趣,想通过涂鸦涂抹的方式来改图,可以考虑添加Gradio开源库,结合代码修改来完善这一功能,也不是特别特别难,但是很麻烦。