GeoDesc 论文详解

GeoDesc

该论文是港科大权龙老师组的文章,值得 follow,而且提供了代码,基于 tensorflow 的。

主要思路

目前使用CNN网络来学习局部特征在 patch-based 的数据基准上取得了很大的进展,但是应用到具体的 3D 重建等工作上效果还是不如传统的特征,如 SIFR、SURF、ORB 等。所以本文提出了一种新型的局部特征的学习方法 GeoDesc,主要是从多视图重建中学习到几何的约束信息。实验证明本文提出的方法效果在大量的基准集上取得了很好的效果,而且对于重建任务也很适用。同时,文中还提出了把学习的局部特征应用到SfM pipeline中的流程,同时可以根据实际需要的效率和效果调整不同的 GeoDesc 配置。

基本流程

网络架构

本文是直接采用的是 L2-Net 的网络结构,未使用 pooling 进行降维,而是使用 conv 层的 stride,同时每个 conv层后跟着 BN 层(w和b固定为1和0),最后的 FC 层跟着L2-norm操作,输出128-d 的特征向量。本文未对网络结构做改进,直接采用的 L2-Net 的提供的架构,如下图所示:

L2-Net

其他关于网络结构更详细的内容,参考L2-Net

训练数据生成

这里主要讨论自动生成适合特征学习且标注质量高的训练数据。

2D 匹配生成
  1. 和 LIFT 文章处理类似,是利用 3D Recon 去生成图像 2D 匹配的真值。首先标准的 SfM 可以获得稀疏的 3D 点云数据,然后 2D 的匹配关系就可以通过把 3D 点向不同的 image 上投影获得。一般情况下,SfM是可以过滤掉大部分不匹配关系。但是基于该方法生成的 2D 匹配还是会存在一些 outliers,可能由于图像噪声或者错误的相机pose造成的,如下图所示:
SfM outliers
  1. 为了解决上面的问题,在 LIFT 基础上利用 3D Delaunay triangulation 去验证特征点的可见性,该方法也经常被用于过滤 dense stereo 中的 outlier。按照经验来说,会有大概 30 30% 30 的 3D 点会被该 filter 过滤掉,仅仅那些高精度的点被保留下来用于生成 2D 匹配的真值。该方法的效果如下图所示(其中green是经过Delaunay triangulation filter 保留的可靠点,red 是被过滤掉的,经过该filter,点的数目从 75k 减少到 53k。):

其他关于 Delaunay triangulation,就是 Delaunay三角剖分算法,具体细节可以参考该文,Delaunay三角剖分及matlab实例,在这里简单理解为?????

Delaunay triangulation
匹配 patch 生成

和 LIFT 文章处理类似,2D 投影点的 interest 区域定义如下:

( x i s y i s ) = [ k σ 2 cos ⁡ ( θ ) k σ 2 sin ⁡ ( θ ) x − k σ 2 sin ⁡ ( θ ) k σ 2 cos ⁡ ( θ ) y ] ( x i t y i t ) \begin{pmatrix} x_{i}^{s} \\ y_{i}^{s} \end{pmatrix} = \begin{bmatrix} \frac{k\sigma}{2}\cos(\theta) & \frac{k\sigma}{2}\sin(\theta)x \\ -\frac{k\sigma}{2}\sin(\theta) & \frac{k\sigma}{2}\cos(\theta)y \\ \end{bmatrix} \begin{pmatrix} x_{i}^{t} \\ y_{i}^{t} \end{pmatrix} (xisyis)=[2kσcos(θ)2kσsin(θ)2kσsin(θ)x2kσcos(θ)y](xityit)

