欢迎访问我的博客首页。
1. 摘要
立体匹配算法健壮性高且速度快,因此被广泛用于根据立体图像推理深度。因为可以用于自动驾驶、机器人导航、3D重建等领域,所以立体匹配算法成为一个热门研究课题。在无纹理(质地均匀)、遮挡、反光区域找出像素对应关系,是立体匹配面临的挑战。最近研究表明,图像分割中的语义信息(cues)有助于立体匹配。有很多深度神经网络结构都在立体匹配问题中充分利用语义分割信息。精度和速度是立体匹配的重要指标,本文就这两个方面,对比当前流行的算法。
2. 引言
2.1 立体匹配
立体匹配用于从已知相机(内参等已知)拍摄的两幅图像中,找到点的对应关系。传统的立体匹配算法假设场景的亮度和质地都是均匀的。以半全局匹配(SGM)算法为例,它包含 4 个步骤:
- 像素级的代价计算:计算两幅立体图像中,相匹配的每一对像素的匹配误差。
- 代价聚合:像素级的代价计算通常是模糊的。由于噪声等因素,错误匹配的代价可能比正确匹配的代价还小。因此使用代价聚合算法限制相邻视差的变化,保证视差平滑性。代价聚合计算某些范围内的视差值匹配误差,以形成 cost volumes。
- 视差计算:通过最小化代价函数,计算 cost volumes 的匹配损失。
- 视差后处理:改善视差。
2.2 语义分割
语义分割是一种像素级分类的图像分割算法。传统的方法包括:
- 超像素分割:把图像划分成许多不重叠的超像素。
- 活动轮廓法:利用图像中的能量约束(energy constraints)和力量(forces),分离 ROI。
- 分水岭分割:把像素值看作局部地形。
2.3 立体匹配协同语义分割
最近的语义匹配工作表明,来自语义分割的语义标签可以提高立体匹配在无纹理(质地均匀)、遮挡、反光区域的性能。同样,来自立体匹配的深度信息也可以帮助区分相似的语义类别。这表明语义信息和深度图可以相互补充,它们可以一起呈现更多场景信息。
2.4 最新进展
共同学习的精度比单独学习的效果好,但网络的复杂性使速度变慢。
3. 语义深度估计
语义深度估计利用语义信息(cues),即每个像素的类别标签,提高立体匹配中的深度估计结果。
3.1 语义深度估计算法分类
根据训练数据,语义深度估计可以分为监督算法和无监督算法:
- 监督算法需要立体图像和真实视差(disparity ground truth)训练网络。
- 无监督算法不需要真实视差,主要依靠变形(warp)误差。先计算出深度和视差,然后,右图根据视差变形,再与左图比较。训练时降低视觉差异。这些方法中的语义分割部分仍然是监督学习。
根据网络模型,语义深度估计可以分为单独学习算法和共同学习算法:
- 单独学习算法同时为深度估计和语义分割训练网络,然后语义分割的结果用于改善视差。
- 共同学习算法的前部分为立体匹配和语义分割提取共同特征,后部分改善结果。
3.2 使用语义信息(cues)获取深度
使用语义信息获取深度可以分为 4 个阶段:
3.2.1 提取共同特征
这个阶段从输入图像中,为立体匹配和语义分割提取共同特征。相比立体匹配信息,语义分割特征要在更深层的网络中获取,因为它需要更多的上下文信息。这个阶段一般会降低图像分辨率,只提取与立体匹配和语义分割有关的特征。共同特征分别输入两个子网络用于深度估计和语义分割。共同学习被证明是有效的,因为下降视差估计(descent disparity estimation)只需要少量特征,有利于高帧率。
3.2.2 视差估计
这个阶段估计原始视差。共同特征经过视差子网络得到视差估计专用特征。通过一系列视差值得到 cost volumes,再回归出原始视差。这个阶段获得的视差图在图像的无纹理(质地均匀)、遮挡、反光区域存在误差。
- 使用空间金字塔 cost volumes 提高对应关系(correspondences)
参考文献 2 使用金字塔 cost volumes 学习目标与其近邻的关系,从而获得更多对应关系(correspondences)。图 2(a) 是使用空间池化,从左右图像特征构造空间金字塔 cost volumes 的过程。图中共有 3 种分辨率,对于每种分辨率,叠加左右图像中对应的一元(unaries),得到一个 4D cost volumes。相应分辨率的视差可以从这个 volume 中获取。
- 通过优化,在保持精度的基础上降低计算量
参考文献 5 叠加左右视图的特征,形成一个 5 维的 cost volumes,让网络在训练时学习更好的相关性度量。使用一个 3D 的卷积核卷积这个 5 维的 cost volumes 得到视差信息。编解码器结构可以降低卷积的内存占用。在参考文献 1 中,因为特征地图的分辨率是原图的 1/16、1/8、1/4。子网络使用金字塔网络结构,金字塔网络包含若干解码器,解码器解码共同特征,得到由粗到精的视差图。如图 2(b) 所示。因为是在不同分辨率估计视差,所以降低了计算量,且允许用户自由平衡精度与速度。
3.2.3 语义分割
该阶段用于提取语义标签。
- PSP 模型保留不同尺度中的上下文信息
参考文献 3 使用一个金字塔解析模型估计语义标签。这个模型获取不同的子区域表征(representations),对这些表征进行上采样和叠加,形成最终的特征表征。这样做可以为下一阶段整合局部上下文信息和全局上下文信息。
3.2.4 改善视差
原始视差包含噪声,且其精度还受病态区域的错误匹配影响。由于同属于一个语义部分(局部平滑约束),病态区域内的视差值应该和它的近邻相似。根据这个假设,可以用语义特征(cues)改善视差。视差网络的结果和语义分割网络的结果叠加后得到混合 volume,再经过卷积层得到最终改善后的视差。
- 代价聚合模型
参考文献 11 使用多尺度上下文交织法,递归地把来自低尺度的 4D 空间 cost volumes 融合到更高尺度(?)。该模型包含两个子模型:
沙漏模型:基于可学习的上采样理论,参考文献 2 使用沙漏模型上采样。沙漏模型可以保留更多上下文信息,如图 3(a) 中的编解码器结构包含重复的 top-down/bottom-up 过程。每个模型产生一个对应分辨率的视差图。
特征融合模型:如图 3(b),使用 3D 特征融合模型而不是简单的叠加进行 cost volumes 融合。
- 降低计算量
参考文献 3 的使用残差结构,只改善病态区域。参考文献 1 把语义特征(semantic embedding)压缩到和视差 cost volumes 同尺寸,降低融合过程的计算量。
4. 损失函数
参考文献 1、2、3 的损失函数包含原始视差损失、分割损失和改善视差损失。
DispSegNet 提出了光度损失、正则化损失、一致性损失、平滑损失。
损失函数 | 应用阶段 | 学习类型 |
---|---|---|
Softmax Cross Entropy | 语义分割 | 监督学习 |
L1-Smooth | 原始视差估计 | 监督学习 |
Photometric | 原始视差估计 | 无监督学习 |
Regularization | 原始视差估计 | 无监督学习 |
Consistency | 原始视差估计 | 无监督学习 |
Smoothness | 改善视差 | 监督学习 |
Cross-domain discontinuity | 改善视差 | 监督学习 |
4.1 交叉熵损失:Softmax Cross Entropy
交叉熵损失用于降低语义标签的预测概率与实际值的差异。
公式中,M 是类别总数。
4.2 L1 平滑损失:L1-Smooth Loss
从 cost volume 估计视差是一个回归问题,所以损失函数计算视差与实际值的 L1-Smooth Loss。公式中 d 是估计的视差,d拔 是实际值。相比 L2 loss,L1-Smooth Loss 对大误差的梯度更平稳;相比 L1 loss,L1-Smooth Loss 更新小误差时不容易震荡。
4.3 光度损失:Photometric Loss
假设
I
L
I_L
IL 和
I
R
I_R
IR 分别是输入的左图和右图,
D
L
D_L
DL 和
D
R
D_R
DR 分别是预测出的左右视差图。变形(warp)函数
F
(
I
,
D
)
F(I, D)
F(I,D) 的作用是根据视差图
D
D
D,使用双线性插值把图像
I
I
I 变换到其它视角,重建一幅新图像。重建出的左图是
I
L
′
=
F
(
I
R
,
D
L
)
I_L' = F(I_R, D_L)
IL′=F(IR,DL),重建出的右图是
I
R
′
=
F
(
I
L
,
D
R
)
I_R' = F(I_L, D_R)
IR′=F(IL,DR)。
重建出的图像应该和原始输入图像非常相似。光度损失使用结构相似性(SSIM)和欧氏距离提高算法在病态区域的健壮性。左图的光度误差可以表示为:
L p = λ 1 S ( I L , I L ′ ) + λ 2 ∣ I L − I L ′ ∣ + λ 3 ∣ ∇ I L − ∇ I L ′ ∣ . (4.3) L_p = \lambda_1 S(I_L, I_L') + \lambda_2 |I_L - I_L'| + \lambda_3 |\nabla I_L - \nabla I_L'|. \tag{4.3} Lp=λ1S(IL,IL′)+λ2∣IL−IL′∣+λ3∣∇IL−∇IL′∣.(4.3)
公式中的
S
(
⋅
)
S(\cdot)
S(⋅) 是 SSIM 函数,
∇
\nabla
∇ 是梯度,
λ
1
=
0.85
\lambda_1 = 0.85
λ1=0.85、
λ
2
=
0.15
\lambda_2 = 0.15
λ2=0.15 和
λ
3
=
0.15
\lambda_3 = 0.15
λ3=0.15 是按经验设置的常数系数。
公式的第一项是 SSIM 损失,第二项是欧氏距离。通过变形重建出的
I
L
′
I_L'
IL′ 难免会有误差,比如局部像素值跃变,即不平滑,这称为图像的高频噪声。公式的第三项使用一阶导数减少高频噪声,二阶导数也可以减少高频噪声,下面的正则化损失就是利于二阶导数减少高频噪声。
由于该损失依赖变形误差,所以它不需要标注数据,可以无监督学习。
1. 图像频率
频率指信息的丰富程度,像素值与其近邻的差值越大,频率越高。所以高分辨率、丰富纹理都是高频。注意,线性插值并不能增加图像的高频信息,而图像超分是增加高频信息的技术。
2. warp 函数
3. SSIM
压缩或传输等处理会造成图像质量下降,SSIM 用于量化图像质量下降的程度。SSIM 从亮度、对比度、结构这三个方面比较两幅图像的相似性。TensorFlow 和 scikit-image 都实现了计算 SSIM 的函数。
import cv2
import tensorflow as tf
# from skimage.measure import compare_ssim
from skimage.metrics import structural_similarity as ssim
if __name__ == '__main__':
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('2.jpg')
ssim_tf = tf.image.ssim(img1, img2, max_val=255)
# ssim_sk = measure.compare_ssim(img1, img2, win_size=11, data_range=255, multichannel=True, gaussian_weights=True)
ssim_sk = ssim(img1, img2, win_size=11, data_range=255, multichannel=True, gaussian_weights=True)
print(ssim_tf)
print(ssim_sk)
其中 max_val 和 data_range 是最大像素值与最小像素值的差。当像素类型是 uint8 时,max_val 取 255;当像素类型是 float 时,max_val 取 1.0。
4.4 正则化损失:Regularization Loss
不仅重建出的图像局部应该是平滑的,局部视差也应该是平滑的。因此,还可以使用正则化损失抑制光度误差引入的高频噪声。
视差图的二阶导数乘以权重,再求和,就是正则化损失。其中权重是输入图像
I
L
I_L
IL 的二阶导数的自然指数。左侧的正则化损失定义为:
L r = 1 N ∑ ∣ ∇ x 2 D L ∣ ⋅ e x p ( − ∣ ∇ x 2 I L ∣ ) + ∣ ∇ y 2 D L ∣ ⋅ e x p ( − ∣ ∇ y 2 I L ∣ ) (4.4) L_r = \frac{1}{N} \sum_{} |\nabla_x^2 D_L| \cdot exp(-|\nabla_x^2I_L|) + |\nabla_y^2 D_L| \cdot exp(-|\nabla_y^2I_L|) \tag{4.4} Lr=N1∑∣∇x2DL∣⋅exp(−∣∇x2IL∣)+∣∇y2DL∣⋅exp(−∣∇y2IL∣)(4.4)
公式中
D
L
D_L
DL 是预测的左视差,
N
N
N 是像素数量,
∇
x
2
\nabla_x^2
∇x2 和
∇
y
2
\nabla_y^2
∇y2 分别是 x 和 y 方向的二阶导数。
可以看出,视差的二阶导数
∇
x
2
D
L
\nabla_x^2 D_L
∇x2DL 与输入图像的二阶导数
∇
x
2
I
L
\nabla_x^2I_L
∇x2IL 成反比。这意味着,输入图像的二阶导数越大,视差的变化概率才能越大。
使用一阶导数减少高频噪声时,求导对象是左图
I
L
I_L
IL 和用右图重建出的
I
L
′
I_L'
IL′。使用二阶导数减少高频噪声时,求导对象是左图
I
L
I_L
IL 和左视差
D
L
D_L
DL。所以上面的一阶导数用于平滑重建出的图像
I
L
′
I_L'
IL′,这里的二阶导数用于平滑计算出的原始左视差
D
L
D_L
DL。
4.5 一致性损失:Consistency Loss
一致性损失使孪生网络的左右分支互相一致,即图 4.1 的两个子网络的输出应该能相互一致:左图
I
L
I_L
IL 按照子网络 1 输出的左视差
D
L
D_L
DL 变换到右视图得到重建的
I
L
′
I_L'
IL′,再根据子网络 2 输出的右视差
D
R
D_R
DR 变换回左视图得到重建的
I
L
′
′
I_L''
IL′′。
I
L
I_L
IL 与
I
L
′
′
I_L''
IL′′ 的差异代表两个子网络的视差估计精度。
图
4.1
D
i
s
p
S
e
g
N
e
t
结
构
图\ 4.1\quad DispSegNet结构
图 4.1DispSegNet结构
一致性损失用于降低两次变形前后的差异:
L c = ∣ I L − I L ′ ′ ∣ + ∣ I R − I R ′ ′ ∣ . (4.5) L_c = |I_L - I_L''| + |I_R - I_R''|. \tag{4.5} Lc=∣IL−IL′′∣+∣IR−IR′′∣.(4.5)
I L ′ ′ I_L'' IL′′ 和 I R ′ ′ I_R'' IR′′ 分别是左图和右图经过两次变形的结果, I L ′ ′ = F ( I R ′ , D L ) I_L'' = F(I_R', D_L) IL′′=F(IR′,DL)、 I R ′ ′ = F ( I L ′ , D R ) I_R'' = F(I_L', D_R) IR′′=F(IL′,DR)。
4.6 平滑损失:Smoothness Loss
一个分割区域内的视差应该是平滑的。根据这个假设,网络可以根据同属一个分割区域内的,病态区域的邻近区域推断出该病态区域的视差。假设原始视差是合理的,我们使用左右一致性检查,找到这些病态区域。所以平滑损失用于改善视差阶段。
根据视差图
D
L
D_L
DL,变换视差图
D
R
D_R
DR:
D
L
′
=
F
(
D
R
,
D
L
)
D_L' = F(D_R, D_L)
DL′=F(DR,DL) 。
f_L 是来自左视图的特征向量。
4.7 跨域间断损失:Cross-domain discontinuity loss
深度间断的地方一般也是语义边界。基于这个假设,该损失给两个学习任务施加一个外显链接,利于真实的像素级语义标签提高深度预测。
sem 是语义分割的真实值,\phi_x 和 \phi_y 分别是 x 和 y 方向的相邻像素的亮度梯度,d_{i,j}’ 是像素 i 和 j 间的估计视差。
5. 参考
- 论文,arxiv,2021。
- DispSegNet,arxiv,2019。