当前位置: 代码迷 >> 综合 >> UnSuperPoint:End-to-End Unsupervised Interest Point Detector And Descriptor 论文解读
  详细解决方案

UnSuperPoint:End-to-End Unsupervised Interest Point Detector And Descriptor 论文解读

热度:87   发布时间:2023-12-15 07:49:43.0

UnSuperPoint:End-to-End Unsupervised Interest Point Detector And Descriptor 论文解读

简介

特征点的语义信息并不明确难以用人工标注特征点位置的方法得到一个巨大的数据集,是深度学习方法用在特征点提取上的最大问题。

之前工作:

  • TILDE 用类似于sift的特征点作为真实值
  • Quad-network 基于图片单应变换结果训练,但输入为单个patch
  • LIFT,LF-Net 利用SfM中的特征点作为真实值
  • SuperPoint 利用模拟数据训练网络,自监督生成伪真实值

本工作类似于SuperPoint,但是是在其基础上的更进一步。

  • 在全图尺寸上运行
  • 不需要真实值,直接根据单应关系训练得到
  • 同时得到特征点位置和描述子

因此,本文创新点在于:

  • 提出一种自监督训练方法,不需要生成伪特征点真实值,能够直接训练得到特征点位置和得分
  • 提出新颖网络结构和损失函数,使得网络能够高效提取均匀分布的特征点,在速度精度和重复率等方面均达到最优

方法

网络结构

整体网络结构如下图,分为四个部分
在这里插入图片描述

  • 特征提取
    • VGG风格的特征提取,和SuperPoint基本一致,得到 W / 8 × H / 8 × 128 W/8 \times H/8 \times 128 W/8×H/8×128大小的特征
  • 得分分支
    • 经过两次卷积得到 W / 8 × H / 8 × 1 W/8 \times H/8 \times 1 W/8×H/8×1大小的矩阵,代表对应特征点的得分,得分在[0,1]之间。
  • 位置分支
    • 两次卷积得到 W / 8 × H / 8 × 2 W/8 \times H/8 \times 2 W/8×H/8×2大小的矩阵, W / 8 × H / 8 W/8 \times H/8 W/8×H/8个特征点坐标

    • 由于特征是下采样后的,只有 W / 8 × H / 8 W/8 \times H/8 W/8×H/8 大小,文中干脆就假设在 8 × 8 8\times 8 8×8范围内只有一个特征点,反倒起到非极大值抑制类似效果
      在这里插入图片描述

    • 特征点位置: ( x , y ) = ( c + P 1 ( r , c ) , r + p 2 ( r , c ) ) ? 8 (x,y) = (c + P_1(r,c), r + p_2(r,c)) * 8 (x,y)=(c+P1?(r,c),r+p2?(r,c))?8, 含义为第(r,c)位置上的矩阵包含 P 1 ( r , c ) , P 2 ( r , c ) P_1(r,c),P_2(r,c) P1?(r,c),P2?(r,c)两个数据,分别在0-1之间,代表位置系数。因此预测的特征点位置为 c + P 1 ( r , c ) , r + p 2 ( r , c ) c + P_1(r,c), r + p_2(r,c) c+P1?(r,c),r+p2?(r,c),此外乘上下采样系数便得到最终预测的特征点位置。

  • 描述子分支
    • 两次卷积,得到 W / 8 × H / 8 × 256 W/8 \times H/8 \times 256 W/8×H/8×256的描述子
    • 然后利用特征点位置对描述子进行插值

自监督学习方法

在这里插入图片描述

  • 这应该是最简单,最直观的特征点训练方式,这样都能训练出来才是最难的。

损失函数

文中花费了大量的笔墨描述损失函数的构造以及结果分析,个人目前认为合理的损失函数是能够如此简单直接的训练方法还能得到很好结果的原因。

  • 特征点位置和得分损失 L u s p L^{usp} Lusp
  • 特征点分布均匀性损失 L u n i x y L^{uni_xy} Lunix?y
  • 描述符损失 L d e s c L^{desc} Ldesc
  • 描述符正则化项 L d e c o r r L^{decorr} Ldecorr

整体的损失函数为:

L t o t a l = α u s p L u s p + α u n i x y L u n i _ x y + α d e s c L d e s c + α d e c o r r L d e c o r r L_{total} = \alpha_{usp} L^{usp} + \alpha_{uni_xy} L^{uni\_xy} + \alpha_{desc} L^{desc} + \alpha_{decorr} L^{decorr} Ltotal?=αusp?Lusp+αunix?y?Luni_xy+αdesc?Ldesc+αdecorr?Ldecorr

特征点位置和得分损失

由于需要两张图片提取的特征点一起确定误差项,因此首先需要确定如何对提取得到的特征点构建匹配关系。

将图片A中所有特征点变换到B中,计算和B中所有特征点的距离,取最近且小于最大值的一对点作为匹配点。

  • 距离计算
    G = [ g i j ] M A × M B = [ ∥ p i A → B ? p j B ∥ 2 ] M A × M B \mathbf{G}=\left[g_{i j}\right]_{M^{\mathrm{A}} \times M^{\mathrm{B}}}=\left[\left\|\mathbf{p}_{i}^{\mathrm{A} \rightarrow \mathrm{B}}-\mathbf{p}_{j}^{\mathrm{B}}\right\|_{2}\right]_{M^{\mathrm{A}} \times M^{\mathrm{B}}} G=[gij?]MA×MB?=[?piAB??pjB??2?]MA×MB?

  • 距离小于阈值的作为匹配点,记为 s ^ , P ^ , F ^ \hat{s},\hat{P},\hat{F} s^,P^,F^

损失函数

损失函数分为三个部分

  • 位置损失 l p o s i t i o n l^{position} lposition
  • 得分损失 l s c o r e l^{score} lscore
  • 匹配损失 l u s p l^{usp} lusp

总体得分如下:

L u s p = α p o s i t i o n ∑ k = 1 K l k p o s i t i o n + α s c o r e ∑ k = 1 K l k s c o r e + ∑ k = 1 K l k u s p L^{usp} = \alpha_{position} \sum_{k=1}^{K} l_k^{position} + \alpha_{score} \sum_{k=1}^{K} l_k^{score} + \sum_{k=1}^{K} l_k^{usp} Lusp=αposition?k=1K?lkposition?+αscore?k=1K?lkscore?+k=1K?lkusp?

位置损失

重投影误差:
l k p o s i t i o n = ∥ T p ^ k A ? p ^ k B ∥ l_k^{position} = \|T \hat{p}_k^A - \hat{p}_k^B\| lkposition?=Tp^?kA??p^?kB?

得分损失

两个匹配的特征点得分应该尽量接近

l k score  = ( s ^ k A ? s ^ k B ) 2 l_{k}^{\text {score }}=\left(\hat{s}_{k}^{\mathrm{A}}-\hat{s}_{k}^{\mathrm{B}}\right)^{2} lkscore ?=(s^kA??s^kB?)2

匹配损失

定义匹配误差:
d k = ∥ T p ^ k A ? p ^ k B ∥ = ∥ p ^ k A → B ? p ^ k B ∥ d_{k}=\left\|T \hat{\mathbf{p}}_{k}^{\mathrm{A}}-\hat{\mathbf{p}}_{k}^{\mathrm{B}}\right\|=\left\|\hat{\mathbf{p}}_{k}^{\mathrm{A} \rightarrow \mathrm{B}}-\hat{\mathbf{p}}_{k}^{\mathrm{B}}\right\| dk?=?Tp^?kA??p^?kB??=?p^?kAB??p^?kB??
那么,定义匹配损失:
l k usp  = s ^ k ( d k ? d ˉ ) l_{k}^{\text {usp }}=\hat{s}_{k}\left(d_{k}-\bar{d}\right) lkusp ?=s^k?(dk??dˉ)

其中,
s ^ k = s ^ k A + s ^ k B 2 \hat{s}_{k} = \frac{\hat{s}_{k}^A+\hat{s}_{k}^B}{2} s^k?=2s^kA?+s^kB??

d ˉ = 1 K ∑ k = 1 K d k \bar{d}=\frac{1}{K} \sum_{k=1}^{K} d_{k} dˉ=K1?k=1K?dk?

