写点什么

如何使用大蒙版修复 LaMa 隐藏图像中的对象?

  • 2022-03-03
  • 本文字数:2746 字

    阅读完需:约 9 分钟

如何使用大蒙版修复 LaMa 隐藏图像中的对象?

当前的图像修复系统往往需要处理大量缺失的部分,近来,Roman Suvorov 等人提出了一种叫做 LaMa 的 SOTA 技术,能够在给定的图像中屏蔽任意尺度的对象,并返回一个不包括我们所屏蔽物体的修复图像。在本文中,我们将从理论上探讨这种方法,并了解其具体工作原理。

关于图像修复


重建图像中缺失的区域,使得观众不能辨别出哪些区域是否被修复,称为图像修复。这种方法通常用于删除图片中不需要的内容,或者还原老照片的受损部分。

 

图像修复是一种有数百年历史的技术,是由人类艺术家手工完成的。它涉及填补艺术品的受损、变质或缺失区域,从而创造一幅完整的图像。油画或丙烯酸颜料、化学照片版画、雕塑、数字照片和视频都是可以用于这种方法的物理和数字艺术载体的例子。要解决图像修复问题,逼真地填补缺失的部分,就需要“理解”自然图像的大尺度结构,并对其进行图像合成。


近年来,学者们提出了各种自动化的修复方法。除了图像之外,这些算法中大多数都需要一个蒙版来显示修复区域作为输入。这个主题在深度学习出现之前就已经被研究过,近年来由于深入的、广泛的神经网络以及对抗学习的应用,发展加快了。

 

修复系统通常在一个庞大的自动生成的数据集上进行训练,该数据集通过随机掩蔽真实图像建立。复杂的两阶段模型结合中间预测,如经常被使用的平滑图像、边缘和图像分割。

LaMa 是如何解决这个问题的?

 

这种修复网络是基于最近发展起来的快速傅立叶卷积(Fast Fourier Convolutions,FFC)。即使在网络的早期阶段,FFC 也允许一个横跨整个图像的感受野。


研究人员表示,FFC 的这一特性提高了感知质量和网络参数效率。有趣的是,FFC 的归纳偏好使得网络能够得到高分辨率,这在训练期间是不存在的。这一发现具有重要的实际意义,因为它减少了所需的训练数据量和计算量。

 

它还采用了感知损失,这是基于一个具有较大感受野的语义分割网络。这是基于一个发现,一个不足的感受野影响着修复网络和知觉损失。这种损失支持全局结构和形状的一致性。

 

一种积极的训练蒙版生成技术,可以利用前两个组成部分的高感受野的潜力。这种方法生成了大量的、庞大的蒙版,使得网络能够充分利用模型和损失函数的高感受野。

 

所有这些促成了大蒙版修复(LaMa),即一种划时代意义的单阶段图像修复技术。高感受野架构 (i) 具有高感受野损失函数 (ii) 和激进的训练掩模生成算法 LaMa (iii) 的核心组成部分。我们将 LaMa 和目前的基准进行了严格的对比,并且对每一个建议组成部分的效果进行了评估。



大蒙版修复方案如上图所示(LaMa)。可以看出,LaMa 是基于一种前馈 ResNet 类修复网络,该网络采用了以下技术:最近提出的快速傅立叶卷积 (FFC),一个结合了对抗性损失和高感受野感知损失的多分量损失,以及一个训练时间较长的蒙版生成过程。

实施 LaMa

 

在本节中,我们将了解 LaMa 的官方实现,以及它是怎样有效地掩蔽用户标记的对象的。

 

让我们通过安装并导入所有的依赖关系来创建环境。

 

