论文解读:SuperPoint: Self-Supervised Interest Point Detection and Description

在这里插入图片描述

发表时间: 2018年
项目地址:https://arxiv.org/abs/1712.07629
论文地址:https://github.com/magicleap/SuperPointPretrainedNetwork

本文提出了一种用于训练计算机视觉中大量多视点几何问题的兴趣点检测器和描述符的自监督框架。与patch-based的神经网络相比,我们的全卷积模型处理全尺寸的图像,并在一次前向传播中计算像素级的特征点和特征描述符。我们引入单应性自适应,这是一种多尺度、多单应性方法,用于提高兴趣点检测重复性并执行跨域自适应(例如,合成到真实)。我们的模型在使用同态的MS-COCO通用图像数据集自适应,能够重复检测更丰富的集合与初始预适应深度模型相比以及任何其他传统的角检测器。最终系统结果与LIFT、SIFT和ORB相比,产生了最先进的单应性估计。

1、 关键点

一种使用自我训练的自监督(self-training)解决方案,而不是使用人类监督来定义真实图像中的兴趣点。不需要人工标记数据,仅依赖于模型的迭代提升性能。

1.1 训练机制

通过对单个图像进行单适应性变化(透视变化),形成Image Pair,以孪生网络的机制进行训练

1.2 训练步骤

所有的训练都是使用PyTorch [19]完成的,默认参数为lr = 0.001和β =(0.9,0.999)的ADAM求解器(0.999)。我们还使用了标准的数据增强技术,如随机高斯噪声、运动模糊、亮度水平的变化,以提高网络对照明和视点变化的鲁棒性。

1、兴趣点预训练

先基于点和线等基本图形伪造了一个基本数据集:synthetic data,然后使用该数据集训练模型。synthetic data包含上百万的合成形状的数据集,形状都是由简单的几何图形(多边形、弧形、圆等图形)组成,在兴趣点(角点、定点)上是没有争议的(如)。该步骤训练出来的模型称之为MagicPoint,只能提取特征点,在该步骤进行了超过 200,000次的迭代训练(实时动态训练数据不重复)

synthetic data:

  • 基本形状:四边形、三角形、线和椭圆的合成数据渲染,由简化的二维几何组成
  • 歧义消除:使用Y连接、T连接、L连接、椭圆中心点、线条端点为特征点,以此消除歧义
  • 鲁棒性增强:对每个随机样本进行单适应变化,数据全为动态生成不重复

数据集示意如下:

2、兴趣点自监督

MagicPoint在shape上效果较好,但是域适应能力有限(在伪数据上训练,在真实数据上测试),与经典检测器相比,遗失了不少兴趣点。 为此,提出一种多尺度、多变换技术–Homographic Adaptation方法。将多尺度变化、仿射变化所生成的伪标签还原到原始图像中,用于生成最终的伪标签,用于提升检测器的特征点提取能力。该步骤训练出来的模型为SuperPoint,只能提取特征点,在COCO 2014数据集上训练,约80000多个图像(读取为灰度图),size为240x320,自监督时数据单适应变化参数 N h N_h Nh=100,该操作重复了两次。

方法的具体运算流程如下:

3、联合训练

在检测到鲁棒和可重复的兴趣点后,最常见的步骤是在每个点上附加一个固定的维度描述符向量,用于更高层次的语义任务,例如,图像匹配。最后将SuperPoint与一个描述符子网络结合起来(参见图2c)。由于超级点架构由一个深层的卷积层组成,它可以提取多尺度特征,因此可以直接将兴趣点网络与一个计算兴趣点描述符的附加子网络结合起来。该步骤训练出来的模型为SuperPoint,在提取提取特征点的基础上增加了特征描述符。

2、网络结构

SuperPoint在全尺寸的图像上运行,一次前向传播即可输出特征点和特征描述符(以往的方法需要两次,特征点与描述符要分开计算,缺乏共享),网络结构如下图所示,有一个共享的encoder部分。

2.1 实现代码

实现代码如下所示,是一个vgg风格的模型

