知识准备
这部分主要是一个理解HITNET的前期知识准备,不了解一下的话可能看起来比较生涩,个人觉得加上这部分知识之后再看待HITNET这篇文章逻辑上会更为流畅一些。
1.HITNET的灵感本质上来自于传统的双目匹配方法Patch Match,patch作为一个块,其比单个像素所包含的信息更多,核心要素是对一个图像区域中的所有切块进行重复搜索,以获得另一个图像区域中最相似的切块。
这种算法的流程一般包括随机场初始化、propagation、后处理等基本步骤。
2.在Patch Match的问题中有个无法回避的问题就是fronto-paralle的假设,下面这张图表示fronto-parallel的plane AB 在两个camera C1和C2中成的像a1,b1和a2,b2是一样大的,这个就是fronto-parallel的假设:
但往往patch里的物体会呈现出一定的倾斜(slanted)扭曲关系在镜头里,这就说明在两张图像中要寻找不同程度扭曲的对应的patch,只用单纯的相同大小的patch比对肯定会出问题的:
所以解决这个问题,有两个思路,一个是在cost computation上面做文章,想办法把扭曲的patch变成正常的patch,cost aggregation保持不变。这样的话,image做shift就不是整数倍了,即disparity跟坐标x,y有关(HITNET的公式应该反映的就是这个意思)。另一个办法是保持cost computation不变,改变cost aggregation。
知识准备部分更详细的内容可以参加这两篇博客:Patch Macth部分理解/关于multiple plane的Stereo matching一点理解
HITNet
这是来自Google的一篇工作,发表在CVPR 2021,这篇文章可以说是效果又快又好,在网上的评价很高,既有方法上的创新又考虑到了工业界的时效性要求,与BGNET做个对比的话,它的推理时间是0.02s,比BGNET快0.01s,KITTI2015误差为1.98%,BGNET为2.19%。与许多最近在full cost volume上运行并依赖 3D 卷积的神经网络方法相反,他们的方法没有明确地构建体积,而是依赖于快速的多分辨率初始化步骤、可微的 2D 几何传播和warping操作推断视差。为了实现高准确性,他们的网络考虑了slanted plane的情形,从而可以更准确地快速执行几何变形和上采样操作,计算量也很小。文章有些细节我也没有透彻理解,下面简单谈下我个人的认识。
方案概述
U-Net 结构用于从左右图像中提取多个尺度的特征。初始化步骤在提取特征的每个尺度上运行,此步骤对 4×4 特征区域的图块进行操作,并评估多个视差假设,选择具有最小成本的视差,然后在传播阶段使用初始化的输出来使用倾斜的支持窗口细化预测的视差假设。
关键步骤
(1)提取特征表示:
特征提取模块依赖于一个非常小的U-Net,提取不同尺度的信息(这个U-Net结构直接让我们想到BGNET的特征提取,说明这个模组被广泛使用啊)
(2)初始化:
初始化的时候基于一个前提假设,也就是前面提到的fronto-parallel的假设,因为只是初始化,所以不要太精细(太妙了)。作者提出一个叫作tile hypothesis的东西,tile hypothesis就是一个带有可学习特征的patch,具体来说,tile hypothesis由三部分组成:一个描述视差d的几何部分,一个x和y方向上的视差梯度(dx, dy)和一个可学习的P,我们可以称P为特征描述符,特征描述符P是tile的可学习表示,其允许网络将附加信息附加到tile。比如说几何图形的实际平面程度,作者不限制这些信息,而是从数据中端到端地学习它,如下式所示:
那么,初始化阶段的目标是在不同分辨率下提取每个分块的初始视差数据d和特征向量P。我们在知识准备的部分提到过,fronto-parallel假设条件下,视差与位置(x,y)无关,所以初始化其实就是为了得到下式:
那么具体是如何得到
d
i
n
i
t
d^{init}
dinit的呢?这部分应该就是借鉴的传统算法的思想,在右图像中沿x方向(即宽度)使用重叠的tile,但在左图像中仍使用非重叠的tile以进行有效的匹配。为了提取tile特征,我们对每个提取的特征图el使用4×4卷积。对于左边的图像,我们使用4×4的步长,对于右图我们使用4×1的步长,实验发现这是最合适的参数,这对于保持全视差分辨率以最大限度地提高精度至关重要。这个卷积之后是一个leaky Relu和一个1×1的卷积。
该步骤的输出是一系列拥有每一tile特征的新特征图,左右特征图的宽度此时已不相同(左图是右图宽度的1/4)。定义在(x,y)位置的匹配代价
ρ
\rho
ρ为(l为采样率):
初始视差为:
另外,尽管初始化阶段为所有patch详尽地计算匹配,但不需要存储所有成本量。在测试时,只需要提取最佳匹配的位置,这可以利用快速存储器(例如,GPU上的共享存储器)非常高效地完成。因此,不需要存储和处理3D成本量。
特征描述子
p
i
n
i
t
p^{init}
pinit可以通过下式得到:
其中,D是一个具有可学习权重
θ
D
L
\theta_{DL}
θDL的感知器,其实就是一个1*1卷积+leaky Relu的卷积层。
(3)propagation:
传播步骤将tile hypotheses作为输入,并基于信息的空间传播和信息融合输出更细化的新tile hypotheses。它在内部将特征提取阶段的特征从右侧图像(次要图像)warping到左侧图像(参考图像),以预测输入tile的高精度偏移。另外,额外引入了一个置信度参数,用来融合来自前一层的tile hypotheses和本层的tile hypotheses。
Warping操作是如何进行的呢?每个tile hypotheses被转换为44大小的planar patch,它覆盖原来的feature map,我们定义这个局部的44的local disparity map为
d
′
d^{'}
d′,如下式所示:
其中i,j是patch coordinate,范围为{0…3},这个公式应该是这么来的,我觉得是如下图的一种近似(我猜测的),每个蓝色点代表一个像素点:
Warping的具体操作就是沿着scan line将右图的特征
e
l
R
e^{R}_{l}
elR使用线性插值warp到左图的特征
e
l
L
e^{L}_{l}
elL,如果这是一个好的warp,那就是说
d
′
d^{'}
d′是准确的。定义一个16维的损失向量
ϕ
(
e
l
,
d
′
)
\phi(e_l,d^{' })
ϕ(el,d′):
到这边还没有结束,作者还设计了一个置信度量w(标量)来表明tile是否正确,这一步以n个tile hypotheses为输入,并预测tile hypotheses的增量加上每个tile hypotheses的标量值w,表示这个tile hypotheses有多大可能是正确的,这个机制使用一个CNN模块U来实现,卷积架构能让网络看到空间邻域的tile hypotheses,从而能够在空间上传播信息,这一步的一个关键部分是,他们扩大了tile hypothesis使用从warping步骤中计算的匹配代价φ;通过在视差空间中为一个小邻域这样做,我们建立了一个local cost volume,允许网络更有效地精炼tile hypotheses,详细的步骤是,我们替换tile中的全部视差,我们在正负两个方向上以一个恒定的视差偏移量替换tile中的所有视差,并计算三次成本。
实验结果
(本文仅代表个人见解,如有不妥,欢迎大家共同探讨!如需转载,请联系本人。)