提出背景
论文地址:https://arxiv.org/pdf/2305.19094.pdf
代码地址:https://ku-cvlab.github.io/DiffMatch/
在做一个项目,需要俩张配对图像相互转换的算法。
用 pix2pix(GAN)的效果不好。
因为 扩散模型 比 GAN模型 生成要好,那得找 扩散模型 + 配对算法,这就是 DiffMatch。
图像转换、密集对应差异
图像到图像的翻译问题:
例子:将日间的风景照片转换成夜间的风景照片。
- 目标:在这种问题中,目标是改变图像的整体风格或内容,而保持原始图像的基本结构。例如,在日转夜的转换中,原始图像中的树木、建筑物等仍会出现在转换后的图像中,但它们的外观(如光照、色调)会发生改变以模拟夜间的环境。
- 方法:通常使用的是生成对抗网络(GANs),如 Pix2Pix 或 CycleGAN,这些网络学会如何捕捉一种图像风格并将其应用到另一种风格上。
密集对应问题:
例子:在两幅场景相同但角度或时间不同的照片之间找到精确的像素对应关系。
- 目标:目的是在一个图像中的每个像素点找到在另一个图像中的确切匹配点。例如,在使用街景图像进行3D重建时,需要找到在不同角度拍摄的两张照片中相同的物理点。
- 方法:使用的是密集对应算法,如光流或特征匹配技术,这些技术能够精确地识别并对应两幅图像中相同的点。
区别:
- 应用目的:图像翻译关注于整体风格或内容的改变,而密集对应关注于找到精确的点对点匹配。
- 技术方法:图像翻译常用GANs等生成模型,侧重于风格转换;密集对应则使用特征匹配等技术,侧重于精确对齐。
- 结果展示:图像翻译结果通常是风格或外观上的显著变化;密集对应结果是两幅图像间精确对应点的集合。
寄,不是我要的图像转换算法。
但他这个很强,是密集特征匹配。
- 与仅检测和匹配少量关键点的稀疏对应不同,密集对应匹配输入图像之间的所有点。
- 密集对应的目标可以用数据项(负责直接衡量两幅图像之间特征的匹配程度)和先验项(利用我们已有的关于这些图像应有特性的知识来指导匹配过程。)来定义。
创新点:
- 为解决图像配对领域的问题 ---- 在一对图像之间建立像素级的对应关系。
- DiffMatch受到扩散模型在学习后验分布方面的成功启发,采用了条件扩散基础框架,旨在显式地模拟匹配场分布。
- 不同于仅关注最大化似然的现有学习方法,DiffMatch旨在学习在给定源图像和目标图像特征条件下的密集对应的后验分布。
比如你在一个拥挤的聚会中找一个朋友,但你只有他的模糊照片作为参考。
你的大脑不仅仅是在人群中寻找与照片相似的人(类似于最大化似然),还在考虑其他信息,比如你朋友可能的身高、他通常穿的衣服风格等(后验分布)。
DiffMatch 创新之处在于,不仅考虑图像间的直接相似性(像你寻找与照片相似的人),还考虑了其他的上下文信息(如你对朋友的其他知识),以更准确地找到匹配。
效果检验
-
源图像(a):这些是处理前的原始图像,作为比较的起点。
-
目标图像(b):这些图像是与源图像进行对比或匹配的对象。
-
使用现有方法估计的源图像变形(c-d):
- 这部分展示了使用现有方法(称为“最先进的方法”)将源图像与目标图像进行匹配的结果。
- “估计的对应关系”意味着系统试图弄清楚源图像的不同部分与目标图像的哪些部分相对应。
- 这些方法在某些区域可能会遇到困难,比如在没有太多纹理的地方、图案重复的地方或源图像和目标图像之间有很大差异的地方。
-
使用DiffMatch的源图像变形(e):
- 这展示了使用新技术 DiffMatch 进行相同匹配过程的结果。
- 这里的主张是 DiffMatch 做得更好,特别是在具有挑战性的区域,如无纹理区域、重复图案和大位移。
-
真实情况(f):
- 这是理想的或完美匹配的目标,是人们希望达到的状态。它展示了如果源图像与目标图像完美匹配,应该呈现的样子。
- 将 DiffMatch 的结果(e)与这个真实情况(f)进行比较,有助于理解这种新技术接近理想状态的程度。
上图比较了不同的图像匹配方法。
新方法 DiffMatch 被展示为比以前的方法更有效,尤其是在其他方法可能表现不佳的困难区域。
密集匹配研究
传统技术:
- 早期的密集对应技术侧重于手动设计匹配先验,即在算法中加入预先设定的规则或知识来帮助匹配过程。
比如拼一幅风景画:
- 需要手动设计的匹配先验就像是拼图时的一些基本规则或技巧。
- 如果使用“SIFT Flow”技术,首先寻找相似的颜色和纹理来拼接图像的平滑区域,以及尽量保持拼接部分之间的位移较小。
- 如果使用“DCTM”技术,在拼接时特别注意图像中的边缘和不连续区域,确保这些区域在拼图中正确对齐。
- 但可能难以仅凭规则完成整个画面,而且手动构建这些先验通常很困难。
近期进展:
- 最近的方法采用学习范式,设计目标函数来最大化似然(即直接从数据中学习匹配规则),希望能在大规模数据集上通过网络架构学习到最佳的匹配先验。
不使用预设规则,而是通过观察许多已经完成的拼图来“学习”如何拼图。
例如,“DGC-Net”和“GLU-Net”提出的粗到细的框架,先从大致位置开始拼接,然后逐渐细化,直到每个小片都精确放置。
例如,“COTR”使用的基于变压器的网络,能够更智能地理解各个拼图片之间的关系。
例如,“GOCor”提出的可微匹配模块,则类似于机器人在拼图过程中能够学习并解决那些难以匹配的部分。
尽管取得了一定成功,但这些方法在处理无纹理区域(单一颜色的天空)、重复图案(重复的波浪纹理)和大位移方面仍有不足,因为它们缺乏对先验的明确意识。
网络结构
如何使用概率方法来解决密集对应问题?
- F ∗ = argmax F p ( F ∣ D s r c , D t g t ) = argmax F p ( D s r c , D t g t ∣ F ) ⋅ p ( F ) = argmax F { log p ( D s r c , D t g t ∣ F ) ⏟ d a t a t e r m + log p ( F ) ⏟ p r i o r t e r m } . \begin{aligned} F^{*}& =\operatorname*{argmax}_{F}p(F|D_{\mathrm{src}},D_{\mathrm{tgt}})=\operatorname*{argmax}_{F}p(D_{\mathrm{src}},D_{\mathrm{tgt}}|F)\cdot p(F) \\ &=\underset{F}{\operatorname*{argmax}}\{\underbrace{\log p(D_{\mathrm{src}},D_{\mathrm{tgt}}|F)}_{\mathrm{data~term}}+\underbrace{\log p(F)}_{\mathrm{prior~term}}\}. \end{aligned} F∗=Fargmaxp(F∣Dsrc,Dtgt)=Fargmaxp(Dsrc,Dtgt∣F)⋅p(F)=Fargmax{data term logp(Dsrc,Dtgt∣F)+prior term logp(F)}.
-
基本概念:
- 密集对应的目标是在两幅图像(源图像
Isrc
和目标图像Itgt
)之间找到每个像素点的对应关系。 - 这里的对应关系用一个叫
F
的字段来表示,它定义了源图像中的每个像素点应该如何移动以匹配目标图像。
- 密集对应的目标是在两幅图像(源图像
比如你在一个大型停车场里寻找一个特定的车位( F ∗ F^* F∗),这个车位是你朋友停的车位,你只知道了一些关于车位的线索( D src D_{\text{src}} Dsrc 和 D tgt D_{\text{tgt}} Dtgt)。
-
如何实现:
- 目标是找到一个最佳的对应字段
F*
,使得给定源图像和目标图像的特征描述符Dsrc
和Dtgt
时,F
的后验概率最大。 - 这个过程可以用贝叶斯定理来分解和计算。
- 简而言之,就是通过一个叫最大后验估计(MAP)的方法,找到最佳匹配字段
F*
。
- 目标是找到一个最佳的对应字段
车位( F F F)的概率 p ( F ∣ D src , D tgt ) p(F|D_{\text{src}},D_{\text{tgt}}) p(F∣Dsrc,Dtgt):
- 这个概率告诉我们,在已知车位的一些线索的情况下,找到正确车位的可能性。
寻找最可能的车位(argmax F F F):
- 这相当于考虑所有可能的车位,然后选择一个让这个概率最大化的车位。
- 换句话说,就是在所有可能的车位中找到最符合你所知线索的那一个。
-
计算过程:
- 这个过程涉及两个主要部分:数据项(data term)和先验项(prior term)。
- 数据项表示源图像和目标图像特征描述符之间的匹配证据,而先验项则编码了对应字段
F
的先验知识。
数据项(data term):
- log p ( D src , D tgt ∣ F ) \log p(D_{\text{src}},D_{\text{tgt}}|F) logp(Dsrc,Dtgt∣F) 这部分告诉我们,如果我们假设选择了一个特定的车位,那么这个车位上的线索与我们所知线索匹配的可能性有多大。
- 就好比说,如果我猜这个车位是对的,那么我的猜测和实际的线索吻合的程度。
先验项(prior term):
- log p ( F ) \log p(F) logp(F) 这部分包含了关于车位的一些基本假设或先验知识。
- 比如,你可能会考虑停车场的布局,某些区域可能更常用于停车,或者你朋友有特定的停车习惯。
总之,这个公式的目的是要在所有可能的车位中找到最匹配线索的那一个,同时考虑到我们的先验知识。
在计算机视觉中, F F F 表示从一个图像到另一个图像的密集对应关系, D src D_{\text{src}} Dsrc 和 D tgt D_{\text{tgt}} Dtgt 表示源图像和目标图像的特征描述符,这个公式帮助我们找到最好的像素匹配。
去噪扩散模型如何生成或恢复数据?
基础知识:Diffusion 扩散模型:论生成领先多样性,GAN太单一;论尊贵清晰度独占鳌头,VAE常失真
-
基本概念:
- 扩散模型是一种生成模型,可以分为无条件模型和条件模型两种。
- 无条件扩散模型学习数据分布的显式近似,条件扩散模型则在给定某种条件(如文本提示)下估计数据分布。
想象你现在手里有一幅模糊不清的图片,你的任务是通过一系列步骤使这幅图片变得清晰。扩散模型就像一个专业的修图工具,能够从这幅模糊的图片中重建出原来清晰的样子。
无条件模型就是自己瞎摸索如何修图,而条件模型则是在你给出一些提示(比如图片应该是一只猫)后,按照这个提示来修图。
-
如何工作:
- 在条件扩散模型中,数据分布是通过从高斯噪声中恢复数据样本的迭代去噪过程来近似的。
- 这个过程涉及一个称为前向扩散的步骤,将样本从结构化状态转化为更加随机的状态,然后通过一个称为逆向扩散的过程,逐步去除噪声,恢复原始数据。
前向扩散过程: X t = α t X 0 + 1 − α t Z , Z ∼ N ( 0 , I ) X_t=\sqrt{\alpha_t}X_0+\sqrt{1-\alpha_t}Z,\quad Z\sim\mathcal{N}(0,I) Xt=αtX0+1−αtZ,Z∼N(0,I)
这个公式是扩散模型中的前向扩散过程的一部分,它描述了如何将一张清晰的图片(或任何类型的数据)逐渐转变成含有噪声的图片。
-
(X_t):
- 这代表时间点 (t) 的图片状态。
- 在这个上下文中,(X_t) 是由原始清晰图片 (X_0) 经过 (t) 时间步的噪声扩散后的结果。
-
第一部分 α t X 0 \sqrt{\alpha_t}X_0 αtX0:
- 这是原始图片 X 0 X_0 X0 的一个缩放版本,其中 α t \alpha_t αt 是一个随时间变化的参数,它控制着原始图片信号的强度。
- 当 (t) 增加时, α t \alpha_t αt 通常会减小,这意味着原始图片的信号变得越来越弱。
-
第二部分 1 − α t Z \sqrt{1 - \alpha_t}Z 1−αtZ:
- 这是噪声部分。
- (Z) 是从标准正态分布 N ( 0 , 1 ) \mathcal{N}(0, 1) N(0,1) 中抽取的噪声,它被乘以 1 − α t \sqrt{1 - \alpha_t} 1−αt,这个因子随着时间步 (t) 的增加而增大,这意味着噪声的影响随时间增加而变得更强。
整个公式实际上是在每一个时间步 (t) 将原始图片 (X_0) 与越来越强的噪声混合,以生成一个新的状态 (X_t)。
在扩散模型的训练过程中,模型学习如何逆转这个过程,即从噪声状态 (X_t) 恢复出清晰的原始状态 (X_0)。
这个过程就像是在清晰的图片上逐步叠加噪声,直到图片变得完全随机和模糊。
在生成模型的应用中,我们会尝试从噪声状态恢复出有意义的结构,这就是所谓的去噪过程。
逆向扩散过程: X t − 1 = α t − 1 F θ ( X t , t ; K ) + 1 − α t − 1 − σ t 2 1 − α t ( X t − α t F θ ( X t , t ; K ) ) + σ t Z X_{t-1}=\sqrt{\alpha_{t-1}}\mathcal{F}_{\theta}(X_{t},t;K)+\frac{\sqrt{1-\alpha_{t-1}-\sigma_{t}^{2}}}{\sqrt{1-\alpha_{t}}}\Big(X_{t}-\sqrt{\alpha_{t}}\mathcal{F}_{\theta}(X_{t},t;K)\Big)+\sigma_{t}Z Xt−1=αt−1Fθ(Xt,t;K)+1−αt1−αt−1−σt2(Xt−αtFθ(Xt,t;K))+σtZ
左边的 X t − 1 X_{t-1} Xt−1:
- 这代表了在时间点 ( t-1 ) 的一个“状态”或者说是一张图像。
- 你可以将其想象成正在逐步恢复清晰度的模糊图片。
第一部分 α t − 1 F θ ( X t , t ; K ) \sqrt{\alpha_{t-1}}\mathcal{F}_{\theta}(X_{t},t;K) αt−1Fθ(Xt,t;K):
- 这是修复过程的核心部分。
- F θ \mathcal{F}_{\theta} Fθ 是一个特殊的函数(通常是神经网络),它试图根据当前模糊的图片 ( X_t )、时间点 ( t ) 和其他条件 ( K ) 来预测更清晰的图片。
- α t − 1 \sqrt{\alpha_{t-1}} αt−1 是一个缩放因子,用于调整函数输出的影响程度。
第二部分 1 − α t − 1 − σ t 2 1 − α t ( X t − α t F θ ( X t , t ; K ) ) \frac{\sqrt{1-\alpha_{t-1}-\sigma_{t}^{2}}}{\sqrt{1-\alpha_{t}}}\Big(X_{t}-\sqrt{\alpha_{t}}\mathcal{F}_{\theta}(X_{t},t;K)\Big) 1−αt1−αt−1−σt2(Xt−αtFθ(Xt,t;K)):
- 这部分涉及到更复杂的调整。
- 它首先计算当前模糊图片 ( X_t ) 与通过 F θ \mathcal{F}_{\theta} Fθ 函数预测的清晰版本之间的差异,然后根据这个差异来调整恢复过程。
- 这里的 σ t 2 \sigma_{t}^{2} σt2 是另一个调整因子,用于控制这种调整的强度。
最后一部分 σ t Z \sigma_{t}Z σtZ:
- 这是一个随机噪声项,它的作用是在恢复过程中引入一些随机性。
- 这可以帮助模型避免过度确定性并保持一定的灵活性。
这个公式描述了扩散模型在逆向扩散过程中的一个步骤,其中模型试图从当前的模糊状态 ( X_t ) 恢复出更清晰的状态 ( X_{t-1} )。
-
去噪过程:
- 去噪过程可以看作是通过DDIM的条件采样过程和条件得分基生成模型之间的关系,来找到最大化
log p(X|K)
的X*
。
在这个过程中,每一步你都会参考你的提示(比如,这里应该有猫的耳朵),然后尝试去除一些不合逻辑的噪声(比如,耳朵位置上不应该有脚的图案)。通过重复这个过程,每一步都让图片变得比上一步更接近最终的清晰图片。
这就像是你有一副完全乱涂的画,你每次都根据记忆中的原画,慢慢把不对的地方改正过来,直到最后恢复成一个完整清晰的画面。
在每一步修复中,你的目标都是让当前的画面更加接近你记忆中的原画,这个“记忆”就是模型中的“条件”。
通过反复的修改和优化,最终你将得到一幅清晰的图片,这就是去噪扩散模型的最终目的。
- 去噪过程可以看作是通过DDIM的条件采样过程和条件得分基生成模型之间的关系,来找到最大化
网络结构:
上图是整个网络的组成,主要包括两个关键部分:
- 条件去噪扩散模块
- 成本注入模块
-
特征提取和初始化模块:
- 从源图像(
Isrc
)和目标图像(Itgt
)中提取特征,生成特征描述符Dsrc
和Dtgt
。 - 初始流(
Finit
)是源图像特征向目标图像特征的初步映射。
- 从源图像(
-
成本注入模块:
- 此模块计算了源图像和目标图像特征之间的相似性(或差异),创建了一个成本体积(cost volume),以便为后续的扩散过程提供精细化的匹配信息。
-
条件去噪扩散模块:
- 这个模块包括前向扩散过程和逆向扩散过程。
- 前向扩散过程通过添加高斯噪声来逐渐混淆特征映射
Ft
,逐步增加随机性。 - 逆向扩散过程则通过去噪网络(一个 U-Net 架构)来逐渐清除噪声并恢复特征映射,最终生成清晰的匹配字段
F0
。
-
扩散采样器:
- 通过迭代应用前向和逆向扩散过程,扩散采样器生成最终的匹配字段
Ft-1
。
- 通过迭代应用前向和逆向扩散过程,扩散采样器生成最终的匹配字段
整个网络的目标是利用条件扩散模型的强大能力来提高图像匹配任务的性能。
通过将源图像和目标图像的信息注入到扩散模型中,网络能够生成反映两图像间像素级对应关系的精确匹配字段。
这种方法对于处理图像中的复杂场景和模式,尤其是在存在大量噪声或扭曲时,可能特别有效。
DiffMatch 如何找到两幅图像之间每个像素点的最佳匹配?
给定 源特征描述符 D s r c D_{\mathrm{src}} Dsrc 和 目标特征描述符 D t g t D_{\mathrm{tgt}} Dtgt 的条件下,如何找到最佳匹配字段 F ∗ F^* F∗。
F ∗ = F θ ( D s r c , D t g t ) ≈ argmax F log p ( D s r c , D t g t ∣ F ) ⏟ data term , F^*=\mathcal{F}_\theta(D_{\mathrm{src}},D_{\mathrm{tgt}})\approx\operatorname{argmax}_F\underbrace{\log p(D_{\mathrm{src}},D_{\mathrm{tgt}}|F)}_{\text{data term}}, F∗=Fθ(Dsrc,Dtgt)≈argmaxFdata term logp(Dsrc,Dtgt∣F),
-
F*:
- 这表示最佳匹配字段,也就是我们试图找到的最好的匹配方式,将源图像上的每个点正确地对应到目标图像上。
-
F θ ( D s r c , D t g t ) \mathcal{F}_\theta(D_{\mathrm{src}}, D_{\mathrm{tgt}}) Fθ(Dsrc,Dtgt):
- 这是一个由参数 ( \theta ) 确定的函数 ( \mathcal{F} ),它试图计算出这个最佳匹配字段。
- 你可以将其想象为一个计算机程序,它尝试解决如何将一张图像上的点对应到另一张图像上的问题。
-
≈ \approx ≈:
- 这个符号表示近似。
- 因为在实际应用中,我们通常无法得到完美的解,而是找到一个尽可能接近最佳的解。
-
argmax ( F ):
- 这个操作表示在所有可能的匹配字段 ( F ) 中,找到那个使得后面的表达式(也就是数据项)最大化的 ( F )。
-
数据项(data term):
- log p ( D s r c , D t g t ∣ F ) \log p(D_{\mathrm{src}}, D_{\mathrm{tgt}}|F) logp(Dsrc,Dtgt∣F) 是对数概率,表示在假设匹配字段 ( F ) 为真的情况下,源特征描述符和目标特征描述符一致的概率。
- 换句话说,它衡量了假定的匹配方法对给定的图像特征有多好。
这个公式表示了一个过程,该过程通过计算概率来评估所有可能的匹配方案,然后选择最有可能正确匹配源图像和目标图像特征的那个匹配方案。
以前的深度神经网络也有估计数据项——也就是基于图像特征来找出最佳的像素点匹配。
但这些方法通常没有明确考虑先验知识(即在图像匹配中可能存在的一些假设或规律)。
虽然这些方法提高了性能,但可能因为忽略了先验知识,导致模型无法很好地泛化到未见过的数据上。
为了克服这些限制,作者探索了一种条件生成模型来显式学习数据项和先验项。
这与之前只依赖数据驱动学习的方法不同,该模型通过优化特定目标函数,同时考虑数据项和先验项。
条件扩散过程:
- 作者受扩散模型的启发,使用条件扩散过程来显式学习最优的匹配字段。
- 扩散模型是一种生成高质量、多样化样本的模型,这些样本与给定条件紧密对齐。
- 在这种情况下,条件指的是源图像和目标图像的特征。
- 这个模型能够生成与给定条件一致的高质量和多样性的样本。
前向和逆向扩散:
- 在扩散模型中,前向扩散过程通过引入高斯噪声来逐步模糊匹配字段,而逆向扩散过程则试图从噪声中恢复出真实的匹配字段。
- 在逆向扩散阶段,模型通过迭代去噪来逐步从噪声中恢复出精确的匹配关系。
最终目标:
- 这个去噪过程的目标是找到最优的匹配字段 F*,这个字段能最大化给定源图像和目标图像特征下的匹配概率。
- 换句话说,它试图找到一个最佳的匹配配置,这个配置使得根据源图像和目标图像的特征所计算出的匹配概率最高。
这个方法论引入了一个条件生成模型来显式地学习图像间的匹配关系,同时考虑了数据驱动的证据和先验知识,以提高模型在不同图像匹配任务上的泛化能力。
通过这种方式,模型能更准确地找到两幅图像之间每个像素点的最佳匹配。
如何寻找两个图像间最佳匹配点的密集对应关系 F∗ ?
上图是两个相似的图片,一张是原图(源图 Isrc
),另一张是稍有变动的图(目标图 Itgt
),你的任务是找到这两张图片之间的对应关系。
换句话说,就是要看源图中的每个点在目标图中对应哪里。
这个过程可以分为以下几个步骤:
-
特征提取和初始化:
- 对源图和目标图进行特征提取,产生特征描述符
Dsrc
和Dtgt
。 - 这就像是识别两张图片中各自的独特特点。
- 对源图和目标图进行特征提取,产生特征描述符
-
成本注入:
- 通过比较源图和目标图的特征描述符,计算出一个成本,这个成本能告诉我们源图中的点在目标图中对应的可能性有多大。
-
反向扩散过程:
- 用一个特殊的过程(反向扩散过程)从一些初步的猜测开始,逐步改进这些对应点的匹配,使它们越来越接近真实的匹配位置。
-
迭代重初始化:
- 这个过程不是一次就完成的,我们会多次重复进行,每次都用上一次的结果作为新的起点,这样能帮助我们更准确地找到每个点的最佳匹配位置。
-
循环一致性:
- 在我们有了源图到目标图和目标图到源图的匹配流之后,我们检查这两者是否一致。
- 如果你从源图走到目标图,再从目标图回到源图,理论上你应该回到起点。这个检查就是为了确保匹配的一致性。
-
选取最佳匹配:
- 最后,我们在所有可能的匹配流中,选择那个在循环一致性检查中表现最好的匹配流作为最终的匹配结果。
通过这个技术,我们可以更稳定和准确地找到两张图片之间每个像素点的对应关系。
上图展示了作者提出的推理技术,旨在通过不同的初始化来稳定反向扩散过程,并测量估计的多个匹配流的平均值。
该过程首先对源图像(Isrc)和目标图像(Itgt)进行特征提取和初始化,生成初始的流估计(F_init)。
接着进行成本注入,这一步增强了特征之间的匹配信号。
然后是反向扩散过程,它试图从包含噪声的估计中恢复出清晰的对应关系(F_0)。
此过程对于源到目标和目标到源的匹配都进行了操作。
通过这个过程,系统生成了两组流候选(源到目标和目标到源)。
为了确保这些流的一致性,即源到目标的匹配和目标到源的匹配是一致的,引入了循环一致性检查。
最后,通过比较所有流候选,选择最有信心的匹配结果作为最终的输出(F_0)。
网络架构细节:
成本计算:
两个特征向量之间的余弦相似度计算 C ( i , j ) = D s r c ( i ) ⋅ D t g t ( j ) ∥ D s r c ( i ) ∥ ∥ D t g t ( j ) ∥ C(i,j)=\frac{D_{\mathrm{src}}(i)\cdot D_{\mathrm{tgt}}(j)}{\|D_{\mathrm{src}}(i)\|\|D_{\mathrm{tgt}}(j)\|} C(i,j)=∥Dsrc(i)∥∥Dtgt(j)∥Dsrc(i)⋅Dtgt(j)
-
D s r c ( i ) D_{\mathrm{src}}(i) Dsrc(i) 和 D t g t ( j ) D_{\mathrm{tgt}}(j) Dtgt(j):
- 这两个是来自两个数据集(比如两个不同图像)的特征向量。
- 在这个上下文中, D s r c ( i ) D_{\mathrm{src}}(i) Dsrc(i) 可以认为是源图像中第 ( i ) 个点的特征描述,而 D t g t ( j ) D_{\mathrm{tgt}}(j) Dtgt(j) 是目标图像中第 ( j ) 个点的特征描述。
-
点积 D s r c ( i ) ⋅ D t g t ( j ) D_{\mathrm{src}}(i) \cdot D_{\mathrm{tgt}}(j) Dsrc(i)⋅Dtgt(j):
- 点积(也称为内积)测量两个向量在同一方向上的相似度。
- 如果两个向量在相同或相反方向上,则点积较大;如果它们正交(即角度为 90 度),点积为零。
-
范数 ∥ D s r c ( i ) ∥ \|D_{\mathrm{src}}(i)\| ∥Dsrc(i)∥ 和 ∥ D t g t ( j ) ∥ \|D_{\mathrm{tgt}}(j)\| ∥Dtgt(j)∥:
- 范数是向量的长度或大小。这里使用的是 L2 范数(也称为欧几里得范数),它测量从原点到点 ( i ) 或点 ( j ) 的直线距离。
-
余弦相似度 ( C(i,j) ):
- 这个比值给出了两个特征向量之间的余弦相似度。它的范围是从 -1 到 1
- 值为 1 意味着两个向量在同一方向上;
- 值为 -1 意味着它们在相反方向;值为 0 则表示向量正交,即不相关。
这个公式就像是用来确定两个人是否有相似兴趣的方法。
如果我们把每个人的兴趣比作一个向量,其中的每一项代表对某个主题的兴趣级别,那么通过比较这两个向量,我们就可以看出这两个人的兴趣有多相似。
如果他们在所有主题上的兴趣都很匹配,那他们的相似度就很高;如果他们的兴趣在某些方面相反,那他们的相似度就低;如果他们的兴趣毫不相关,那他们的相似度就是零。
在图像匹配中,这种相似度计算帮助算法确定不同图像中哪些点是相匹配的。
- 在整个成本计算过程中,首先需要计算匹配成本,这是通过计算源特征描述符(Dsrc)和目标特征描述符(Dtgt)之间所有位置的成对余弦相似性得分来实现的。
- 这个计算提供了特征间相似性的量化表示,可以用来评估匹配的质量。
条件去噪扩散模块:
- 这个模块使用了一个改进的 U-Net 架构来训练扩散模型。
- 它将源特征(Dsrc)和包含噪声的匹配估计(Ft)一起输入网络,并试图学习最初估计的匹配残差,以稳定学习过程并提供更好的初始化。
- 具体来说,使用匹配成本C初始化初始对应关系Finit,并将其作为网络的另一个条件。
成本注入模块:
- 作者进一步引入了成本注入模块,它通过集成成对图像之间的像素级交互作用,提高了匹配成本的判别能力。
- 这个模块包含了成本嵌入块和投影层。
- 通过使用多级特征,模型能够捕捉层次化的语义特征表示。
- 为每个特征分辨率的层级计算了类似于之前公式的相关性映射,并将其输入到成本嵌入块中以产生局部聚合体积。
- 最后,嵌入的相关性图被投影到对应的解码器层级以增加解码器的信息。
通过这种架构设计,网络不仅能够捕捉源图像和目标图像之间的直接相似性,还能够考虑到不同分辨率层次的语义信息,最终提供精确匹配的输出。
这个过程的目的是为了找到在给定的源图像和目标图像特征描述符下,最准确的匹配字段。
分阶段的训练方法
论文描述了一个分阶段的训练方法,用于优化神经网络架构的性能,这个架构用于计算机视觉中的密集对应问题。
这个方法包含了多个步骤,每个步骤都在训练过程中逐渐完善了模型的能力。
一、分阶段训练:
第一阶段:训练扩散先验
- 在这个阶段,去噪U-Net学习匹配场的先验知识。
- 这个网络使用源图像的特征(Dsrc)和初始匹配(Finit)作为输入,Finit起到给出匹配提示的作用。
- 这个阶段的目标是减少F0(真实匹配场)和网络预测值之间的差异。
第二阶段:注入成本信息
- 在第一阶段的基础上,第二阶段引入了额外的像素级交互信息,作为控制学到的先验的额外指导。
- 在这个阶段,冻结了第一阶段学到的去噪U-Net的所有参数,仅训练一个紧凑的成本注入模块。
- 这个模块的目的是让网络能够利用之前学到的生成先验,并结合外部的匹配成本。
- 这个阶段的损失函数旨在进一步减小F0和模型预测之间的差异。
二、推理过程:
多假设
- 为了应对基于扩散的模型的随机性,提出了使用多个假设来计算多个初始化FT的估计匹配场的平均值,这有助于减少模型的随机性并提高匹配性能。
递归重初始化
- 如果初始匹配Finit有很大的错误,可能不是理想的起点。
- 为了解决这个问题,提出了一个递归重初始化策略,它通过迭代使用之前估计的匹配场来替换Finit。
- 如果循环一致性误差超过预定义阈值,就会迭代更新Finit。
- 这样可以让网络找到更好的起点和更有效的路径,以达到理想的匹配。
通过循环一致性剔除错误匹配
- 进一步提出基于循环一致性来剔除递归后的错误匹配。
- 具体来说,使用双向两路采样方法。在一个方向上,从噪声Fsrc→tgtT和初始匹配Fsrc→tgtinit估计源到目标的匹配Fˆsrc→tgt0。
- 在另一个方向上,反之亦然。
- 在每次迭代中,保存每一步递归的预测,并在迭代过程结束时根据循环一致性选择最有信心的匹配。
- 这种方法有助于过滤掉由重初始化引起的错误案例,从而显著提高性能。
通过这种分阶段的训练和推理过程,模型能够更精确地计算两个图像之间每个像素点的匹配关系。
模型训练完成后实际使用模型
一、推理阶段:
-
高斯噪声逐步去噪:
- 推理开始时,输入带有高斯噪声的数据FT,然后通过一个叫做扩散逆过程的步骤,利用源特征描述符(Dsrc)和目标特征描述符(Dtgt)作为条件,逐步将噪声减少,得到一个更精确的匹配场(F0)。
-
多假设:
- 由于扩散模型本质上具有随机性,为了减少这种随机性并提高匹配性能,提出了利用多个假设的方法。
- 这意味着从多个不同的初始状态FT开始,计算出多个匹配场的平均值。
-
递归重初始化:
- 如果初始匹配Finit有很大的误差,那么它可能不是一个好的起点。
- 为了解决这个问题,提出了一个递归重初始化策略,即用之前估计的匹配场来迭代替换初始匹配场Finit。
- 如果循环一致性误差超过预设的阈值,就会进行这样的迭代更新。
- 这可以帮助模型找到更好的起点,朝着理想匹配的方向更有效地前进。
-
通过循环一致性剔除错误匹配:
- 在递归后,基于循环一致性,进一步提出了一个剔除错误匹配的方法
- 具体操作是,使用双向两路采样方法来估计源到目标和目标到源的匹配。
- 在每次迭代中,都会保存每一步的预测结果,并在迭代过程结束时,基于循环一致性选择最有信心的匹配。
- 这种方法有助于筛选掉由于重初始化导致的错误匹配,从而显著提升性能。
这个推理过程通过递归重初始化和循环一致性检查,有效地提高了匹配的准确性,并且能够筛选出并丢弃那些错误的匹配结果,最终得到更加可靠和准确的匹配场。
比如你是一个侦探,你有两张照片,一张是犯罪现场(源图 Isrc
),另一张是嫌疑人在另一个地方的照片(目标图 Itgt
)。
你需要确定犯罪现场照片中的每个物体是否在嫌疑人照片中有对应物,以此来找到连接两个场景的线索。
一、推理阶段的步骤:
-
高斯噪声逐步去噪:
- 就像你从一堆含糊的线索开始,逐渐排除干扰,找到清晰的证据。
- 在这个阶段,你将使用技术手段(扩散逆过程)来澄清和精确这些线索。
-
多假设:
- 因为线索可能会有误导,所以你会考虑多个不同的解释(假设),并从中找出最合理的平均线索。
-
递归重初始化:
- 如果最初的线索(Finit)非常不靠谱,你可能需要重新考虑。
- 比如,如果你最初认为犯罪现场的某个物体与嫌疑人照片中的物体相匹配,但进一步的调查显示这个匹配是错误的,你就需要重新评估和更新你的线索。
-
通过循环一致性剔除错误匹配:
- 你会从两个方向考虑问题:从犯罪现场到嫌疑人(源到目标),然后从嫌疑人回到犯罪现场(目标到源),确保这两个方向的线索是一致的。
- 就像确认嫌疑人走的路线是否能够来回无误,如果可以,那么这条线索就是可靠的。
通过这个复杂的过程,你最终能够确定犯罪现场的每个物体是否在嫌疑人的照片中有对应物,这有助于你解决案件。
总结
在计算机视觉中,DiffMatch是一个解决密集对应问题的方法。
DiffMatch的逻辑关系拆解
-
问题定义:找到源图像 ( D s r c ) ( D_{\mathrm{src}}) (Dsrc) 和目标图像 ( D t g t ) (D_{\mathrm{tgt}} ) (Dtgt) 之间的密集对应关系 F ∗ F* F∗。
-
解决方法:使用基于扩散模型的逆向过程,其中包括多个阶段的迭代优化,以及利用数据项和先验项的结合。
-
为什么使用这种方法:
- 多阶段迭代优化:因为直接计算密集对应关系在计算上是非常复杂的,而且容易受到噪声的影响 — 多阶段优化可以更精确地调整模型参数,逐步接近最佳匹配。
- 扩散模型:扩散模型用于生成模式,能够从噪声中恢复出有意义的结构 — 因为密集对应问题本质上是要从复杂或不完整的数据中找到清晰的对应关系,扩散模型非常适合这类任务。
特征组成
这个问题的解决方案 = 特征1 + 特征2 + 特征3,其中:
- 特征1:扩散模型的逆向过程能够逐步从含噪声的数据中恢复出清晰数据,适用于处理噪声和不确定性。
- 特征2:多阶段迭代优化允许模型逐步精化,使得每一步都基于上一步的结果来继续改进,而不是一次性求解。
- 特征3:数据项和先验项的结合确保了模型不仅仅依赖于观测数据(数据项),还能利用先前的知识(先验项)来指导匹配过程。
数据项可以理解为模型根据当前数据做出的最佳猜测。
先验项是模型在没有数据时的默认假设或知识。
这样的结合使得模型在处理缺少纹理、有重复模式或大位移的复杂情况时更为有效。
关键方法:递归式特征融合。
这是一个在DiffMatch中隐含使用的方法,指的是在每个阶段将前一阶段的输出作为输入,递归地融合特征信息和先验知识,以提高对应关系的准确性。
这样的递归式方法有效地利用了每一步迭代中获得的信息,避免了从头开始的重复工作,并且每次都在前一次的基础上进行改进。
假设你正在尝试制作一道复杂的菜肴,这道菜肴需要多次调味和尝试才能达到完美的口味。
-
初始尝试:
- 你根据食谱准备了第一次的菜肴版本,这就像是模型的初始匹配 F init F_{\text{init}} Finit。
-
尝味和调整:
- 你尝了一口菜,决定它需要更多的盐。
- 这就像是第一阶段的输出,你对菜肴的味道进行了初步评估。
-
递归调整:
- 接下来,你不是重新开始,而是在当前的基础上添加了盐。
- 然后再次尝味,看看是否需要其他调整。
- 这就是递归式特征融合——你在每次尝味后利用上一次的经验来改善菜肴的味道。
-
反复迭代:
- 这个过程可能会重复多次,每次都是在前一次的调整基础上进行,直到菜肴的味道达到你的预期。
- 这类似于在DiffMatch中每个阶段的输出都会成为下一个阶段输入的过程。
你不是每次都从零开始制作菜肴,而是在现有基础上进行改进,这样可以更快地达到理想的味道,就像DiffMatch在每个阶段逐渐提高匹配精度一样。文章来源:https://www.toymoban.com/news/detail-807777.html
这个递归的过程允许你在每一步中学习并应用新的知识,使最终结果比一次性尝试要好得多。文章来源地址https://www.toymoban.com/news/detail-807777.html
到了这里,关于DiffMatch:扩散模型 + 图像配对 + 密集匹配,如何在一对图像之间建立像素级的对应关系?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!