其中 ( x i s , y i s ) ​ \begin{pmatrix} x_{i}^{s}, y_{i}^{s} \end{pmatrix}​ (xis,yis) ( x i t , y i t ) ​ \begin{pmatrix} x_{i}^{t}, y_{i}^{t} \end{pmatrix}​ (xit,yit) 分别是输入和输出的采样网格, ( x , y , σ , θ ) ​ \begin{pmatrix} x, y, \sigma, \theta \end{pmatrix}​ (x,y,σ,θ) 是 keypoint 的参数,其中 ( x , y ) ​ \begin{pmatrix} x, y \end{pmatrix}​ (x,y) 是coordinates, σ ​ \sigma​ σ 是 scale, θ ​ \theta​ θ 是orientation,是 SIFT 特征提取的 keypoint 的属性信息。其中 LIFT 文章里面 k = 12 ​ k=12​ k=12,得到 12 σ × 12 σ ​ 12\sigma \times 12\sigma​ 12σ×12σ 大小的patch。

而且因为 SIFT 在极端情况下也能鲁棒的估计 keypoint 的 scale ( σ ) \begin{pmatrix} \sigma \end{pmatrix} (σ) 和 orientation ( θ ) \begin{pmatrix} \theta \end{pmatrix} (θ),所以得到的 patch 是 scale 和 orientation 无关的,也比较适合当做训练数据去训练。

其他关于该匹配 patch 生成的相关内容,参考LIFT

几何相似性估计

3D 点的几何信息是鲁棒的而且能提供丰富的信息,本文根据 MVS 精确计算的结果,定义了两种几何的相似性:patch 相似性和 image 相似性。这个相似性可以辅助后面数据采样以及 loss 计算。

patch 相似性

patch 相似性 S p a t c h S_{patch} Spatch 表示根据对应的两个patch的 camera perspective 的变化,3D 点 P P P 在这两个 camera 投影的两个 patch 匹配上的困难程度(越困难,值越小,越相似,值越大)。

S p a t c h = s 1 s 2 = g ( ∠ C i P C j , σ 1 ) g ( ∠ C i P P N − ∠ C j P P N , σ 2 ) g ( α , σ ) = e x p ( − α 2 2 σ 2 ) 其 中 , 根 据 经 验 设 置    σ 1 = 15 , σ 2 = 20 S_{patch} = s_{1}s_{2} = g(\angle C_{i}PC_{j}, \sigma_{1})g(\angle C_{i}PP_{N} - \angle C_{j}PP_{N}, \sigma_{2}) \\ g(\alpha, \sigma) = exp(-\frac{\alpha^{2}}{2\sigma^{2}}) \\ 其中,根据经验设置 \; \sigma_{1} = 15, \sigma_{2} = 20 Spatch=s1s2=g(CiPCj,σ1)g(CiPPNCjPPN,σ2)g(α,σ)=exp(2σ2α2)σ1=15,σ2=20

其中 C i C_i Ci C j C_j Cj 分别表示两个 camera 的中心, P n P_n Pn 表示 3D 点 P P P 在局部 3D surface model(由MVS计算得到) 上的法向量。

其中 ∠ C i P C j \angle C_{i}PC_{j} CiPCj 表示两个 camera 的 reviewing ray 的夹角,同理 ∠ C i P P N \angle C_{i}PP_{N} CiPPN ∠ C j P P N \angle C_{j}PP_{N} CjPPN 表示 camera 的reviewing ray 和 法向量 P n P_n Pn 的夹角。简单解释来说 ∠ C i P C j \angle C_{i}PC_{j} CiPCj 表示关于3D点 P P P 的 camera perspective 的变化,而 ∠ C i P P N \angle C_{i}PP_{N} CiPPN ∠ C j P P N \angle C_{j}PP_{N} CjPPN 的差值代表关于局部 3D surface的 camera perspective 的变化。

这里有个问题就是这个定义有什么理论基础没,感觉设计的比较随意????

image 相似性

image 相似性 S i m a g e S_{image} Simage 就是一对 image 上 所有 S p a t c h S_{patch} Spatch 的平均值,简单理解就是在该 camera perspective 的变化下,这对 image 匹配上的困难程度。