这样得分越高的点,匹配误差就越小,得分低的点匹配误差大一点没啥关系。

  • 之所以这么定义,可能是训练过程中的图片总是会有匹配不上的点,如果用整体的误差最小,可能难以收敛。只保证得分很高的前一部分特征点取得较高的精度能够去除掉一些无法匹配的区域影响,训练效果更好。
特征点分布均匀性损失

x , y x,y x,y坐标排序并归一化,从0开始,如果特征点分布的非常非常均匀则理想情况下应该是如此排列的。

x = [ 0 , 1 M ? 1 , 2 M ? 1 , 3 M ? 1 , ? , i ? 1 M ? 1 , ? , 1 ] x = [0, \frac{1}{M-1}, \frac{2}{M-1}, \frac{3}{M-1}, \cdots, \frac{i-1}{M-1}, \cdots , 1] x=[0,M?11?,M?12?,M?13?,?M?1i?1?,?,1]

上式为理想的坐标分布,那么实际情况下的均匀性误差为:
( x i sorted  ? i ? 1 M ? 1 ) 2 \left(x_{i}^{\text {sorted }}-\frac{i-1}{M-1}\right)^{2} (xisorted ??M?1i?1?)2

因此,从x,y两个方向分别定义如下的误差函数,代表和理想分布的距离:

L uni_xy  = α uni_xy  ( L uni_x + L uni_y  ) L uni_x  = ∑ i = 1 M ( x i sorted  ? i ? 1 M ? 1 ) 2 L uni_y  = ∑ i = 1 M ( y i sorted  ? i ? 1 M ? 1 ) 2 \begin{aligned} \mathcal{L}^{\text {uni\_xy }} &=\alpha_{\text {uni\_xy }}\left(\mathcal{L}^{\text {uni\_x}}+\mathcal{L}^{\text {uni\_y }}\right) \\ \mathcal{L}^{\text {uni\_x }} &=\sum_{i=1}^{M}\left(x_{i}^{\text {sorted }}-\frac{i-1}{M-1}\right)^{2} \\ \mathcal{L}^{\text {uni\_y }} &=\sum_{i=1}^{M}\left(y_{i}^{\text {sorted }}-\frac{i-1}{M-1}\right)^{2} \end{aligned} Luni_xy Luni_x Luni_y ?=αuni_xy ?(Luni_x+Luni_y )=i=1M?(xisorted ??M?1i?1?)2=i=1M?(yisorted ??M?1i?1?)2?

描述符损失

和SuperPoint特征点的描述符损失保持一致

L d e s c = ∑ i = 1 M A ∑ j = 1 M B l i j d e s c l i j d e s c = λ d ? c i j ? max ? ( 0 , m p ? f i A T f j B ) + ( 1 ? c i j ) ? max ? ( 0 , f i A T f j B ? m n ) \begin{aligned} \mathcal{L}^{\mathrm{desc}} &=\sum_{i=1}^{M^{A}} \sum_{j=1}^{M^{\mathrm{B}}} l_{i j}^{\mathrm{desc}} \\ l_{i j}^{\mathrm{desc}} &=\lambda_{d} \cdot c_{i j} \cdot \max \left(0, m_{p}-\mathbf{f}_{i}^{\mathrm{A}^{T}} \mathbf{f}_{j}^{\mathrm{B}}\right) \\ &+\left(1-c_{i j}\right) \cdot \max \left(0, \mathbf{f}_{i}^{\mathrm{A}^{T}} \mathbf{f}_{j}^{\mathrm{B}}-m_{n}\right) \end{aligned} Ldesclijdesc??=i=1MA?j=1MB?lijdesc?=λd??cij??max(0,mp??fiAT?fjB?)+(1?cij?)?max(0,fiAT?fjB??mn?)?

  • f j A , f j B \mathbf{f}_{j}^{\mathrm{A}},\mathbf{f}_{j}^{\mathrm{B}} fjA?,fjB?均为单位向量
  • f i A T f j B \mathbf{f}_{i}^{\mathrm{A}^{T}} \mathbf{f}_{j}^{\mathrm{B}} fiAT?fjB?结果为两个向量越接近值越大
  • c i j = 1 c_{ij} = 1 cij?=1为两点为匹配点时,仅有第一项,两向量尽可能接近时LOSS越小
  • c i j = 0 c_{ij} = 0 cij?=0为两点为匹配点时,仅有第二项,两向量尽可能远离时LOSS越小