# Cloning the repo!git clone https://github.com/saic-mdal/lama.git # installing the dependencies!pip install -r lama/requirements.txt --quiet!pip install wget --quiet # change the directory% cd /content/lama # Download the model!curl -L $(yadisk-direct https://disk.yandex.ru/d/ouP6l8VJ0HpMZg) -o big-lama.zip!unzip big-lama.zip # Importing dependenciesimport base64, osfrom IPython.display import HTML, Imagefrom google.colab.output import eval_jsfrom base64 import b64decodeimport matplotlib.pyplot as pltimport numpy as npimport wgetfrom shutil import copyfileimport shutil
复制代码

 

为了方便用户在给定的图像中掩蔽所想掩蔽的对象,我们需要编写 HTML 代码。

 


现在,我们将上传我们想要掩盖其中的对象的图片,为其设置为 fname=None,蒙版将掩盖该对象。

 

if fname is None:  from google.colab import files  files = files.upload()  fname = list(files.keys())[0]else:  fname = wget.download(fname) shutil.rmtree('./data_for_prediction', ignore_errors=True)! mkdir data_for_prediction copyfile(fname, f'./data_for_prediction/{fname}')os.remove(fname)fname = f'./data_for_prediction/{fname}' image64 = base64.b64encode(open(fname, 'rb').read())image64 = image64.decode('utf-8') print(f'Will use {fname} for inpainting')img = np.array(plt.imread(f'{fname}')[:,:,:3]) draw(image64, filename=f"./{fname.split('.')[1]}_mask.png", w=img.shape[1], h=img.shape[0], line_width=0.04*img.shape[1])
复制代码

 


现在,我们将掩蔽图像中的鹿,就像我们通常在 Paint 应用程序中做的那样。

 


下面我们可以看到该模型是如何将被掩蔽的图像与原始图像进行卷积。

 


现在我们将进行推理。

 

print('Run inpainting')if '.jpeg' in fname:  !PYTHONPATH=. TORCH_HOME=$(pwd) python3 bin/predict.py model.path=$(pwd)/big-lama indir=$(pwd)/data_for_prediction outdir=/content/output dataset.img_suffix=.jpeg > /dev/nullelif '.jpg' in fname:  !PYTHONPATH=. TORCH_HOME=$(pwd) python3 bin/predict.py model.path=$(pwd)/big-lama indir=$(pwd)/data_for_prediction outdir=/content/output  dataset.img_suffix=.jpg > /dev/nullelif '.png' in fname:  !PYTHONPATH=. TORCH_HOME=$(pwd) python3 bin/predict.py model.path=$(pwd)/big-lama indir=$(pwd)/data_for_prediction outdir=/content/output  dataset.img_suffix=.png > /dev/nullelse:  print(f'Error: unknown suffix .{fname.split(".")[-1]} use [.png, .jpeg, .jpg]') plt.rcParams['figure.dpi'] = 200plt.imshow(plt.imread(f"/content/output/{fname.split('.')[1].split('/')[2]}_mask.png"))_=plt.axis('off')_=plt.title('inpainting result')plt.show()fname = None
复制代码

 

下面是修复后的图像:

 


真是令人振奋的结果。

结语

 

我们在本文中讨论了一个基本的、单阶段的解决方案的用法,用于大部分掩蔽部分的修复。我们认为,只要有合适的架构、损失函数和蒙版生成方法,这样的方法将会极具竞争力,从而促进图像修复技术的发展。特别是当涉及重复性像素时,这种方法能取得很好的效果。我建议大家用自己的照片多做实验,或者也可以在论文中找到更多的信息。

参考文献

 

 

作者介绍:

 

Vijaysinh Lendave,机器学习和深度学习的爱好者。熟练掌握机器学习算法,数据操作,处理和可视化,模型构建。

 

原文链接:

 

https://analyticsindiamag.com/how-to-hide-objects-in-images-using-large-mask-inpainting-lama/

2022-03-03 15:243435

评论

发布
暂无评论
发现更多内容

一次客户需求引发的K8S网络探究

京东科技开发者

k8s 中台架构 #k8s K8s 多集群管理 数据库·