关于上面的几何关系、 S p a t c h S_{patch} Spatch 效果和 S i m a g e S_{image} Simage 效果的示例图如下所示:

Geometric Similarity
Batch 构建
之前工作

对于特征学习,现存的大多数框架都是把 patch pairs(matching/non-matching) 或者 patch triplets(reference, matching and non-matching) 当做输入来处理。但是基于该方法,学习收敛的速度很大程度依赖于有用的数据,这里有用的数据是指能对学习产生有意义 loss 的那些 patch pairs/triplets。然而从大量数据中获得有效数据的采样是非常困难的,所以一些采样的策略例如 HNM(hard negative mining) 和 anchor swap 被提出来,同时之前也有一些有效的 batch 构建的方法也被使用在一些特征学习的工作里面,主要是计算 reference patch 和 batch 中其它 patch 之间的 loss。

anchor swap 没研究过,具体指啥????

本文做法

基于之前的一些 batch 重建的工作,本文提出一个更有效的 batch 重建的方法。其实就是取 image pair 构建一个 match set:

X = ( x 1 , x 1 + ) , ( x 1 , x 1 + ) , . . . , ( x N 1 , x N 1 + ) X = {(x_{1}, x_{1}^{+}), (x_{1}, x_{1}^{+}),...,(x_{N_1}, x_{N_1}^{+})} X=(x1,x1+),(x1,x1+),...,(xN1,xN1+)

其中 N 1 N_1 N1 是 set 的大小, ( x 1 , x 1 + ) (x_{1}, x_{1}^{+}) (x1,x1+) 是匹配的 patch pair(应该上面 filter 过滤过的)。

后面的每个 batch 都是从这个 match set 里面取,这个问题就转换成了在每个 match set 上 patch 匹配的质量。

这里有个问题是,文中说采用该方法优势是和实际使用更加一致,实际使用就是 image pair 之间直接进行 patch 的匹配,这样保持了 train 和 test 的一致性,但是其实有个问题: 这 image based loc 的场景下,每个 patch 匹配都是基于整个 3D map 的,这样的场景是不是不太适合了????

和之前的工作 L2-NetHardNet 的方法是 从整个 patch database 里面 random 选取 training batch。本文因为从同一对图像上选取的,相似度更大,匹配起来难度也更大(例如两个 patch 可能有 overlap, 但是并没有匹配关系)。而原来的 random 方法,里面的非匹配关系本身的区分度就比较大,那么网络很容易区分,对网络的贡献不是很大,导致网络学习效率比较差。示例如下(上面是之前方法的 batch 图像示例,下面是新方法的batch 图像示例):

Batch Recon

为了进一步增强训练的效率,把太相似的那些 image pairs 给去除掉,它们对训练的贡献不大,去除的标准根据之前计算的 S i m a g e S_{image} Simage,具体数值是 S i m a g e > 0.85 S_{image} > 0.85 Simage>0.85,这大概减少了 30 30% 30 的训练数据量。

可以看出来训练时单位数据是 image pair,而不是一组 patch。每个 training batch 包括 N 2 N_{2} N2 组 match sets。

Loss 公式
Structured loss

在之前的工作 L2-NetHardNet 中采用的就是 structured loss,HardNet 采用 hardest-in-batch 策略比 L2-Net 采用的 log-likelihood 更有效率。然而本文的 hardest-in-batch 策略,导致 overfitting,原因可能是本身本文的 batch 中的数据就是一些比较 hard 的训练数据,在采用 hardest-in-batch 策略约束太强。 hardest-in-batch 策略简单来说就是最后的 loss 是那个最大的 loss(也就是 hardest 产生的),然后利用 来作为非匹配和匹配直接的 margin 边界。本文 batch 数据都比较 hard 了,所以 margin 调整小一些,但是效果下降了。这个没太理解,需要再 check 一下HardNet文章。