class SuperPointNet(torch.nn.Module):
  """ Pytorch definition of SuperPoint Network. """
  def __init__(self):
    super(SuperPointNet, self).__init__()
    self.relu = torch.nn.ReLU(inplace=True)
    self.pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
    c1, c2, c3, c4, c5, d1 = 64, 64, 128, 128, 256, 256
    # Shared Encoder.
    self.conv1a = torch.nn.Conv2d(1, c1, kernel_size=3, stride=1, padding=1)
    self.conv1b = torch.nn.Conv2d(c1, c1, kernel_size=3, stride=1, padding=1)
    self.conv2a = torch.nn.Conv2d(c1, c2, kernel_size=3, stride=1, padding=1)
    self.conv2b = torch.nn.Conv2d(c2, c2, kernel_size=3, stride=1, padding=1)
    self.conv3a = torch.nn.Conv2d(c2, c3, kernel_size=3, stride=1, padding=1)
    self.conv3b = torch.nn.Conv2d(c3, c3, kernel_size=3, stride=1, padding=1)
    self.conv4a = torch.nn.Conv2d(c3, c4, kernel_size=3, stride=1, padding=1)
    self.conv4b = torch.nn.Conv2d(c4, c4, kernel_size=3, stride=1, padding=1)
    # Detector Head.
    self.convPa = torch.nn.Conv2d(c4, c5, kernel_size=3, stride=1, padding=1)
    self.convPb = torch.nn.Conv2d(c5, 65, kernel_size=1, stride=1, padding=0)
    # Descriptor Head.
    self.convDa = torch.nn.Conv2d(c4, c5, kernel_size=3, stride=1, padding=1)
    self.convDb = torch.nn.Conv2d(c5, d1, kernel_size=1, stride=1, padding=0)

  def forward(self, x):
    """ Forward pass that jointly computes unprocessed point and descriptor
    tensors.
    Input
      x: Image pytorch tensor shaped N x 1 x H x W.
    Output
      semi: Output point pytorch tensor shaped N x 65 x H/8 x W/8.
      desc: Output descriptor pytorch tensor shaped N x 256 x H/8 x W/8.
    """
    # Shared Encoder.
    x = self.relu(self.conv1a(x))
    x = self.relu(self.conv1b(x))
    x = self.pool(x)
    x = self.relu(self.conv2a(x))
    x = self.relu(self.conv2b(x))
    x = self.pool(x)
    x = self.relu(self.conv3a(x))
    x = self.relu(self.conv3b(x))
    x = self.pool(x)
    x = self.relu(self.conv4a(x))
    x = self.relu(self.conv4b(x))
    # Detector Head.
    cPa = self.relu(self.convPa(x))
    semi = self.convPb(cPa)

    # Descriptor Head.
    cDa = self.relu(self.convDa(x))
    desc = self.convDb(cDa)
    dn = torch.norm(desc, p=2, dim=1) # Compute the norm.
    desc = desc.div(torch.unsqueeze(dn, 1)) # Divide by norm to normalize.

    output = {
    
    'semi': semi, 'desc': desc}
    self.output = output
    return output

2.2 Shared Encoder

SuperPoint使用了一个VGG风格的[27]编码器来降低图像的size。该编码器由卷积层、池化空间降采样和非线性激活函数组成。编码器使用三个最大池层,其输出的特征图size在长宽上均为原图的1/8,及输出图的一个坐标点对应原图8x8的区域.此时,特征图的channel为256,相比于原图,具有更小的空间维度和更大的通道深度。

2.3 Interest Point Decoder

对于兴趣点检测,输出的每个像素对应于输入中该像素的“关键点”概率。head为两个conv的堆叠,实现代码为self.convPb(self.relu(self.convPa(x))),具体输出的特征维度为65维,即特征图上的一个像素点有65维,其中有64维对应着原图中一个不重叠的8x8区域,第65维作为垃圾桶(表示该区域没有特征点)。在后续步骤中,可以通过reshape操作,即可得到原图大小的特征点概率图,具体运算步骤如下:
H c = H / 8 R H c × W c × 64 ⇒ R H × W H_c=H/8 \\ \mathbb{R}^{H_{c} \times W_{c} \times 64} \Rightarrow \mathbb{R}^{H \times W} Hc=H/8RHc×Wc×64RH×W

2.4 Descriptor Decoder

特征描述符的提取与特征点提取类似,也为两个conv的堆叠,head实现代码为desc = self.convDb( self.relu(self.convDa(x)))。该head输出的特征图最终为N x 256 x H/8 x W/8,可以理解为原图8x8的区域像素都共用一个特征描述符。在输出时,对desc进行了L2归一化(整体值除以某个维度的2范数)。计算过程中shape变化如下:

import torch
desc=torch.rand((8,256,40,40)) # 模拟Descriptor Head的输出
dn = torch.norm(desc, p=2, dim=1) #torch.Size([8, 40, 40])   计算desc在第一个维度的二范数
dn = torch.unsqueeze(dn, 1)  #torch.Size([8, 1, 40, 40])
desc = desc.div(dn)  #torch.Size([8, 256, 40, 40])

3、loss设计

最终的损失是两个中间损失的和:一个用于兴趣点检测器Lp,另一个用于描述符Ld。使用成对的合成扭曲图<具有两个伪标签(兴趣点位置)和来自图像随机扭曲中的单应性矩阵H>。这允许我们同时优化两个损失,给出一对图像,。我们使用λ= 0.0001来平衡最终损失为:
L ( X , X ′ , D , D ′ ; Y , Y ′ , S ) = L p ( X , Y ) + L p ( X ′ , Y ′ ) + λ L d ( D , D ′ , S ) \begin{array}{l} \mathcal{L}\left(\mathcal{X}, \mathcal{X}^{\prime}, \mathcal{D}, \mathcal{D}^{\prime} ; Y, Y^{\prime}, S\right)= \\ \quad \mathcal{L}_{p}(\mathcal{X}, Y)+\mathcal{L}_{p}\left(\mathcal{X}^{\prime}, Y^{\prime}\right)+\lambda \mathcal{L}_{d}\left(\mathcal{D}, \mathcal{D}^{\prime}, S\right) \end{array} L(X,X,D,D;Y,Y,S)=Lp(X,Y)+Lp(X,Y)+λLd(D,D,S)
最终的输入有X、D、Y、S、X’、D’、Y’(两组XDY和单适应矩阵H),其中X为输入特征点,Y为特征点标签,D为输出的特征描述符,S为特征点的对应性(在特征描述符loss中会描述)。
兴趣点检测器loss Lp的计算公式如下,其代码实质就是在输出chanel上做了一次softmax激活。
L p ( X , Y ) = 1 H c W c ∑ h = 1 w = 1 H c , W c l p ( x h w ; y h w ) w h e r e l p ( x h w ; y ) = − log ⁡ ( exp ⁡ ( x h w y ) ∑ k = 1 65 exp ⁡ ( x h w k ) ) . \mathcal{L}_{p}(\mathcal{X}, Y)=\frac{1}{H_{c} W_{c}} \sum_{\substack{h=1 \\ w=1}}^{H_{c}, W_{c}} l_{p}\left(\mathbf{x}_{h w} ; y_{h w}\right) \\ where \\ l_{p}\left(\mathbf{x}_{h w} ; y\right)=-\log \left(\frac{\exp \left(\mathbf{x}_{h w y}\right)}{\sum_{k=1}^{65} \exp \left(\mathbf{x}_{h w k}\right)}\right) . Lp(X,Y)=HcWc1h=1w=1Hc,Wclp(xhw;yhw)wherelp(xhw;y)=log(k=165exp(xhwk)exp(xhwy)).
特征描述符loss Ld的计算公式如下,可以看到是一个加权的hinge loss(因为正样本对数量与负样本对的数量是不一样的,故对正样本用 λ d \lambda_{d} λd=250进行加权),其中s=1表示为正样本。 d T d ′ d^{T}d' dTd表示两个特征描述符的乘积,当描述符正交(垂直)时,乘积为0(即两个描述符不相似时【反向时】,乘积-1,相似时乘积接近1); m p m_p mp=1, m n m_n mn=0.2。该loss的本意就是,空间(通过仿射变化后)位置接近的点,所提取的特征描述符应该是相似的;空间位置远的点,所提取的特征描述符应该是不同的。
L d ( D , D ′ , S ) = 1 ( H c W c ) 2 ∑ h = 1 w = 1 H c , W c ∑ h ′ = 1 w ′ = 1 H c , W c l d ( d h w , d h ′ w ′ ′ ; s h w h ′ w ′ ) where l d ( d , d ′ ; s ) = λ d ∗ s ∗ max ⁡ ( 0 , m p − d T d ′ ) + ( 1 − s ) ∗ max ⁡ ( 0 , d T d ′ − m n ) \begin{array}{l} \mathcal{L}_{d}\left(\mathcal{D}, \mathcal{D}^{\prime}, S\right)= \frac{1}{\left(H_{c} W_{c}\right)^{2}} \sum_{\substack{h=1 w=1}}^{H_{c}, W_{c}} \sum_{\substack{h^{\prime}=1 w^{\prime}=1}}^{H_{c}, W_{c}} l_{d}\left(\mathbf{d}_{h w}, \mathbf{d}_{h^{\prime} w^{\prime}}^{\prime} ; s_{h w h^{\prime} w^{\prime}}\right) \\ \text{where} \\ l_{d}\left(\mathbf{d}, \mathbf{d}^{\prime} ; s\right)=\lambda_{d} * s * \max \left(0, m_{p}-\mathbf{d}^{T} \mathbf{d}^{\prime}\right) +(1-s) * \max \left(0, \mathbf{d}^{T} \mathbf{d}^{\prime}-m_{n}\right) \end{array} Ld(D,D,S)=(HcWc)21h=1w=1Hc,Wch=1w=1Hc,Wcld(dhw,dhw;shwhw)whereld(d,d;s)=λdsmax(0,mpdTd)+(1s)max(0,dTdmn)
s的计算方式如下所示,主要是用于区分样本对。当特征描述符1坐标*单适应矩阵(即还原到原坐标系下)- 特征描述符2坐标小于8时,则构成正样本对,否则为负样本对。
在这里插入图片描述

