一、介绍
LaMa image inpainting 采用FFT卷积+普通卷积的方式从而有效地进行图像填充,仅在256×256分辨率图像上训练,就能实现高分辨清晰图像(~2k)的填充,同时采用现在refinement策略,进一步提升高分辨率图像的填充效果。本模型适用范围为室外自然场景。
项目仓库
仓库链接:LaMa图像填充 · 模型库 (modelscope.cn)
前置条件
在执行项目安装之前,我们还需要安装Git
和Conda
,如果您的电脑还未安装这两款软件,请先根据本站所给出的教程安装。
Windows系统安装Git请参阅此文章:
Windows系统安装Conda请参阅此文章:
网络问题
在安装过程中,你可能即便开启了魔法上网也无法下载一些编程依赖库,关于魔法上网的相关配置问题不方便在站内讲解,请自行查看【魔法上网】的教程内容。
部署教程
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD
并按下回车
键,打开CMD窗口,按顺序执行
如下的每一条命令。
环境部署
在CMD中执行下面的命令行,创建一个名为cv_fft_inpainting_lama
的Conda
虚拟环境,且Python
版本为3.7
。
conda create -y --name cv_fft_inpainting_lama python=3.7
初始化Conda
环境,防止后续操作可能存在报错等问题。
conda init cmd.exe
激活
名为cv_fft_inpainting_lama
的Conda环境
,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
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_image
|input_location
|input_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_image
|input_location
|input_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:
models | Pretrain | FID |
---|---|---|
big-lama | ImageNet-1k | 30-80 |
注:LaMa官方模型在Places2上report结果如下:
Places val:
models | Pretrain | FID |
---|---|---|
big-lama | ImageNet-1k | 2.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开源库,结合代码修改来完善这一功能,也不是特别特别难,但是很麻烦。