论文地址:https://arxiv.org/abs/2304.02008
源码地址:https://github.com/cvg/GlueStick
针对视角变化时在闭塞、无纹理、重复纹理区域的线段匹配难的问题,本文提出一种新的匹配范式(GlueStick),该方法基于深度图神经网络将点、线的描述符统一到一个框架中,利用点之间的信息将来自匹配图像之间的线进行粘合,提高了模型的联合匹配效率,表明了在单一框架中使用两种特征的互补性能大幅度提升性能。
本文的主要贡献如下:
受启发于:在匹配过程中,每个特征都可以利用其周围的特征信息来提高匹配性能,如线段可以利用周围的点来增强自己的表征能力,或者反之亦然。此外,网络在训练的过程中可以自动学习到对匹配任务有用的周围的点或者线。模型的主要框架如图2所示,主要包含三个部分:
GNN的输入为特征点的位置与描述符、表示线段链接关系的连接矩阵。第一步是建立这些连接关系并构建线框图。使用SuperPoint来预测关键点与稠密的描述符图,并通过LSD检测器检测线段,并将线段两端附近的关键点删除,避免特征冗余。
LSD检测的线段的为断开的独立线段,为了给模型更多结构化信息,并鼓励网络按照线段的连接性进行推理,使用阈值 d d d 来将相邻端点进行合并,此过程将非结构化的线转换成了互联的线框,将每个关键点与线段端点表示为线框中的一个节点,每个节点有不同的连接性:0表示孤立节点,2表示角点。继而在节点周围使用SP生成的特征点插入,用来增强线段的表征能力,这种方式会改变线段端点的位置,而不会改变线段的数量,对于有高精度要求的下游任务,使用端点的原始位置来保证原始检测器的亚像素精度。
模型的关键部分是GNN,该模块可以将视觉和空间信息编码为一组表征能力丰富的特征描述符,通过特征描述符的相似性来建立最后的匹配关系。在网络内部,每个节点(关键点、线段端点)都与一个基于视觉外观和位置信息的描述符相关联。
不妨设 A 与 B 为一对图像,对于每幅图像,网络的输入为:特征点集合 p \mathbf{p} p 的坐标 ( x p , y p ) (x_p, y_p) (xp,yp),置信度 s p s_p sp 和视觉特征描述符 d v i s ∈ R D \mathbf{d}^{vis}\in \mathbb{R}^D dvis∈RD; 线集合 l \mathbf{l} l 的端点 ( x p , y p ) , ( x p ′ , y p ′ ) (x_p, y_p), (x_p^\prime, y_p^\prime) (xp,yp),(xp′,yp′) 与线段分数 s l s_l sl。线段分数可以为先检测器返回的任何值,也可以用线段的长度来表示。节点置信度 s p s_p sp 由关键点检测器计算而来,如果是线段端点则等于 s l s_l sl。
Positional and Directional Encoding.
首先对每个特征点的空间信息进行编码,使用MLP来学习位置编码 P E p PE^p PEp 与 P E e PE^e PEe, 对于每个点生成空间描述符 d p \mathbf{d}^p dp,并未每个从该节点发出的线段生成描述符 d e \mathbf{d}^e de。如具有3个连接点的节点将被分配一个 d p \mathbf{d}^p dp 与 3 个 d e \mathbf{d}^e de。边位置编码还需要额外的信息,即到线段另一端的偏移量,从而能够范围线段的角度与长度。
d p = PE p ( [ x p , y p , s p ] ⊤ ) d e = PE e ( [ x p , y p , x p ′ − x p , y p ′ − y p , s l ] ⊤ ) (1) \begin{aligned} \mathbf{d}^{p} & =\operatorname{PE}^{p}\left(\left[x_{p}, y_{p}, s_{p}\right]^{\top}\right) \\ \mathbf{d}^{e} & =\operatorname{PE}^{e}\left(\left[x_{p}, y_{p}, x_{p}^{\prime}-x_{p}, y_{p}^{\prime}-y_{p}, s_{l}\right]^{\top}\right) \end{aligned} \tag{1} dpde=PEp([xp,yp,sp]⊤)=PEe([xp,yp,xp′−xp,yp′−yp,sl]⊤)(1)
其中 d p \mathbf{d}^p dp 用于初始化节点信息,而 d e \mathbf{d}^e de 用于线消息传递。
Network Architecture.
GNN 包含三种无向边:self-attention edges( ε s e l f \varepsilon_{self} εself) 连接同一副图像之间的节点; line edges( ε l i n e \varepsilon_{line} εline) 将同一条线的端点连接; cross attention edges ( ε c r o s s \varepsilon_{cross} εcross) 连接不同图像之间的节点;
每个节点 i i i 的特征向量使用空间与视觉信息来初始化: 0 x i = d i p + d i v i s {}^0x_i = \mathbf{d}^p_i + \mathbf{d}^{vis}_i 0xi=dip+divis,然后通过 L L L 次 Self,Line与 Cross layers的更新迭代,节点的描述符被不断丰富与精细化,最后将每个节点的特征进行线性投影得到输出层特征。
Self and Cross Layers.
ε s e l f \varepsilon_{self} εself 与 ε c r o s s \varepsilon_{cross} εcross 的定义是类似的。第 m m m 层的特征更新过程如下:
( m + 1 ) x i = ( m ) x i + ψ m ( [ ( m ) x i ∥ a m ( ( m ) x i ; E ) ] ) , (2) { }^{(m+1)} \mathbf{x}_{i}={ }^{(m)} \mathbf{x}_{i}+\psi_{m}\left(\left[{ }^{(m)} \mathbf{x}_{i} \| a_{m}\left({ }^{(m)} \mathbf{x}_{i} ; \mathcal{E}\right)\right]\right),\tag{2} (m+1)xi=(m)xi+ψm([(m)xi∥am((m)xi;E)]),(2)
其中 ∣ ∣ || ∣∣ 代表拼接, 函数 ψ m \psi_{m} ψm 使用 MLP来拟合。 a m ( ( m ) x i E ) a_{m}\left({ }^{(m)} \mathbf{x}_{i}\mathcal{E}\right) am((m)xiE) 为多头注意力机制,其中:
a m ( x i ; E ) = ∑ j : ( i , j ) ∈ E softmax j ( q i ⊤ k j D ) v j , (3) a_{m}\left(\mathbf{x}_{i} ; \mathcal{E}\right)=\sum_{j:(i, j) \in \mathcal{E}} \operatorname{softmax}_{j}\left(\frac{\mathbf{q}_{i}^{\top} \mathbf{k}_{j}}{\sqrt{D}}\right) \mathbf{v}_{j},\tag{3} am(xi;E)=j:(i,j)∈E∑softmaxj(Dqi⊤kj)vj,(3)
其中 q i \mathbf{q}_{i} qi 与 k j \mathbf{k}_{j} kj 是由节点特征 x i x_i xi 和 x j x_j xj 生成的,在自注意力层中, k j k_j kj 和 v j v_j vj 来自同一图像,而在交叉注意力中来自不同图像。自注意力允许网络利用整个图像的上下文,并解决重复结构下的模糊匹配问题。交叉注意力将相应特征在描述符空间中的距离拉近,并可以在另一幅图像中搜索类似的节点结构,以充分利用空间信息。
Line Message Passing.
本文提出一种新的 Line Message Passing(LMP) 的方法在线 ε l i n e \varepsilon_{line} εline 之间传播信息,通过在 wireframe 结构中连接 line segments,利用第 i i i 个节点与邻域节点 N i N_i Ni 的连接关系在匹配图像中寻找类似的连接关系。基于 m m m 层LMP来不断更新聚合来自 两个端点{ }^{(m)} \mathbf{x}_{i} 与 ( m ) x j { }^{(m)} \mathbf{x}_{j} (m)xj本身的信息与相应的位置编码信息 d j e \mathbf{d}^e_j dje
( m + 1 ) x i = ( m ) x i + ∑ j ∈ N i ϕ m ( [ ( m ) x i ∥ ∣ ( m ) x j ∥ d j e ] ) ∣ N i ∣ , (2) { }^{(m+1)} \mathbf{x}_{i}={ }^{(m)} \mathbf{x}_{i}+\sum_{j \in \mathcal{N}_{i}} \frac{\phi_{m}\left(\left[{ }^{(m)} \mathbf{x}_{i}\left\|\left.\right|^{(m)} \mathbf{x}_{j}\right\| \mathbf{d}_{j}^{e}\right]\right)}{\left|\mathcal{N}_{i}\right|},\tag{2} (m+1)xi=(m)xi+j∈Ni∑∣Ni∣ϕm([(m)xi ∣(m)xj dje]),(2)
其中 ϕ m \phi_{m} ϕm 由MLP来实现, ∣ N i ∣ |\mathcal{N}_{i}| ∣Ni∣ 为节点 i i i 的邻域节点之和,此处使用邻域节点的信息的均值来更新当前节点信息,也可以对邻域节点增加注意力机制,从经验数据上看书这样会增加模型的计算量,而对性能的提升不大。
最近一些工作表明,dual-softmax相较于Sinkhorm 算法有更好的性能,为此本文采用独立的dual-softmax处理点与线的匹配。此外,再一次使用GNN来对所有的节点(点与线)进行一次匹配:对于A图中的所有节点 f i A ∈ R D \mathbf{f}_i^A\in \mathbb{R}^D fiA∈RD 与 f j B ∈ R D \mathbf{f}_j^B\in \mathbb{R}^D fjB∈RD,每个节点的分配矩阵 S p \mathbf{S}^p Sp:
S i j p = ( f i A ) ⊤ f j B . (5) \mathbf{S}_{i j}^{p}=\left(\mathbf{f}_{i}^{A}\right)^{\top} \mathbf{f}_{j}^{B} .\tag{5} Sijp=(fiA)⊤fjB.(5)
使用可学习的参数来对分配矩阵增加 dustbin 的行与列(参考super glue)来表示非匹配点,然后对所有行和所有列进行softmax:
S final p = softmax r o w ( S p ) ⊙ softmax c o l ( S p ) . (6) \mathbf{S}_{\text {final }}^{p}=\sqrt{\operatorname{softmax}_{\mathrm{row}}\left(\mathbf{S}^{p}\right) \odot \operatorname{softmax}_{\mathrm{col}}\left(\mathbf{S}^{p}\right)} .\tag{6} Sfinal p=softmaxrow(Sp)⊙softmaxcol(Sp).(6)
其中 ⊙ \odot ⊙ 为逐元素相乘, 选择两个节点之间的匹配分数高于阈值 η \eta η 的视为匹配点。线的匹配过程是类似的,使用两个端点来表示一条线段 f s ∈ R D \mathbf{f}_{s}\in\mathbb{R}^D fs∈RD 与 f e ∈ R D \mathbf{f}_{e}\in\mathbb{R}^D fe∈RD, 为了消除端点顺序对匹配的影响,选择分配矩阵中得分比较大的一项作为最后的选择值,如图4所示:
S i j l = max ( ( f s A ) ⊤ f s B + ( f e A ) ⊤ f e B , ( f s A ) ⊤ f e B + ( f e A ) ⊤ f s B ) . (7) \begin{array}{r} \mathbf{S}_{i j}^{l}=\max \left(\left(\mathbf{f}_{s}^{A}\right)^{\top} \mathbf{f}_{s}^{B}+\left(\mathbf{f}_{e}^{A}\right)^{\top} \mathbf{f}_{e}^{B},\right. \left.\left(\mathbf{f}_{s}^{A}\right)^{\top} \mathbf{f}_{e}^{B}+\left(\mathbf{f}_{e}^{A}\right)^{\top} \mathbf{f}_{s}^{B}\right) . \end{array}\tag{7} Sijl=max((fsA)⊤fsB+(feA)⊤feB,(fsA)⊤feB+(feA)⊤fsB).(7)
最后通过公式6的dual-softmax来得到最后的分配矩阵。
为了得到点的 Ground True(GT) 值 M p \mathcal{M}^p Mp,利用相机参数与深度图,将关键点从一幅图像中warp到另外一幅图像中,如果重投影点落在现有关键点的一个小邻域内,则认为两个关键点在空间中是接近的,则认为他们是匹配的。
线段匹配的一大挑战就是对一些碎片化、和部分遮挡的的线段生成高质量的标签数据。不妨设图像 A A A 与 B B B 分别包含 M M M 和 N N N 条线段,表示为 A : = { 1 , . . . , M } \mathcal{A}:=\{1, ...,M\} A:={1,...,M}, B : = { 1 , . . . , N } \mathcal{B}:=\{1, ...,N\} B:={1,...,N}, 则匹配线段表示为 M l = { ( i , j ) ⊂ A × B } \mathcal{M}^l=\{(i, j)\subset\mathcal{A}\times \mathcal{B}\} Ml={(i,j)⊂A×B},对于图 A A A 中的每条线段 I i A \mathbf{I}_i^A IiA,从线段中采样 K K K 个点 [ x i , 1 A , . . . , x i , K A ] [\mathbf{x}_{i,1}^A, ..., \mathbf{x}_{i,K}^A] [xi,1A,...,xi,KA]。如果这个点没有深度值或者重投影到B图时没有深度值,则将该点剔除。同时,这些点应该不属于遮挡区域,使用图 A 中的点warp到图B,然后计算深度值偏差度,如果大于阈值则认为该点是遮挡点:
Occluded = ∣ d ( X i ) − d B ∣ d B > T occlusion , (8) \text { Occluded }=\frac{\left|d\left(\mathbf{X}_{i}\right)-d^{B}\right|}{d^{B}}>T_{\text {occlusion }},\tag{8} Occluded =dB d(Xi)−dB >Tocclusion ,(8)
然后生成一个邻近矩阵来统计A图中,第 i i i 条线段有多少个点能成功warp到B图中 j j j 条线段附近:
C i , j B = ∑ k = 1 K 1 ( valid ( x i , k B ) ∧ d ⊥ ( x i , k B , l j B ) < T d i s t ) (9) \mathbf{C}_{i, j}^{B}=\sum_{k=1}^{K} \mathbb{1}\left(\operatorname{valid}\left(\mathbf{x}_{i, k}^{B}\right) \wedge d_{\perp}\left(\mathbf{x}_{i, k}^{B}, \mathbf{l}_{j}^{B}\right)
其中 1 ( ⋅ ) 1(\cdot) 1(⋅) 为指示函数, d ⊥ ( ⋅ , ⋅ ) d_{\perp}(\cdot,\cdot) d⊥(⋅,⋅) 为垂直与点线距离。 T d i s t T_{\mathrm{dist}} Tdist 为像素为单位的距离阈值,用于控制 GT 的严格程度, C A C^A CA 的定义与 C B C^B CB 类似,为此定义一个具有最小重叠阈值 T o v e r l T_{overl} Toverl 的成本矩阵:
C i , j = { ∞ , if C i , j A < T overl ∨ C j , i B < T overl − C i , j A C j , i B , otherwise. (10) \mathbf{C}_{i, j}=\left\{\begin{array}{ll} \infty, & \text { if } \mathbf{C}_{i, j}^{A}
最后使用匈牙利算法来求解该分配问题,分配结果 ( i , j ) ∈ M l (i, j)\in \mathbb{M}^l (i,j)∈Ml 为匹配特征,未被匹配的特征都被标记为未匹配状态。
一般使用带有 hard negative mining 的 triplet-ranking-loss作为损失函数,而线段经常出现重复结构,这会导致不稳定的 hard negative,因此使用点与线的分配的负对数似然来作为损失函数:
L = NLL ( S final p , M p ) + NLL ( S final l , M l ) 2 (11) \mathcal{L}=\frac{\operatorname{NLL}\left(\mathbf{S}_{\text {final }}^{p}, \mathcal{M}^{p}\right)+\operatorname{NLL}\left(\mathbf{S}_{\text {final }}^{l}, \mathcal{M}^{l}\right)}{2} \tag{11} L=2NLL(Sfinal p,Mp)+NLL(Sfinal l,Ml)(11)
NLL ( A , M ) = − ∑ ( i , j ) ∈ M log A i , j − ∑ i ∈ I log A i , N + 1 − ∑ j ∈ J log A M + 1 , j (12) \begin{aligned} \operatorname{NLL}(\mathbf{A}, \mathcal{M})= & -\sum_{(i, j) \in \mathcal{M}} \log \mathbf{A}_{i, j} -\sum_{i \in \mathcal{I}} \log \mathbf{A}_{i, N+1}-\sum_{j \in \mathcal{J}} \log \mathbf{A}_{M+1, j} \end{aligned}\tag{12} NLL(A,M)=−(i,j)∈M∑logAi,j−i∈I∑logAi,N+1−j∈J∑logAM+1,j(12)