至于 hardest-in-batch 和 log-likelihood 具体参考 HardNetL2-Net 工作。

为了解决上面提到的局限性以及更好的利用 batch 数据,提出了一个新的 loss 公式,如下:

E 1 = 1 N 1 ( N 1 − 1 ) ∑ i , j ( m a x ( 0 , l i , j − l i , i ) + m a x ( 0 , l i , j − l j , j ) ) L = S − α d i a g ( S ) S = F 1 F 2 T F 1 , F 2 ∈ R N 1 × 128 E_{1} = \frac{1}{N_{1}(N_{1} - 1)}\sum_{i,j}(max(0, l_{i,j} - l_{i,i}) + max(0, l_{i,j} - l_{j,j})) \\ L = S - \alpha \boldsymbol{diag}(S) \\ S = F_{1}F_{2}^{T} \\ F_{1}, F_{2} \in R^{N_{1} \times 128} E1=N1(N11)1i,j(max(0,li,jli,i)+max(0,li,jlj,j))L=Sαdiag(S)S=F1F2TF1,F2RN1×128

其中 F 1 , F 2 F_{1}, F_{2} F1,F2 是 match set X X X 所有匹配 ( x i , x i + ) (x_{i}, x_{i}^{+}) (xi,xi+) 对应的 norm 后的128d的特征矩阵。

其中 S S S 相当于 image pair 之间的所有的 patch 计算两两之间的 cosine 相似度。

其中 d i a g ( S ) \boldsymbol{diag}(S) diag(S) 为对角线元素,也就是匹配上的 patch 之间的 cosine 相似度。

其中 α ∈ ( 0 , 1 ) \alpha \in (0,1) α(0,1) 是仿照 ratio test的做法,这里具体是指匹配 patch pair 的 cosine 相似度要尽可能大于其中一个 patch 和另一个 image 上其他任意不匹配的 cosine 距离,差距 ratio 限制就是 α \alpha α 。从 E 1 E_{1} E1 loss 计算中很好理解。

最终 traing batch 包含多个 image pairs,也就是多个 match set,每个 match set 会计算一个 loss E 1 E_{1} E1,每个 traing batch 的 loss 取平均值。

这里文章还专门提到和 HardNet loss的不同,主要在三方面:

  1. 这里使用 cosine 相似度 替换 Eulcidean 距离,计算效率更高;
  2. 这里使用 distance ratio margin 代替 fixed distance margin,这样基于相似 patch pair 的 cosine 相似度是动态调整的,防止 overfitting 问题。主要可能由于在 hard case 上本身相似 patch pair 的 cosine 相似度要比 easy case 要小很多,这样把两种 case 设置成一样,hard case 会变得更难学习。
  3. 基于前面的 batch 构建方法,这里使用的是 batch 里面的每个 loss 的均值,而不是仅仅去最大的那个 loss。
Geometric loss

上面 E 1 E_{1} E1 可以是匹配的 patch pair 的 cosine 相似度尽可能的远离非匹配的 patch pair 的 cosine 相似度,而不能推动匹配的 patch pair 的 cosine 相似度尽可能完全一致。

之前有些方法 DeepDesc 中使用 pair-wise loss,但是会导致正样本塌陷和 overfitting 问题。正样本塌陷简单可以理解为本来比较 hard 的 patch pair,相似度就不是那么大,如果非得强制要求必须一致,这个对训练难度太大。具体需要check一些之前的工作。

本文根据之前求得的 S p a t c h S_{patch} Spatch 设置作为参数去不同程度的调整 loss,最大化正样本(匹配的 patch pair)之间的相似度,同时不会带来之前工作的正样本塌陷的问题。具体的 loss 公式如下:

