论文阅读——LF-Net: Learning Local Features from Images

一、概述

  本文来自索尼团队,提出了一种属于detect to describe结构的,image与patch相结合的joint learning框架。不同于LIFT直接输入patch进行预测的方式,本文以完整图像为输入,利用STN进行方向估计并crop patch,再将patch送入特征描述网络学习描述子。
  值得注意的是,本文提出的LF-Net只需要最基本的图像之间是否存在匹配关系这种粗粒度的信息作为标注并未像其他论文中那样利用匹配的兴趣点作为标注信息,而是只利用图像之间相对相机位姿、深度等几何关系,然后在训练中利用该几何关系以在线方式生成监督信号及组件triplet。以下为原文摘要:

  本文提出了一种新的深度特征提取框架及训练方式,在无需人为标注的情况下实现局部特征描述网络的从头学习。为了完成训练,我们利用现成的SFM模型预测出匹配图像之间的相对深度和相机位姿等几何关系,并利用该关系将检测/描述网络对某张图像的预测结果转移到和其匹配的另一张图像上,作为训练目标。由于该过程本质上不可微,我们展示出一种新的方式:使用两个分支完成训练,其中一个分支用于优化并保留可微的能力,另一个分支则用产生第一个分支的监督目标。
  我们分别在室内、外的数据集上进行训练,最终的模型结果超越了其他最好的稀疏特征匹配方法,且在QVGA图像可以达到60+fps的推理速度。

二、方法

  首先作者从实用角度出发,讨论如下场景:给定“dense correspondence data”(即一个由图像构成的集合,这个集合中图像两两间的匹配关系已知),理论上我们可以只用这种非常粗粒度的GT信息训练一个局部特征提取流程:分别用检测+描述网络对一对图像进行关键点检测和逐点的描述子提取;然后利用两图像的描述子得到其匹配关系,再利用该两图像的真实GT关系来监督匹配结果。

  如果上面的idea可以实现,那么局部特征描述应该会迎来很大的突破,毕竟获取这种“是否匹配”级别的关联几乎没有成本,可以轻易获得海量训练数据。作者也提出了该流程无法实现的两个原因:

  • 从兴趣点检测网络预测的score map中提取多个maxima作为关键点,这一过程是不可微的
  • 利用该方式对输入的一对图像预测出的两组关键点,它们之间的匹配关系可能非常稀疏,即产生的groundtruth matches数目很少。而描述网络的训练依赖这些关键点的匹配关系,转而再引导检测网络训练,使其可以检测出更具分辨率,对特征匹配更佳的兴趣点。
  • 我理解的是由于检测网络也并非训好的,对于当前pair的两个图像,检测网络对其各自提取出的兴趣点可能都会漏一些;这样两图匹配的兴趣点就会更少了

  为了解决不可微和匹配数目少这两个问题,作者想到一个方法:将输入图像之间的geometry correspondence利用到关键点上。具体来说,对于成对的输入图像(I,J),可以首先利用检测分支对图像J预测出score map,然后再将I和J的几何关系warp到J的score map上,然后对warp后的score map进行不可微的maxima(关键点)提取操作,再利用提取的点生成一个gaussian map,用于优化图像I预测的score map,如下图的L_im部分所示:

  具体的warp方法比较复杂,需要输入相机位姿P、内参矩阵K、深度图Z,以及待warp的score map,利用投影相机模型进行一个rigid transform。作者称之为SE(3)模块w(这个概念可能需要回头在slam十四讲里面再了解下)。

  这里要思考一个问题,为什么对图像I_i,其label产生要这么麻烦?为什么不能直接用I_i和I_j的预先准备好的correspondences中的兴趣点位置做强监督,或者利用兴趣点的repeatability原则优化?
  答:之前没注意到这个地方,LF-Net在构建训练数据时好像并没有两个匹配图像之间的一组匹配的兴趣点,像LIFT和很多类似论文中都会做的那样。本文对于一对匹配图像,仅仅利用SFM预测出两图像的深度、相机相对位姿等关系,并没有kpt correspondences,也没有kpts!

2.1 网络模块介绍

  LF-Net由检测和描述两大网络部分组成。检测网络为全卷积的dense prediction风格,可以同时预测出关键点位置、尺度、方向,并支持多尺度预测(对输入具有尺度不变性)。特征描述网络则根据检测网络提取的关键点crop出的patch,来学习局部描述子。

I. 特征提取

  检测模块的特征提取部分使用ResNet block堆叠而成,每个block由5x5 conv + BN + Leaky-Relu组成,每个卷积输出均为16通道且尺寸与输入相同,也就是说整个特征提取部分都维持着全图分辨率的。作者强调,实验证明他们这种看似简单粗暴的方式比转置卷积或者pixel shuffle等dense prediction任务中常见的decoder组件结果要好。

  与SuperPoint、SEKD等在image level上预测的方法不同,本文的特征描述网络是以patch为输入的,故与detector并无特征共享,整体为串行结构。

