1 介绍
基于深度学习的单应矩阵的估计,单应矩阵是个3*3的矩阵,表示两个图像之间的变换关系。传统方法是预测一个图像4个点之间的对应关系来计算单应矩阵的,但是本文作者通过预测流来计算单应矩阵的,(直接预测单应矩阵参数是不现实的)。
这个网络似乎适用于较小幅度的单应变换。In small-baseline scenarios, a homography flow can be reconstructed inside the space spanned by these flow bases by learning combinational weights.
网络中的LRR块叫做Low Rank Representation,低秩表示。除了这个还提出了一个FIL损失,Feature Identity Loss,特征识别Loss。主要就是表示同一个位置的像素的特征经过任何变换应该是一样的。
作者的创新点
- 单应流的新表达。单应流可以由8个预计算好的单位单应流加权表示,而且是无监督算法。
- 提出了一个新的LRR块,可以减少运动特征的rank,进而隐式且有效的减少运动噪声。
- 提出了一个新的FIL损失,能够更好的训练学习。
2 算法
2.1 网络结构
网络结构如下所示,输入两个图片
I
a
,
I
b
I_a,I_b
Ia,Ib,经过特征提取和单应估计网络,输出8个参数。作者实际上参考光流的思想去计算单应矩阵的,先计算出8个单位单应流,然后利用这8个预测出参数与8个单位流加权求和。
单应流和它的基本形式。单应矩阵有8个自由度,可以利用4对对应点直接通过直接馅饼变换计算得到。每个流的维度是
H
∗
W
∗
2
H*W*2
H∗W∗2。因为单应矩阵有8个自由度,因此单应流的空间由8个2HW的单位流构成。如下公式所示,其中问题就变为我们要如何计算出
h
i
h_i
hi。值得注意的是这8个流是正交的。
这段给出正交单位流的计算方法。先定义一个单位流(我理解可能就是单位矩阵),然后对单位矩阵的每个维度进行分别调整,这样就得到8个单应矩阵,一个单应矩阵对应一个流图,因此这里就可以得到8个流图。把每个图展开成一个列向量,拼在一起,得到矩阵
M
∈
R
2
H
W
∗
2
M\in R^{2HW*2}
M∈R2HW∗2,对这个进行QR分解,得到
M
=
Q
⋅
R
M=Q\cdot R
M=Q⋅R,这里的矩阵
Q
∈
R
2
H
W
∗
8
Q\in R^{2HW*8}
Q∈R2HW∗8是正交的,因此取出Q的每一列作为一个单位基本流
h
i
h_i
hi,即
[
h
1
,
h
2
,
.
.
.
,
h
8
]
=
Q
[h_1,h_2,...,h_8]=Q
[h1,h2,...,h8]=Q。下图是8个基本流可视化的结果,颜色表示方向,颜色强度表示梯度幅值。
等变warp特征提取器。最早的loss是最小化warp之后的像素差异。之后有人认为同一个块学到的特征应该是相似的,因此最小化warp特征之后对应的特征值差异。给定一个特征提取器f, W ( f ( I ) ) = f ( W ( I ) ) W(f(I))=f(W(I)) W(f(I))=f(W(I))。输入的两张图片 I a , I b I_a,I_b Ia,Ib,对应生成的特征为 F a , F b F_a,F_b Fa,Fb,因此产生了一个loss,即 L w = ∣ W ( f ( I ) ) ∣ − f ( W ( I ) ) L_w=|W(f(I))|-f(W(I)) Lw=∣W(f(I))∣−f(W(I))。
基于LRR块的单应估计器。这个block用于预测8个参数,后面的部分主体结构是ResNet-34,插了两个LRR块。每个输入的
M
i
n
∈
R
H
∗
W
∗
C
M_{in} \in R^{H*W*C}
Min∈RH∗W∗C经过浅层残差网络后得到
M
v
∈
R
H
∗
W
∗
K
M_v \in R^{H*W*K}
Mv∈RH∗W∗K,将每一维展开拼在一起,得到矩阵
V
∈
R
H
W
∗
K
V\in R^{HW*K}
V∈RHW∗K,然后与输入
M
i
n
M_{in}
Min结合,得到
M
o
u
t
=
V
(
V
T
V
)
−
1
V
T
M
i
n
M_{out} = V(V^TV)^{-1}V^TM_{in}
Mout=V(VTV)−1VTMin,再重组维度得到
M
o
u
t
∈
R
H
∗
W
∗
C
M_{out}\in R^{H*W*C}
Mout∈RH∗W∗C的输出特征图。这里的K设置为16。看了消融实验,这个LRR提升的效果还挺明显,但这个思路提出的有点突兀,不知道是参考了哪个网络想到了这个Idea。我理解可能是降秩之后特征更清晰了,更好的表达关键信息,训练效果会更好。
2.2 Loss函数相关
当单应流
H
a
b
H_{ab}
Hab估计出来之后,可以变换特征图
F
a
→
F
a
′
F_a\rightarrow F'_a
Fa→Fa′,这样就可以构造出一个Loss。值得注意的是,Loss第一项是要求变换后对应特征值因该相似,第二项是要求两张图的特征图应该是不一样的,防止训练时候出现特征值全是0的情况。
然后构造出一个特征识别Loss,就是相同像素区域附近构成的特征值应该是一样的。也就是,变换特征值或变换图像再算特征值应该是等价的。
理论上,交换两个图片也应该是一样的。
3 实验结果
重合效果特别好,右下角有鬼影我猜是人是运动的原因。
整体最优,绝了!
消融实验,证明每个过程都是有用的。
4 总结
这个算法可以用来计算两个小变动的图像的匹配关系,主要适用于小场景变化。
后续可以尝试改进,使其应用在大场景,或相机pose的估计上。