E 2 = ∑ i m a x ( 0 , β − s i , i ) β = { 0.7 S p a t c h ≥ 0.5 0.5 0.2 ≤ S p a t c h &lt; 0.5 0.2 otherwise E_{2} = \sum_{i} max(0, \beta - s_{i,i}) \\ \beta = \begin{cases} 0.7 &amp; {S_{patch} \geq 0.5} \\ 0.5 &amp; {0.2 \leq S_{patch} &lt; 0.5} \\ 0.2 &amp; \text{otherwise} \end{cases} E2=imax(0,βsi,i)β=0.70.50.2Spatch0.50.2Spatch<0.5otherwise

其中 s ( i , i ) s_(i,i) s(i,i) 是 cosine 相似度 矩阵 S S S 中的元素,这里只对正样本也就是匹配的 patch pair 进行计算。

这里就很好理解了,如果 patch pair 的在 camera perspective 越相似,那么在 cosine 相似度上应该也越相似,此时去尽可能推动 patch pair 的 desc 尽可能相似是没有问题的。

最终 Loss

最终的 loss 公式如下:

E = E 1 + λ E 2 E = E_{1} + \lambda E_{2} E=E1+λE2

其中根据经验设置 α = 0.4 \alpha = 0.4 α=0.4 λ = 0.2 \lambda = 0.2 λ=0.2

Training

设置 N 1 = 64 , N 2 = 12 N_{1} = 64, N_{2} = 12 N1=64,N2=12, 其他训练数据和训练超参细节具体看论文。

实验

在 patch-based HPatches 基准测试集,image-based Heinly 基准测试集和ETH local features 基准测试集上进行实验比较测试。同时后面还把学习的特征应用在 SfM 上,证明对于 3D 任务学习的特征也能处理的很好。

HPatches
结果对比

和其他传统特征和学习特征在 HPatches 基准测试集上进行了比较,结果如下图所示:

Hpatches compare

其中上面从左到右三个分别表示 HPatches 提供的三个互补的测试任务,包括 patch verification,patch matching和patch retrieval。

其中 verification 任务分了 SAMESEQ 和 DIFFSEQ 两个子任务,表示负样本是不是来自于同一个 seq 图像序列。

其中 matching 任务分了 VIEW 和 ILLUM 两个子任务,表示视角和光线的变换因素,同时根据几何扰动的级别区分了 EASY,HARD 和 TOUGH 三个不同的 patch groups。

如果想深入了解 HPatches 基准测试集或者指标,可以参考 HPatches 工作。

配置比较

设置不同的参数内容在 HPatches 基准测试集上的结果比较如下表:

Hpatches configs

其中 1 表示 HardNet 工作的结果,当做 baseline。

同时在配置 4 中 E 1 E_{1} E1 中使用 distance ratio margin 和 fixed distance margin 也进行了比较,效果比较图如下:

Hpatches margin Recon
Heinly

和其他传统特征和学习特征在 Heinly 基准测试集上进行比较,和 HPatches 不同的是,Heinly 数据集是在不同 photometric 或者 geometric 变化下的 image pair 上 patch 匹配。同时为了公平起见,这里所有的匹配方法都不使用 distance ratio test 过滤。结果如下图所示:

Heinly compare

其中主要比较两个指标: M a t c h i n g S c o r e = # I n l i e r M a t c h e s / # F e a t u r e s Matching Score = \#Inlier Matches / \#Features MatchingScore=#InlierMatches/#Features R e c a l l = # I n l i e r M a t c h e s / # T r u e M a t c h e s Recall = \#Inlier Matches / \#True Matches Recall=#InlierMatches/#TrueMatches

如果想深入了解 Heinly 基准测试集或者指标,可以参考 Heinly 工作。

ETH local features

和其他传统特征和学习特征在 ETH local features 基准测试集上进行比较,该数据集是基于图像的 3D 重建任务,利用这些不同特征去评估最后 SfM 的质量。同时为了公平起见,这里所有的匹配方法都不使用 distance ratio test 过滤,同时在数据集给定的 keypoints 去计算特征。结果如下图所示:

Heinly compare

其中主要比较五个指标:注册上图像的数目( # R e g i s t e r e d \# Registered #Registered),重建的稀疏 3D 点的数目( # S p a r s e P o i n t s \# Sparse Points #SparsePoints), 图像上 3D 点投影数( # O b s e r v a t i o n s \# Observations #Observations), 平均 track length ( T r a c k L e n g t h Track Length TrackLength)和 平均 reprojection error ( R e p r o j . E r r o r Reproj. Error Reproj.Error)。

如果想深入了解 ETH local features 基准测试集或者指标,可以参考 ETH local features 工作。

3D 重建

为了进一步说明本文的学习特征已经应用到 3D 重建等任务上。我们展示了一些在 SIFT-based 3D 重建效果比较差的一些 case,然后使用本文的 GeoDesc 方法得到了比较好的效果。结果如下图所示:

Heinly compare

实用指南

ratio 确定

怎么确定 ratio test 中 ratio 的值,文中采用了一个简单的方案,在不同的 ratio 中测试,选择和 SIFT 一样的 precision 的那个 ratio 当做 GeoDesc 的实际应用的 ratio 值,该值在上面的 3D 重建里面使用。ratio 和 precision 关系如下图所示:

ratio

其中 SIFT 的 ratio 是 0.69,然后 precision 是 0.7,此时 GeoDesc 对应的 ratio 是 0.89。

GeoDesc 的 ratio 比 SIFT 的大,是不是说明学习到的特征区分度不够?????

compactness 研究

compactness 表示该特征是否是非常紧凑了,紧凑的特征一般来说性能更优。这里使用 PCA 方式来验证特征的 compactness (紧凑程度)。

利用下面的公式来评估 Compact-Dim(紧凑维度),找到满足条件最小的 k k k 值:

∑ i k / ∑ i D &gt; = t {\sum}_{i}^{k}/{\sum}_{i}^{D} &gt;= t ik/iD>=t

其中 D D D 是原始的特征的维度。

其中 t = 0.9 t=0.9 t=0.9,是可调整的阈值。

其中 v i v_{i} vi,表示大量的特征在某个 i n d e x index index i i i 上的方差,以递减顺序排列(这里文中说的是递增顺序,但感觉递减才更合理。)。

那么在这里 Compact-Dim(紧凑维度)可以认为是可以包含 90 90% 90 原始特征信息最小的维度,Compact-Dim 越大表明特征中的冗余信息越少,也就是更加紧凑。其实从计算中可以看出,紧凑的特征各个 i n d e x index index 上的方差都比较平均,而不紧凑的特征方差大(特征信息有变化的)聚集在少数的 i n d e x index index 上,后面方差小的 i n d e x index index 对特征区分对提供贡献有限,信息几乎是无用的。递减才能解释这个问题。

最后在 400 w ​ 400w​ 400w 特征向量上估计 Compact-Dim,SIFT,DSP-SIFT,L2-Net和GeoDesc值分别为56,63,,75和100。结合上面的性能比较,可以看出 Compact-Dim 越大,效果越好。

计算时间

和 GPU-based SIFT 在时间上的比较,结果如下图所示:

comp cost

其中 SIFT-GPU 方法获取特征只用 0.2 s 0.2s 0.2s,而使用 GeoDesc 需要经过 keypoint 检测和 canonical orientation 估计(采用SIFT-GPU方法),patches crop,以及最后 patches 上的特征的计算。最后评估的是并行的时间 0.31 s 0.31s 0.31s

量化

为了节省磁盘空间, I/O 和 内存,本文把 GeoDesc 的特征从 [ − 1 , 1 ] [-1, 1] [1,1] 线性映射到 [ 0 , 255 ] [0, 255] [0,255],每个值最后都四舍五入成一个 unsigned char。经过量化 GeoDesc 在 HPatches 上的性能没有降低。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值