DiffMatch:扩散模型 + 图像配对 + 密集匹配,如何在一对图像之间建立像素级的对应关系?

news2024/9/22 11:36:10

DiffMatch:扩散模型 + 图像配对 + 密集匹配

    • 提出背景
      • 效果检验
      • 密集匹配研究
    • 网络结构
      • 如何使用概率方法来解决密集对应问题?
      • 去噪扩散模型如何生成或恢复数据?
      • DiffMatch 如何找到两幅图像之间每个像素点的最佳匹配?
      • 如何寻找两个图像间最佳匹配点的密集对应关系 F∗ ?
      • 分阶段的训练方法
      • 模型训练完成后实际使用模型

 


提出背景

论文地址:https://arxiv.org/pdf/2305.19094.pdf

代码地址:https://ku-cvlab.github.io/DiffMatch/

 
在做一个项目,需要俩张配对图像相互转换的算法。

用 pix2pix(GAN)的效果不好。

因为 扩散模型 比 GAN模型 生成要好,那得找 扩散模型 + 配对算法,这就是 DiffMatch。

他这个很强,是密集特征匹配。

  • 与仅检测和匹配少量关键点的稀疏对应不同,密集对应匹配输入图像之间的所有点。
  • 密集对应的目标可以用数据项(负责直接衡量两幅图像之间特征的匹配程度)和先验项(利用我们已有的关于这些图像应有特性的知识来指导匹配过程。)来定义。

创新点

  • 为解决图像配对领域的问题 ---- 在一对图像之间建立像素级的对应关系。
  • DiffMatch受到扩散模型在学习后验分布方面的成功启发,采用了条件扩散基础框架,旨在显式地模拟匹配场分布。
  • 不同于仅关注最大化似然的现有学习方法,DiffMatch旨在学习在给定源图像和目标图像特征条件下的密集对应的后验分布。

比如你在一个拥挤的聚会中找一个朋友,但你只有他的模糊照片作为参考。

你的大脑不仅仅是在人群中寻找与照片相似的人(类似于最大化似然),还在考虑其他信息,比如你朋友可能的身高、他通常穿的衣服风格等(后验分布)。

DiffMatch的创新之处在于,不仅考虑图像间的直接相似性(像你寻找与照片相似的人),还考虑了其他的上下文信息(如你对朋友的其他知识),以更准确地找到匹配。

 