4、实验报告

4.1 MagicPoint

将MagicPoint与其他传统的角检测方法进行评估时,如FAST [21]、Harris角[8]和Shi-Tomasi的“跟踪合成形状数据集上的良好特征”[25]时,作者发现了一个巨大的性能差距,作者测量了合成形状数据集的1000张保留图像的平均平均精度(mAP),并将结果报告在表2中。经典探测器在存在成像噪声下挣扎的定性例子如图4所示(MagicPoint特征点对于噪声鲁棒性更好)。

更详细的实验方法见附录B(即下图),其中MLE为平均定位误差(Mean Localization Error)。

噪声强度测试

通过改变噪声的大小来更仔细地研究它的影响。我们很好奇,我们添加到图像上的噪声对于一个点探测器来说是否过于极端和不合理。为了验证这一假设,我们在干净图像(s = 0)和有噪声图像(s = 1)之间进行线性插值。为了将探测器推到极限,我们还在噪声图像和随机噪声(s = 2)之间进行插值。随机噪声图像不包含几何形状,因此对所有检测器的mAP评分为0.0。下图显示了不同程度噪声的例子和图示。

噪声类型测试

我们把噪音分为八类。我们单独研究这些噪声类型的影响,以更好地了解哪一种对点探测器的影响最大。散斑噪声对于传统的探测器来说尤其困难。结果总结在图12中,从中可以看出MagicPoint所提取的特征点在loss上基本上不受噪声类型的影响(其loss直方图[最前面两个柱形]在不同噪声下变化很小)

Blob检测

我们实验了我们的模型检测形状中心的能力,如四边形和椭圆。我们使用了MagicPoint的架构并增强了合成形状训练集,除了角落外,还包括斑点中心。我们观察到,只要整个形状不太大,我们的模型就能够检测到这些斑点。然而,为这种“斑点检测”产生的干扰通常低于角落的干扰,这使得将两种检测集成到一个系统中有些麻烦。在本文的主要实验中,除了下面的实验外,我们省略了用斑点进行的训练。

我们在白色背景上创建了96×96的黑色正方形图像。我们将方块的宽度从3到91像素,并报告输出两个不同输入图heatmap的一致性:中心像素(斑点的位置)和方块的左上角像素(一个易于检测的角)。本实验的MagicPoint的角置信图如图13所示。我们观察到,我们可以自信地检测斑点的中心当size宽为11到43像素是(图13中红色区域),检测较低的信心当广场43和71像素宽(黄色区域),并且无法检测中心斑点当广场大于71(图13中的蓝色区域)。

整体实验效果较好,但该实验带来的问题是:人工形状效果能推广到真实的图像吗?

总结我们稍后在7.2节中介绍的一个结果,答案是肯定的,但没有作者希望的那么好。作者惊讶地发现,魔法点在现实世界的图像上表现得相当好,特别是在那些具有强大的角状结构的场景中,如桌子、椅子和窗户。不幸的是,在所有自然图像的空间中,与相同的经典探测器相比,它在视点变化下的可重复性方面表现不佳。这激发了作者训练真实世界图像的自我监督方法,作者称之为 Homographic Adaptation。

