使用StableDiffusion进行图片Inpainting原理

在这里插入图片描述

  • 论文链接:RePaint: Inpainting using Denoising Diffusion Probabilistic Models
  • 代码链接:RePaint

Inpainting任务是指在任意一个二进制的掩码指定的图片区域上重新生成新的内容,且新生成的内容需要和周围内容保持协调。当前SOTA模型用单一类型的 mask 训练限制了模型的泛化能力,此外 pixel-wise 和 perceptual loss 会导致生成模型朝着纹理填充而不是语义修复方向更新。
本文提出了基于去噪扩散概率模型的图像修复方法Repaint,该方法甚至对于极端的 mask 情况(如mask 面积很大,几乎遮挡了整幅图像)都适用。本文利用一个预训练的 Unconditional DDPM 作为先验模型。为了调节生成过程,我们使用给定的图像信息仅对未屏蔽区域进行采样来改变反向扩散迭代。由于该技术不修改原始 DDPM 网络本身,因此该模型可以为任何修复形式生成高质量的图像。

1. 预备知识

本章节将介绍几个后面要用到的DDPM的结论,关于这些结论是如何得到的以及DDPM的相关知识可以移步至 通俗理解DDPM到Stable Diffusion原理。

扩散的前向过程:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) (1) q(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t\text{I})\quad\text{(1)} q(xtxt1)=N(xt;1βt xt1,βtI)(1)
进一步可以直接从 x 0 x_0 x0推到出加噪后的 x t x_t xt:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) ( 2 ) q(x_t|x_0)=\mathcal{N}(x_t;\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)\mathbf{I})\quad(2) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)(2)
反向降噪过程:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) ( 3 ) p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t))\quad(3) pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))(3)
降噪过程就是通过神经网络来预测高斯分布的参数 μ θ ( x t , t ) \mu_\theta(x_t,t) μθ(xt,t) Σ θ ( x t , t ) ) \Sigma_\theta(x_t,t)) Σθ(xt,t))

2. 方法

使用 x x x 表示 ground truth 图像,那么 m ⊙ x m\odot x mx 表示图像中被mask掉的未知区域, ( 1 − m ) ⊙ x (1-m)\odot x (1m)x 表示剩余已知区域。那么根据(2)式的加噪过程,可以在任意时间点采样得到 t t t 时刻的已知区域 m ⊙ x t m\odot x_t mxt,如下图所示:
在这里插入图片描述
即:
x t − 1 known ∼ N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) x_{t-1}^\text{known}\sim\mathcal{N}(\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)\mathbf{I}) xt1knownN(αˉt x0,(1αˉt)I)
根据(3)式的降噪过程生成 t t t 时刻的未知区域 ( 1 − m ) ⊙ x t (1-m)\odot x_t (1m)xt,如下图所示:
在这里插入图片描述
即:
x t − 1 unknown ∼ N ( μ θ ( x t , t ) , Σ θ ( x t , t ) ) x_{t-1}^\text{unknown}\sim\mathcal{N}(\mu_\theta(x_t,t),\Sigma_\theta(x_t,t)) xt1unknownN(μθ(xt,t),Σθ(xt,t))
将以上两部分的结果相加即可得到 t t t 时刻的修复结果,如下图所示:
在这里插入图片描述
即:
x t − 1 = m ⊙ x t − 1 known + ( 1 − m ) ⊙ x t − 1 unknown x_{t-1}=m\odot x_{t-1}^\text{known}+(1-m)\odot x_{t-1}^\text{unknown} xt1=mxt1known+(1m)xt1unknown
然后不断迭代下去,直到得到 x 0 x_0 x0.

Resampling技巧

当直接使用上述的方式进行Inpainting时,可以发现结果仅仅是修复的内容与已知区域匹配,但是语义并不正确。如下图所示,在 n = 1 n=1 n=1时,修复的区域是比较粗糙的纹理和够的毛相匹配,但是语义并不正确。
在这里插入图片描述
造成上述问题的原因是模型在用DDPM输出的结果和已知区域的采样结果从 x t x_t xt预测 x t − 1 x_{t-1} xt1时,使用(2)式对已知区域进行采样时并没有考虑到生成的部分。尽管模型尝试在降噪的每一步来协调图片,但是由于在每一步中都有上述相同问题,因此从来没有完全收敛。此外,在降噪的每一步中,由于方差策略 β t \beta_t βt的减小,图片的改变也随着减小,因此模型在后续迭代中无法纠正错误。

针对上述分析的问题,作者提出 resampliing 的方法,即对模型的输出 x t x_t xt 重新根据(1)式将其扩散回到 x t x_t xt,并把重采样操作的次数称为 jump length,用 j j j 表示, j = 1 j=1 j=1 表示不进行重采样。

如下所示,展示了Repaint的伪代码
在这里插入图片描述

3. 实验结果

(1)定性结果
在这里插入图片描述
(2)定性结果2
在这里插入图片描述
(3)定量结果
在这里插入图片描述
(3)降噪步数 T T T 和resampling步数 r r r 的关系
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级算法设计与分析(四) -- 贪心算法

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 高级算法设计与分析(四) -- 贪心算法 高级…