II. 检测网络

  检测网络的流程稍复杂,不过由于结构为串行,将其步骤整理如下:

  ①生成多尺度缩放因子:Si ∈ exp(linspace(log(m), log(M), N_scales))
  ②在每一个尺度s上,将I中提取的特征feat resize为feat尺寸的1/s,再将resize之后的特征送入一层卷积用于输出通道为1的当前尺度上的score map。得到一个多尺度的score map list
  ③同时,将I提取的特征送入单层卷积层,输出通道数为2的Orientation map,并通过L2Norm层转换到欧式空间。两个通道分别代表cos(θ)和sin(θ),其中θ代表各个像素位置的方向。
  · 注意:输出Orientation map的卷积层,W和bias分别初始化为全零和[1, 0],作者解释是方向θ初始值为0,cos(θ)即1,sin(θ)即0。相当于引入了一点先验?不知道这里影响有多大。
  · 届时将由这两个通道经过arctan运算,得到密集的方向估计。
  ④对于②得到的score_map_list中的每个元素,将其送入instance_normalization,再resize到原图输入尺寸。然后将各个尺度的resized score map concat到一起,得到所谓"scale space"上的scoremap
  ⑤concat之后的score map再通过一个类似softmax的操作,整合各个scale的特征并得到最终的score map S,其具有尺度不变性,将用来提取兴趣点


  ⑥提取top K个兴趣点位置,并且使用softargmax来进行"sub-pixel refinement"。⑤、⑥这两步不理解,代码中连续用了3D Soft-NMS和普通NMS,可能需要进一步学习才能了解。

III. 特征描述网络

   这部分网络并不复杂,关键在于patch_extraction模块,该模块输入特征图(I输出的feat,不是II输出的score map S),以及关键点的位置、尺度、方向信息,输出K个大小为patch_size的图像块,每个图像块的中心、尺度、方向由对应下标的kpt决定。patch_extraction的核心是spatial transformer crop模块。详细内容见同级目录下的notebook。

  提取出patch之后,直接将patch堆叠到一起 [BK, patch_h, patch_w, patch_c]送入由若干卷积层构成的特征描述网络,得到 [BK, D] 的特征描述。注意对于特征描述网络而言,其batch_size变成了B*K。

2.2 训练细节与loss函数

I. 数据准备

  使用ScanNet室内数据集和25 photo-tourism室外数据,并通过3D视觉方法确保两个数据集过滤出的不同视角图像之间有足够的重叠面积。部分数据采样如下:

II. 训练检测分支

  作者将LFNet的训练设计为一个类似孪生网络的结构。不同之处在于,网络的两个分支中只有一个分支用来传导梯度并优化;另一个分支则用于执行warp、提取关键点、生成第一个分支的监督目标等不可微的操作。训练的方式为,当前一次迭代中的J分支,使用上一次迭代结束时I分支的参数(涉及一个拷贝的过程)。作者说这种训练方式来源于强化学习中的Q-Learning。

  检测分支的优化目标由image-level loss和patch-level loss构成,这是因为关键点检测本身既依赖image level的操作,也会影响到提取出的patch位置,故作者认为应该同时考虑在两个level设计loss。

  • Image level

    • 该级别的优化目标在于,让分支I能够生成最接近分支J产生的gauss map GT(再重复一下,该GT是由上一个iteration的分支I'的权重,对当前iteration的图像J预测出的score_map_j,apply当前iteration中图像I和J的geometry,得到的warped_score_map_j,再通过NMS取top K关键点并放置gauss响应得到的)。故直接对图像I的score map和图像J warp产生的score map求像素级损失即可:

  • Patch level

    • 在之前的一些方法中,patch之间的pair-wise关系都是事先定义并保存到一个池子中的(比如我们当前的做法)。本文作者认为,这种离线构建patch关系的方式不利于让梯度回传到检测网络,促使其学习更加利于匹配的兴趣点。故作者提出在线构建patch关系的方式:

    • 对于I分支提取出来的K个兴趣点,可以再次利用当前iteration中(I,J)的几何关系,将I图像的兴趣点坐标warp到J图像上。注意这次是把I的坐标warp到J上,和image level的warp相反。这部分有点不好理解,可以举个简单的例子:假设图像J是图像I顺时针旋转90度得到的,那么将I上的一组兴趣点也旋转90度,得到的就是J的一组兴趣点,可以用来对J crop patches并送入特征描述。同时I,J也得到了若干组匹配的关键点,即kpt correspondences。分别在I, J分支上提取这些匹配的关键点对应的描述子和,代表匹配对数。为了使检测出的兴趣点具有可重复性,应该使和之间的距离尽可能小。

      • 另外,这一组匹配关键点对应的方向和scale也应该具有几何一致性:

III. 训练特征描述分支

  通常训练描述子都使用triplet loss。这就涉及positive pair和negative pair的构建。上面在patch level loss中已经通过warp构建出了kpt correspondences,那么其实就有了正对和负对。不过由于负对非常多,这里还需要考虑如何对负对进行挖掘,以确保送入训练的负对足够informative。

  作者设计的采样方法:

  1. 对于每个patch,将其与非匹配patch(即negatives)的loss按照降序排列,在前M个中选取patch来构建negative pair。其中



  ,k代表iteration数

  2. 这M个难样例构成了本次iteration的采样池。而采样池中的样本数则和迭代次数相关,从一开始的64个,到接近收敛时的5个。

  有了正对和负对,就可以构建起triplet loss:


  最后,整合得到两个模块的损失:

  

三、评价

  1. 这篇论文是目前为止看到过的最复杂的...作者开源了代码,但是全程用TF实现(包括SE(3) warp那部分),且没有提供任何数据sample,难以调试只能干读...不过代码里还是有一些非常值得学习的地方,比如SpatialTransformCropper等。
  2. 在整体流程中包含不可微模块时,本文展示了一种可用的训练的方式:利用两个分支训练,其中一个分支使用不可微的操作(如warp、NMS、构建clean heatmap等)为另一个分支准备监督信号。

你可能感兴趣的:(论文阅读——LF-Net: Learning Local Features from Images)