4.2 Homographic Adaptation

SuperPoint从一个基本的兴趣点检测器和来自目标域的大量未标记图像(如MS-COCO)引导自己。在自我监督范式(也称为self-training)中,我们首先为目标域中的每个图像生成一组伪地面真实兴趣点位置,然后使用传统的监督学习机制。方法的核心是一个数据增强过程,将随机单适应变化应用用于输入图像的副本,并将结果还原到原图上累加——我们称之为同质自适应。

并不是所有随机生成的3x3单适应矩阵都是同质自适应的好选择。对好的同型性进行抽样,以表示看似合理的相机转换,我们将一个潜在的同构性分解成更简单,表达力较差的转换类。我们在预先确定的范围内采样的平移、尺度、平面内旋转和对称透视失真使用截断的正态分布。这些转换与初始的根中心作物一起组成,以帮助避免边界工件。具体的单适应图像变化,可以拆解为以下步骤:

所进行的单适应变化也应该是有限的,作者表明一个图在进行100次单适应变化后,它的增益会递减。且在训练过程中图像仅是有概率进行单适应变化,并非都变化。

迭代提升

我们在训练时应用Homographic Adaptation技术来提高MagicPoint在真实图像上的泛化能力。该过程可以反复重复,以不断地自我监督和改进兴趣点检测器。在我们所有的实验中,我们在应用Homographic Adaptation后,将结果模型命名为SuperPoint,并显示了图7中来自HPatches的图像的定性进展。

尺度变化

区分尺度内聚合和跨尺度聚合是很重要的。现实世界的图像通常包含不同尺度的特征,因为一些在高分辨率图像中被认为是有趣的点,通常甚至在更粗糙、更低分辨率的图像中都不可见。然而,在单一尺度内,图像的转换,如旋转和平移,不应该使兴趣点出现/消失。图像的这种潜在的多尺度性质对于尺度内和跨尺度的聚合策略具有不同的含义。尺度内聚合应该类似于计算集合的交集,而跨尺度聚合应该类似于集合的并集。此外,我们还可以使用跨尺度的平均响应作为兴趣点置信度的多尺度度量。当兴趣点在所有尺度上都可见时,跨尺度的平均响应将被最大化,而这些很可能是跟踪应用程序的最强大的兴趣点。

  • 尺度内的聚合 我们使用了对输入图像的大量均形扭曲的平均响应。在选择随机同态时应该注意,因为不是所有的同态都是真实的图像变换。同形扭曲的数量Nh是我们的方法的一个超参数。我们通常强制第一个同等性相等,这样在我们的实验中Nh = 1对应于不做同等性(或等价地,应用恒等同等性)。我们的实验范围从“小”Nh = 10,到“中”Nh = 100,和“大”Nh = 1000。

  • 跨尺度的聚合 考虑的尺度的数量是我们方法的一个超参数。Ns = 1的设置对应于没有多尺度聚合(或只是跨大的图像大小聚合)。对于Ns > 1,我们将被处理的多尺度图像集称为“多尺度图像金字塔”。我们考虑加权方案,加权金字塔的水平不同,给更高分辨率的图像一个更大的权重。这一点很重要,因为在较低分辨率下检测到的兴趣点具有较差的定位能力,而且我们希望最终的聚合点尽可能精准定位。我们在MS-COCO图像的持续测试中进行了尺度内和跨尺度聚合的实验。结果总结在图14中。我们发现,尺度内聚合对可重复性的影响最大

5、论文总结

我们提出了一种全卷积神经网络架构,用于兴趣点检测和描述,使用自形自适应的自监督域适应框架。我们的实验表明,(1)可以转移知识从一个合成数据集到现实世界的图像,(2)稀疏兴趣点检测和描述可以作为一个有效的卷积神经网络,和(3)产生的系统适用于几何计算机视觉匹配任务等同质估计。

未来的工作将研究同质自适应是否可以提高模型的性能,如用于语义分割(如SegNet [1])和目标检测(如SSD [14])。它还将仔细研究兴趣点检测和描述(以及潜在的其他任务)对彼此有益的方式。

最后,我们相信我们的超级点网络可以用于解决3D计算机视觉问题中的所有视觉数据关联,如SLAM和SfM,并且基于学习的视觉SLAM前端将在机器人技术和增强现实中实现更健壮的应用

猜你喜欢

转载自blog.csdn.net/a486259/article/details/129147786