FATFS文件系统

文件系统是为了存储和管理数据,而在存储设备上建立的一种组织结构。 Windows常用的文件系统: 1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS FAT:File Alloction Table 文件分配表 在小型的嵌入式存储设备大多…

Ubuntu 常用命令之 ping 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 ping命令是一种网络诊断工具,用于测试主机之间网络的连通性。它发送ICMP Echo Request消息到指定的网络主机,并等待接收ICMP Echo Reply。通过这种方式,我们可以知道两台主机之间的网络是否畅通…

pycharm修改项目文件夹名称

目录 1 修改项目文件夹名称 2 修改代码中的项目名称 1 修改项目文件夹名称 选中项目文件夹,右键,选择refactor-rename。 选择rename project: 然后输入新的项目名称。 此时进入资源管理器,修改项目文件夹的名字,完成…

IntelliJ IDEA 2023.3 新功能介绍

IntelliJ IDEA 2023.3 在众多领域进行了全面的改进,引入了许多令人期待的功能和增强体验。以下是该版本的一些关键亮点: IntelliJ IDEA mac版下载 macappbox.com/a/intellij-idea-for-mac.html 1. AI Assistant 的全面推出 IntelliJ IDEA 2023.3 中&am…

ES-mapping

类似数据库中的表结构定义,主要作用如下 定义Index下的字段名( Field Name) 定义字段的类型,比如数值型、字符串型、布尔型等定义倒排索引相关的配置,比如是否索引、记录 position 等 index_options 用于控制倒排索记录的内容,有如…

钓鱼与木马实践(仅供参考不可实践)

声明:内容仅供学习,请勿违法使用,违者后果自负 一.部署云服务器 购买一台云服务器,Windows( 中文 )版本即可 华为云官网:https://www.huaweicloud.com/ 登录后进入控制台购买完成后远程登录云服务器 二.部署WEB运行…

QQ群发邮件的技巧?QQ邮箱邮件群发怎么发?

QQ群发邮件怎么设置?QQ邮件群发必备利器有哪些? QQ群发邮件,作为当下最流行的通讯方式之一,已经被广大网友所熟知。但是,要想真正掌握QQ群发邮件的技巧,却不是一件容易的事情。下面,就让蜂邮ED…

【Linux笔记】系统信息

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…

pmp到底是什么?

一、PMP是什么 PMP 是项目管理的入门级证书&#xff0c;全称是项目管理专业人士资格认证&#xff0c;由美国项目管理协会&#xff08;PMI&#xff09;举办的&#xff0c;从1999 年到现在已经有20多年发展历史了。 顾名思义&#xff0c;PMP考试就是一场评估应试者是否具备专业…

React学习计划-React16--React基础(五)脚手架创建项目、todoList案例、配置代理、消息订阅与发布

一、使用脚手架create-react-app创建项目 react脚手架 xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查、jsx编译、devServe…&#xff09;下载好了所有相关的依赖可以直接运行一个简单的效果 react提供了一个…

红队打靶练习:DIGITALWORLD.LOCAL: MERCY V2

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 6、总结 目录探测 1、gobuster 2、dirsearch WEB enum4linux枚举工具 smbclient工具 knock工具 CMS 文件包含漏洞 Tomcat 提权 系统信息收集 本地提权 get root 信息收集 1、arp ┌──…

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式&#xff1f; 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

Github 2023-12-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

VGGNet

目录 一、VGGNet介绍 1、VGG块 2、VGG架构 3、LeNet, AlexNet和VGGNet对比 4、总结 二、代码实现 1、定义VGG卷积块 2、VGG网络 3、训练模型 4、总结 一、VGGNet介绍 VGGNet&#xff08;Visual Geometry Group Network&#xff09;是一种深度卷积神经网络&#xff0c;…

java String转asc码,然后ascII再转四位的16进制数。

理论知识补充&#xff1a; char是Java中的保留字&#xff0c;表示一种数据类型。与别的语言不同的是&#xff0c;char在Java中是16位的&#xff0c;因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中&#xff0c;其值对应十进制的表示范围是0~127。 char是Java八…

《软件方法(下)》8.2.4 类和属性的命名

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.4 类和属性的命名 8.2.4.2 关于DDD话语中的“通用语言” DDD&#xff08;领域驱动设计&#xff09;话语中有“通用语言&#xff08;Ubiquitous L…

2023-12-22 linux C语言pthread_kill函数,pthread_kill(tid, 0)可以用来判断线程是否存在

一、该函数其实不是kill线程&#xff0c;而是向线程发送一个signal&#xff0c;pthread_kill()函数的作用是向某个线程传递一个信号&#xff0c;创建的线程中signal(SIGKILL,sig_handler)函数去处理对应的信号&#xff0c;如果你给一个线程发送了SIGQUIT、SIGKILL&#xff0c;但…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发&#xff0c;一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序&#xff0c;在unbuntu的repo中有2.2.0版本可用&#xff0c;在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装&#xff0c;但感觉上2.2.0和2…