效果检验

  1. 源图像(a):这些是处理前的原始图像,作为比较的起点。

  2. 目标图像(b):这些图像是与源图像进行对比或匹配的对象。

  3. 使用现有方法估计的源图像变形(c-d)

    • 这部分展示了使用现有方法(称为“最先进的方法”)将源图像与目标图像进行匹配的结果。
    • “估计的对应关系”意味着系统试图弄清楚源图像的不同部分与目标图像的哪些部分相对应。
    • 这些方法在某些区域可能会遇到困难,比如在没有太多纹理的地方、图案重复的地方或源图像和目标图像之间有很大差异的地方。
  4. 使用DiffMatch的源图像变形(e)

    • 这展示了使用新技术DiffMatch进行相同匹配过程的结果。
    • 这里的主张是 DiffMatch 做得更好,特别是在具有挑战性的区域,如无纹理区域、重复图案和大位移。
  5. 真实情况(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(FDsrc,Dtgt)=Fargmaxp(Dsrc,DtgtF)p(F)=Fargmax{data term logp(Dsrc,DtgtF)+prior term logp(F)}.
  1. 基本概念:
    • 密集对应的目标是在两幅图像(源图像 Isrc 和目标图像 Itgt)之间找到每个像素点的对应关系。
    • 这里的对应关系用一个叫 F 的字段来表示,它定义了源图像中的每个像素点应该如何移动以匹配目标图像。

比如你在一个大型停车场里寻找一个特定的车位( F ∗ F^* F),这个车位是你朋友停的车位,你只知道了一些关于车位的线索( D src D_{\text{src}} Dsrc D tgt D_{\text{tgt}} Dtgt)。

  1. 如何实现:
    • 目标是找到一个最佳的对应字段 F*,使得给定源图像和目标图像的特征描述符 DsrcDtgt 时,F 的后验概率最大。
    • 这个过程可以用贝叶斯定理来分解和计算。
    • 简而言之,就是通过一个叫最大后验估计(MAP)的方法,找到最佳匹配字段 F*

车位( F F F)的概率 p ( F ∣ D src , D tgt ) p(F|D_{\text{src}},D_{\text{tgt}}) p(FDsrc,Dtgt)

  • 这个概率告诉我们,在已知车位的一些线索的情况下,找到正确车位的可能性。

寻找最可能的车位(argmax F F F

  • 这相当于考虑所有可能的车位,然后选择一个让这个概率最大化的车位。
  • 换句话说,就是在所有可能的车位中找到最符合你所知线索的那一个。
  1. 计算过程:
    • 这个过程涉及两个主要部分:数据项(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,DtgtF) 这部分告诉我们,如果我们假设选择了一个特定的车位,那么这个车位上的线索与我们所知线索匹配的可能性有多大。
  • 就好比说,如果我猜这个车位是对的,那么我的猜测和实际的线索吻合的程度。

先验项(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常失真

  1. 基本概念:

    • 扩散模型是一种生成模型,可以分为无条件模型和条件模型两种。
    • 无条件扩散模型学习数据分布的显式近似,条件扩散模型则在给定某种条件(如文本提示)下估计数据分布。

     
    想象你现在手里有一幅模糊不清的图片,你的任务是通过一系列步骤使这幅图片变得清晰。

    扩散模型就像一个专业的修图工具,能够从这幅模糊的图片中重建出原来清晰的样子。

    无条件模型就是自己瞎摸索如何修图,而条件模型则是在你给出一些提示(比如图片应该是一只猫)后,按照这个提示来修图。

  2. 如何工作:

    • 在条件扩散模型中,数据分布是通过从高斯噪声中恢复数据样本的迭代去噪过程来近似的。
    • 这个过程涉及一个称为前向扩散的步骤,将样本从结构化状态转化为更加随机的状态,然后通过一个称为逆向扩散的过程,逐步去除噪声,恢复原始数据。

前向扩散过程 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=αt X0+1αt Z,ZN(0,I)

这个公式是扩散模型中的前向扩散过程的一部分,它描述了如何将一张清晰的图片(或任何类型的数据)逐渐转变成含有噪声的图片。

  1. (X_t):

    • 这代表时间点 (t) 的图片状态。
    • 在这个上下文中,(X_t) 是由原始清晰图片 (X_0) 经过 (t) 时间步的噪声扩散后的结果。
  2. 第一部分 α t X 0 \sqrt{\alpha_t}X_0 αt X0

    • 这是原始图片 X 0 X_0 X0 的一个缩放版本,其中 α t \alpha_t αt 是一个随时间变化的参数,它控制着原始图片信号的强度。
    • 当 (t) 增加时, α t \alpha_t αt 通常会减小,这意味着原始图片的信号变得越来越弱。
  3. 第二部分 1 − α t Z \sqrt{1 - \alpha_t}Z 1αt Z

    • 这是噪声部分。
    • (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 Xt1=αt1 Fθ(Xt,t;K)+1αt 1αt1σt2 (Xtαt Fθ(Xt,t;K))+σtZ

左边的 X t − 1 X_{t-1} Xt1

  • 这代表了在时间点 ( t-1 ) 的一个“状态”或者说是一张图像。
  • 你可以将其想象成正在逐步恢复清晰度的模糊图片。

第一部分 α t − 1 F θ ( X t , t ; K ) \sqrt{\alpha_{t-1}}\mathcal{F}_{\theta}(X_{t},t;K) αt1 Fθ(Xt,t;K)

  • 这是修复过程的核心部分。
  • F θ \mathcal{F}_{\theta} Fθ 是一个特殊的函数(通常是神经网络),它试图根据当前模糊的图片 ( X_t )、时间点 ( t ) 和其他条件 ( K ) 来预测更清晰的图片。
  • α t − 1 \sqrt{\alpha_{t-1}} αt1 是一个缩放因子,用于调整函数输出的影响程度。

第二部分 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αt 1αt1σt2 (Xtαt Fθ(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} )。

  1. 去噪过程:

    • 去噪过程可以看作是通过DDIM的条件采样过程和条件得分基生成模型之间的关系,来找到最大化 log p(X|K)X*

     
    在这个过程中,每一步你都会参考你的提示(比如,这里应该有猫的耳朵),然后尝试去除一些不合逻辑的噪声(比如,耳朵位置上不应该有脚的图案)。

    通过重复这个过程,每一步都让图片变得比上一步更接近最终的清晰图片。

    这就像是你有一副完全乱涂的画,你每次都根据记忆中的原画,慢慢把不对的地方改正过来,直到最后恢复成一个完整清晰的画面。

    在每一步修复中,你的目标都是让当前的画面更加接近你记忆中的原画,这个“记忆”就是模型中的“条件”。

    通过反复的修改和优化,最终你将得到一幅清晰的图片,这就是去噪扩散模型的最终目的。

 
网络结构:

上图是整个网络的组成,主要包括两个关键部分:

  • 条件去噪扩散模块
  • 成本注入模块

 

  1. 特征提取和初始化模块

    • 从源图像(Isrc)和目标图像(Itgt)中提取特征,生成特征描述符 DsrcDtgt
    • 初始流(Finit)是源图像特征向目标图像特征的初步映射。
  2. 成本注入模块

    • 此模块计算了源图像和目标图像特征之间的相似性(或差异),创建了一个成本体积(cost volume),以便为后续的扩散过程提供精细化的匹配信息。
  3. 条件去噪扩散模块

    • 这个模块包括前向扩散过程和逆向扩散过程。
    • 前向扩散过程通过添加高斯噪声来逐渐混淆特征映射 Ft,逐步增加随机性。
    • 逆向扩散过程则通过去噪网络(一个 U-Net 架构)来逐渐清除噪声并恢复特征映射,最终生成清晰的匹配字段 F0
  4. 扩散采样器

    • 通过迭代应用前向和逆向扩散过程,扩散采样器生成最终的匹配字段 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,DtgtF),

  1. F*:

    • 这表示最佳匹配字段,也就是我们试图找到的最好的匹配方式,将源图像上的每个点正确地对应到目标图像上。
  2. F θ ( D s r c , D t g t ) \mathcal{F}_\theta(D_{\mathrm{src}}, D_{\mathrm{tgt}}) Fθ(Dsrc,Dtgt)

    • 这是一个由参数 ( \theta ) 确定的函数 ( \mathcal{F} ),它试图计算出这个最佳匹配字段。
    • 你可以将其想象为一个计算机程序,它尝试解决如何将一张图像上的点对应到另一张图像上的问题。
  3. ≈ \approx

    • 这个符号表示近似。
    • 因为在实际应用中,我们通常无法得到完美的解,而是找到一个尽可能接近最佳的解。
  4. argmax ( F )

    • 这个操作表示在所有可能的匹配字段 ( F ) 中,找到那个使得后面的表达式(也就是数据项)最大化的 ( F )。
  5. 数据项(data term)

    • log ⁡ p ( D s r c , D t g t ∣ F ) \log p(D_{\mathrm{src}}, D_{\mathrm{tgt}}|F) logp(Dsrc,DtgtF) 是对数概率,表示在假设匹配字段 ( F ) 为真的情况下,源特征描述符和目标特征描述符一致的概率。
    • 换句话说,它衡量了假定的匹配方法对给定的图像特征有多好。

这个公式表示了一个过程,该过程通过计算概率来评估所有可能的匹配方案,然后选择最有可能正确匹配源图像和目标图像特征的那个匹配方案。

 

以前的深度神经网络也有估计数据项——也就是基于图像特征来找出最佳的像素点匹配。

但这些方法通常没有明确考虑先验知识(即在图像匹配中可能存在的一些假设或规律)。

虽然这些方法提高了性能,但可能因为忽略了先验知识,导致模型无法很好地泛化到未见过的数据上。

为了克服这些限制,作者探索了一种条件生成模型来显式学习数据项和先验项。

这与之前只依赖数据驱动学习的方法不同,该模型通过优化特定目标函数,同时考虑数据项和先验项。

条件扩散过程

  • 作者受扩散模型的启发,使用条件扩散过程来显式学习最优的匹配字段。
  • 扩散模型是一种生成高质量、多样化样本的模型,这些样本与给定条件紧密对齐。
  • 在这种情况下,条件指的是源图像和目标图像的特征。
  • 这个模型能够生成与给定条件一致的高质量和多样性的样本。

前向和逆向扩散

  • 在扩散模型中,前向扩散过程通过引入高斯噪声来逐步模糊匹配字段,而逆向扩散过程则试图从噪声中恢复出真实的匹配字段。
  • 在逆向扩散阶段,模型通过迭代去噪来逐步从噪声中恢复出精确的匹配关系。

最终目标

  • 这个去噪过程的目标是找到最优的匹配字段 F*,这个字段能最大化给定源图像和目标图像特征下的匹配概率。
  • 换句话说,它试图找到一个最佳的匹配配置,这个配置使得根据源图像和目标图像的特征所计算出的匹配概率最高。

这个方法论引入了一个条件生成模型来显式地学习图像间的匹配关系,同时考虑了数据驱动的证据和先验知识,以提高模型在不同图像匹配任务上的泛化能力。

通过这种方式,模型能更准确地找到两幅图像之间每个像素点的最佳匹配。

 

如何寻找两个图像间最佳匹配点的密集对应关系 F∗ ?


上图是两个相似的图片,一张是原图(源图 Isrc),另一张是稍有变动的图(目标图 Itgt),你的任务是找到这两张图片之间的对应关系。

换句话说,就是要看源图中的每个点在目标图中对应哪里。

这个过程可以分为以下几个步骤:

  1. 特征提取和初始化

    • 对源图和目标图进行特征提取,产生特征描述符 DsrcDtgt
    • 这就像是识别两张图片中各自的独特特点。
  2. 成本注入

    • 通过比较源图和目标图的特征描述符,计算出一个成本,这个成本能告诉我们源图中的点在目标图中对应的可能性有多大。
  3. 反向扩散过程

    • 用一个特殊的过程(反向扩散过程)从一些初步的猜测开始,逐步改进这些对应点的匹配,使它们越来越接近真实的匹配位置。
  4. 迭代重初始化

    • 这个过程不是一次就完成的,我们会多次重复进行,每次都用上一次的结果作为新的起点,这样能帮助我们更准确地找到每个点的最佳匹配位置。
  5. 循环一致性

    • 在我们有了源图到目标图和目标图到源图的匹配流之后,我们检查这两者是否一致。
    • 如果你从源图走到目标图,再从目标图回到源图,理论上你应该回到起点。这个检查就是为了确保匹配的一致性。
  6. 选取最佳匹配

    • 最后,我们在所有可能的匹配流中,选择那个在循环一致性检查中表现最好的匹配流作为最终的匹配结果。

通过这个技术,我们可以更稳定和准确地找到两张图片之间每个像素点的对应关系。

 
上图展示了作者提出的推理技术,旨在通过不同的初始化来稳定反向扩散过程,并测量估计的多个匹配流的平均值。

该过程首先对源图像(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)

  1. 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 ) 个点的特征描述。
  2. 点积 D s r c ( i ) ⋅ D t g t ( j ) D_{\mathrm{src}}(i) \cdot D_{\mathrm{tgt}}(j) Dsrc(i)Dtgt(j)

    • 点积(也称为内积)测量两个向量在同一方向上的相似度。
    • 如果两个向量在相同或相反方向上,则点积较大;如果它们正交(即角度为 90 度),点积为零。
  3. 范数 ∥ 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 ) 的直线距离。
  4. 余弦相似度 ( 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。
  • 在另一个方向上,反之亦然。
  • 在每次迭代中,保存每一步递归的预测,并在迭代过程结束时根据循环一致性选择最有信心的匹配。
  • 这种方法有助于过滤掉由重初始化引起的错误案例,从而显著提高性能。

通过这种分阶段的训练和推理过程,模型能够更精确地计算两个图像之间每个像素点的匹配关系。

 

模型训练完成后实际使用模型

一、推理阶段

  1. 高斯噪声逐步去噪

    • 推理开始时,输入带有高斯噪声的数据FT,然后通过一个叫做扩散逆过程的步骤,利用源特征描述符(Dsrc)和目标特征描述符(Dtgt)作为条件,逐步将噪声减少,得到一个更精确的匹配场(F0)。
  2. 多假设

    • 由于扩散模型本质上具有随机性,为了减少这种随机性并提高匹配性能,提出了利用多个假设的方法。
    • 这意味着从多个不同的初始状态FT开始,计算出多个匹配场的平均值。
  3. 递归重初始化

    • 如果初始匹配Finit有很大的误差,那么它可能不是一个好的起点。
    • 为了解决这个问题,提出了一个递归重初始化策略,即用之前估计的匹配场来迭代替换初始匹配场Finit。
    • 如果循环一致性误差超过预设的阈值,就会进行这样的迭代更新。
    • 这可以帮助模型找到更好的起点,朝着理想匹配的方向更有效地前进。
  4. 通过循环一致性剔除错误匹配

    • 在递归后,基于循环一致性,进一步提出了一个剔除错误匹配的方法
    • 具体操作是,使用双向两路采样方法来估计源到目标和目标到源的匹配。
    • 在每次迭代中,都会保存每一步的预测结果,并在迭代过程结束时,基于循环一致性选择最有信心的匹配。
    • 这种方法有助于筛选掉由于重初始化导致的错误匹配,从而显著提升性能。

这个推理过程通过递归重初始化和循环一致性检查,有效地提高了匹配的准确性,并且能够筛选出并丢弃那些错误的匹配结果,最终得到更加可靠和准确的匹配场。

 
比如你是一个侦探,你有两张照片,一张是犯罪现场(源图 Isrc),另一张是嫌疑人在另一个地方的照片(目标图 Itgt)。

你需要确定犯罪现场照片中的每个物体是否在嫌疑人照片中有对应物,以此来找到连接两个场景的线索。

一、推理阶段的步骤:

  1. 高斯噪声逐步去噪

    • 就像你从一堆含糊的线索开始,逐渐排除干扰,找到清晰的证据。
    • 在这个阶段,你将使用技术手段(扩散逆过程)来澄清和精确这些线索。
  2. 多假设

    • 因为线索可能会有误导,所以你会考虑多个不同的解释(假设),并从中找出最合理的平均线索。
  3. 递归重初始化

    • 如果最初的线索(Finit)非常不靠谱,你可能需要重新考虑。
    • 比如,如果你最初认为犯罪现场的某个物体与嫌疑人照片中的物体相匹配,但进一步的调查显示这个匹配是错误的,你就需要重新评估和更新你的线索。
  4. 通过循环一致性剔除错误匹配

    • 你会从两个方向考虑问题:从犯罪现场到嫌疑人(源到目标),然后从嫌疑人回到犯罪现场(目标到源),确保这两个方向的线索是一致的。
    • 就像确认嫌疑人走的路线是否能够来回无误,如果可以,那么这条线索就是可靠的。

通过这个复杂的过程,你最终能够确定犯罪现场的每个物体是否在嫌疑人的照片中有对应物,这有助于你解决案件。

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

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

相关文章

【论文阅读 SIGMOD18】Query-based Workload Forecasting for Self-Driving

Query-based Workload Forecasting for Self-Driving Database Management Systems My Summary ABSTRACT Autonomous DBMS的第一步就是能够建模并预测工作负载,以前的预测技术对查询的资源利用率进行建模。然而,当数据库的物理设计和硬件资源发生变化…

ssh: connect to host github.com port 22: Connection refused

ssh: connect to host github.com port 22: Connection refused 问题现象 本文以Windows系统为例进行说明,在个人电脑上使用Git命令来操作GitHub上的项目,本来都很正常,突然某一天开始,会提示如下错误ssh: connect to host gith…

【网站项目】基于ssm的青大校园预点餐系统

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

上次把默认的成员函数部分梳理完毕了:C初阶类与对象(三):详解复制构造函数和运算符重载 今天接着讲下面的内容: 文章目录 1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.2.1格式和概念1.2.2由来情况1情况2 1.2.3特性…

浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)

Web Scraper 是一个浏览器扩展,用于从页面中提取数据(网页爬虫)。对于简单或偶然的需求非常有用,例如正在写代码缺少一些示例数据,使用此插件可以很快从类似的网站提取内容作为模拟数据。从 Chrome 的插件市场安装后,页面 F12 打开…

flink学习之水位线

什么是水位线 在事件时间语义下,我们不依赖系统时间,而是基于数据自带的时间戳去定义了一个时钟, 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟,它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以…

【想要安利给所有人的开发工具】一款写笔记的工具——语雀

目录 📕开篇 ✍使用感受 👍语雀的常用功能 1、导出成图片 2、导出为PDF 3、代码的模块 4、流程图 ​5、画板类 6、程序员专用区 ​7、布局和样式 8、菜单栏的功能 9、其余功能(很多) 🚗为什么推荐语雀 &…

(二)CarPlay集成开发之苹果的iAP协议

文章目录 概要协议格式鉴权流程CarPlay中的iAP2协议应用小结 概要 iAP2协议是由苹果公司定义的一种数据通信协议,主要用于苹果设备认证外设,以及与外设数据交换的一种协议 协议格式 协议格式一共分为三种类型,分别为握手包,链路…

lattice Diamond Programmer程序下载

Lattice Diamond Programmer Diamond Programmer程序下载1 Diamond Programmer启动2 Diamond Programmer程序烧写3 Cannot Identify Device错误解决 Diamond Programmer程序下载 Diamond Programmer适用于Lattice公司的FPGA器件与CPLD器件的程序下载,其下载步骤如下…

如何才能拥有比特币 - 01 ?

如何才能拥有BTC 在拥有 BTC 之前我们要先搞明白 BTC到底保存在哪里?我的钱是存在银行卡里的,那我的BTC是存在哪里的呢? BTC到底在哪里? 一句话概括,BTC是存储在BTC地址中,而且地址是公开的,…

Python项目——搞怪小程序(PySide6+Pyinstaller)

1、介绍 使用python编写一个小程序,回答你是猪吗。 点击“是”提交,弹窗并退出。 点击“不是”提交,等待5秒,重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

android 开发 W/TextToSpeech: speak failed: not bound to TTS engine

问题 笔者使用TTS(TextToSpeech)对于文本内容进行语音播报,控制台报错 android 开发 speak failed:not bound to TTS engine详细问题 笔者核心代码: import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.…

react native Gradle的原国外地址、本地下载、国内阿里腾讯镜像三种下载配置

一、国外地址:(初始项目默认) 下载地址:https://services.gradle.org/distributions/ 文件地址见下图: 注意:这个地址下载十次就有九次是连接超时,建议换另外两种方法 二、下载到本地&#x…

LLM:ALiBi - 给注意力加上线性偏置

论文:https://arxiv.org/pdf/2108.12409.pdf 代码:https://github.com/ofirpress/attention_with_linear_biases 发表:2021 长度外推 参考:https://spaces.ac.cn/archives/9431#ALIBI 长度外推性是一个训练和预测的长度不一致…

tomcat原理模拟和tomcat优化

1、tomcat实现原理 servlet 没有主方法main,依赖tomcat才能运行,因为tomcat 有主方法main,由java编写 servlet中doGet和doPost方法属于非静态方法,只能依托new对象存在,tomcat无法new出来对象,因此tomcat…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代,代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP,用户可以隐藏自己的真实IP地址,并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

MySQL面试题 | 18.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

Vue3前端开发,借助Ref来获取组件内dom对象&#xff0c;借助defineExpose编译宏可以获取到子组件的属性和方法。 <script setup> import {onMounted, ref} from vue import Base from ./components/Base.vue import SetupDemo from ./components/SetupDemo.vue import Rea…

探索C++中std::string的弱点:你可能未曾注意到的缺点

C中std::string的弱点&#xff1a;你可能未曾注意到的缺点 一、背景二、性能方面的局限三、可变性带来的问题四、内存管理和指针操作五、Unicode和多字节字符集的支持六、其他替代方案七、总结 一、背景 C中std::string是一个非常重要的类&#xff0c;用于表示和处理字符串数据…