使用 OpenTelemetry 零代码修改接收 SkyWalking 追踪数据

Daocloud 道客

云原生 可观测性 Skywalking OpenTelemetry

为什么 DevOps 会失败?

飞算JavaAI开发助手

2022 OceanBase数据库大赛开启,30W奖金等你来拿!

OceanBase 数据库

Go-Excelize API源码阅读(十七)——GetPageLayout、SetPageMargins

Regan Yue

Go 开源 源码解析 8月日更 8月月更

企业如何跨部门实现模型应用全生命周期管理

ModelWhale

数字化转型 应用模型 迭代管理 跨部门沟通 算法模型

从InfluxDB到TDengine,阳光氢能为什么会做出这个选择?

TDengine

数据库 tdengine 时序数据库

易周金融分析 | Q2手机银行活跃用户环比增长2.17%

易观分析

金融 手机银行

芯声智能亮相亚洲智能穿戴展,智能头盔声学方案为骑手保驾护航

硬科技星球

封仲淹:OceanBase社区版4.0未来畅想

OceanBase 数据库

ModelBox开发体验:使用YOLOv3做口罩检测

华为云开发者联盟

人工智能 ModelBox

企业如何将自身的数字技术及研究成果快速对外发布应用

ModelWhale

数字化转型 部署 应用模型 对外接口 协同开发

开源一夏 | 如何在 JavaScript 中创建虚拟键盘

海拥(haiyong.site)

JavaScript 开源 前端 8月月更

即时通讯安全篇(十):IM聊天系统安全手段之通信连接层加密技术

JackJiang

网络安全 https 网络编程 即时通讯 SSL/TLS

Web3 的通行证——DID 带来数字身份革命

One Block Community

云原生数据库白皮书,发布!

华为云开发者联盟

数据库 云原生 后端 华为云 白皮书

「数澈软件」获5300万元种子轮融资,构建新一代软件供应链防火墙

SEAL安全

软件供应链安全

创建第一个 Cypress 应用后使用命令行 npx Cypress open 报错的原因分析

汪子熙

前端开发 自动化测试 Cypress web开发 8月月更

精妙绝伦!10年阿里工作经验总结出这份亿级高并发系统设计手册,真的太强了!

退休的汤姆

Java、 面经 社招 Java工程师 秋招

基于高效采样算法的时序图神经网络系统(一)

Baihai IDP

人工智能 神经网络 深度学习 图数据

收到面试通知后,如下的准备可以大大提升面试成功率

TimeFriends

8月月更

产品和管理必备技能 Top 5

宇宙之一粟

产品 领导力 8月月更

PingCode 权限系统设计与实现

PingCode研发中心

权限系统

【LeetCode】合并区间Java题解

Albert

LeetCode 8月月更

企业数字化转型,如何实现业务部门与算法部门共同探索模型开发优化

ModelWhale

数据分析 工作流 数字化转型 业务思维 协同开发

企业引进外部专家合作开发时,如何保证数字资产既开放又安全?

ModelWhale

数字化转型 数据安全 资产安全 技术专家 协同开发

开源一夏 | STM32对接涂鸦wifi模块项目(智能插座-开源)

矜辰所致

开源 stm32 WiFi物联网智能插座 8月月更 涂鸦智能

阿里云 EMAS Serverless 重磅发布

hum建应用专家

云原生

“副业焦虑”席卷Z世代,今天你的副业失败了吗?

博文视点Broadview

J2EE进阶(三)struts2 <s:action>标签的用法及Spring在web.xml中的配置

No Silver Bullet

spring Struts2 8月月更 <s:action>

字节内部MySQL宝典意外流出!堪称数据库的天花板

退休的汤姆

Java、 面经 Java工程师 秋招 MySQL 数据库

如何使用大蒙版修复 LaMa 隐藏图像中的对象?_文化 & 方法_Vijaysinh Lendave_InfoQ精选文章