描述符正则化项

目标减少特征描述符的过拟合并提高表达紧凑性,基于如下思考:

  • 若描述符的所有维度数值相关性很低,那么同样大小的描述子将会表达更多的信息,极端情况是如果描述符的所有维度线性相关,那么无论多少维最终表达的信息和1维没有任何差别。

描述符相关矩阵设为 R b = [ r i j b ] F × F \mathbf{R}^{b}=\left[r_{i j}^{b}\right]_{F \times F} Rb=[rijb?]F×F? 对于图像 b b b,代表F个描述子相互之间的相关性。(概率论里面互相关函数)

r i j b = ( v j b ? v ˉ j b ) T ( v i b ? v ˉ i b ) ( v j b ? v ˉ j b ) T ( v i b ? v ˉ i b ) ( v j b ? v ˉ j b ) T ( v i b ? v ˉ i b ) r_{i j}^{b}=\frac{\left(\mathbf{v}_{j}^{b}-\bar{v}_{j}^{b}\right)^{T}\left(\mathbf{v}_{i}^{b}-\bar{v}_{i}^{b}\right)}{\sqrt{\left(\mathbf{v}_{j}^{b}-\bar{v}_{j}^{b}\right)^{T}\left(\mathbf{v}_{i}^{b}-\bar{v}_{i}^{b}\right)} \sqrt{\left(\mathbf{v}_{j}^{b}-\bar{v}_{j}^{b}\right)^{T}\left(\mathbf{v}_{i}^{b}-\bar{v}_{i}^{b}\right)}} rijb?=(vjb??vˉjb?)T(vib??vˉib?) ?(vjb??vˉjb?)T(vib??vˉib?) ?(vjb??vˉjb?)T(vib??vˉib?)?

那么矩阵的非对角元素之和作为相关性评价损失:

L decorr  = ∑ i ≠ j F ( r i j a ) + ∑ i ≠ j F ( r i j b ) \mathcal{L}^{\text {decorr }}=\sum_{i \neq j}^{F}\left(r_{i j}^{\mathrm{a}}\right)+\sum_{i \neq j}^{F}\left(r_{i j}^{\mathrm{b}}\right) Ldecorr =i??=jF?(rija?)+i??=jF?(rijb?)

对角元素为自己和自己的相关性,那肯定为一,没有意义,因此采用非对角元素之后代表各个描述符之间的相关性。

实验

评价标准

特征提取
  • 重复率(RS)
    • 在 距 离 ρ 以 内 匹 配 上 的 特 征 点 对 数 能 够 匹 配 上 的 所 有 特 征 点 对 数 \frac{在距离\rho以内匹配上的特征点对数}{能够匹配上的所有特征点对数} ρ?
  • 定位误差(LE)
    • 在距离 ρ \rho ρ以内匹配上的特征点的平均误差(特征点对应的匹配点不超过另一张图片的范围即算能匹配上的点)
特征匹配
  • 匹配得分(MS)
    • 采 用 最 近 邻 搜 索 能 够 匹 配 上 , 且 误 差 在 距 离 ρ 以 内 的 特 征 点 对 数 能 够 匹 配 上 的 所 有 特 征 点 对 数 \frac{采用最近邻搜索能够匹配上,且误差在距离\rho以内的特征点对数}{能够匹配上的所有特征点对数} ρ?
  • 单应精度(HA)
    • 利用匹配点估计的单应矩阵和实际单应矩阵之间的误差

数据集

  • HPatchs

结果

  • 特征点提取

    • 提取结果达到了最优,比起传统方法好挺多
      在这里插入图片描述
  • 特征点匹配

    • 在误差较为宽松时较好
    • 误差非常严格时sift依旧非常优秀
      在这里插入图片描述

速度

在这里插入图片描述

  • 比SuperPoint要略快一些

总结

本文最大的意义在于向人们证明了,给定合适的损失函数,加上良好的网络结构,可以几乎完全由数据驱动,学习得到特征点的位置。但是论文没有直接将代码开源,有机会可以对其进行复现。

  相关解决方案