1. 介绍
拍摄景深图像能够让人将注意力集中于图像中特定的目标,这项技术在专业和业余摄影者中广泛使用。为了拍摄出景深图像,往往需要有着高质量光学系统的单反相机(DSLR)来聚焦某个特定的深度平面,同时产生柔美的散焦(bokeh)效果。
Busam、Hog 等人提出了一个基于物理的流程来模仿该效果,而输入是手机等设备拍摄的 all-in-focus 立体图像。在 KITTI 图像数据集上处理速度能达到 76 FPS,满足实时性。作者有效地将基于立体视觉的深度估计和聚焦结合起来。不同于其他方法,作者方法有以下优点:完全可微、基于物理且对场景内容不敏感。同时方法还能用于视频中运动目标的实时聚焦。
2. 方法
如下图所示,整个流程由两个模块组成:深度估计(depth estimation)和重聚焦(refocusing)。输入是校正后的左右立体图像。聚焦平面深度和光圈大小是两个用户可调的参数。
2.1. 视差估计
(一般情况下视差和深度成反比例关系,作者估计视差而不是深度的目的在于后面基于物理的重聚焦需要利用视差)
为了获得高质量的深度图,作者使用的结构参考了两个当前最优的实时深度估计方法:StereoNet 和 ActiveStereoNet,它们首先估计出精确的低分辨率深度图,再连续上采样并利用原始 RGB 参考图像来优化上采样后的深度图。作者的深度估计网络包含两个 Siamese 结构,它们共享权重,用于提取深层的 1/8 分辨率图像特征,作者将两个输入提取的特征 channel 层连接构建 cost volume(CV)。作者将视差划分为 18 层,使用可微分的 ArgMin 算子来恢复从
i
=
0
i=0
i=0 到
D
m
a
x
=
17
D_{max}=17
Dmax=17 的视差,具体公式如下:
d
i
=
∑
d
=
1
D
m
a
x
+
1
d
⋅
σ
(
−
C
i
(
d
)
)
−
1
d_i=\sum^{D_{max}+1}_{d=1}d\cdot \sigma(-C_i(d))-1
di=d=1∑Dmax+1d⋅σ(−Ci(d))−1
σ \sigma σ 是 softmax 算子, C i C_i Ci 代表某个视差对应损失。通过双线性差值的方式将上述公式获取的低分辨率深度图上采样回原始分辨率( 1 8 → 1 4 → 1 2 → full resolution \frac{1}{8}\to\frac{1}{4}\to\frac{1}{2}\to \text{full\ resolution} 81→41→21→full resolution),之后使用残差结构来优化视差图以获取更多的图像细节,详细网络结构和训练细节见原文。
2.2. 有效的层级景深
重聚焦模块利用层级景深渲染来达到有效的重聚焦。其核心思想是先将场景根据深度分层,然后根据不同深度来分开模糊,最后再合成。作者采用基于物理的方式来进行景深渲染,以求达到效率和准确率的平衡。使用这个方法,模糊操作采用固定模糊核,因此使用现有GPU的卷积操作能够有效实现。具体算法如下图所示。
其中
∘
\circ
∘ 代表 Hadamard 乘积,
∅
\varnothing
∅ 代表点除,
∗
*
∗ 代表卷积,详细过程描述见原文。
自适应下采样: 为了进一步提高效率,作者设置了一个最大的核尺寸 k m a x k_{max} kmax。对于给定的视差图 d d d,逝将输入图片缩放为 γ = ⌈ 2 r + 1 ⌉ / k m a x \gamma=\lceil 2r+1\rceil/k_{max} γ=⌈2r+1⌉/kmax 倍,因此卷积时使用的核尺寸为 K ( γ ⋅ r ) K(\gamma\cdot r) K(γ⋅r)。之后再上采样回原始大小,尽管这是一种近似,但视觉效果与不缩放处理差不多,这是因为该部分仅用于散焦区域,对于图像清晰程度并不敏感。而使用该方法确能大大提高计算效率。
可微性: 为了后续端到端的训练,算法需要满足可微性,在上图算法 1 中可以看到,除了第 4 行的计算 mask 操作其他均可微,作者使用 Heaviside step 函数来表示计算 mask 操作:
M
d
=
H
(
1
a
−
∣
D
−
d
∣
)
where
H
(
x
)
=
{
0
x
<
0
1
x
≥
0
M^d=H\bigg(\frac{1}{a}-|D-d|\bigg) \text{ where} H(x)= \begin{cases} 0 & x<0 \\ 1 & x\ge0 \end{cases}
Md=H(a1−∣D−d∣) whereH(x)={01x<0x≥0
由于 Heaviside step 函数本身不可微,作者使用
H
^
(
x
)
=
1
2
+
1
2
tanh
(
x
)
\hat{H}(x)=\frac{1}{2}+\frac{1}{2}\tanh{(x)}
H^(x)=21+21tanh(x) 代替原来的
H
(
x
)
H(x)
H(x),最终计算 mask 函数更改为:
M
^
d
=
1
2
+
1
2
tanh
(
α
(
1
a
−
∣
D
−
d
∣
)
)
\hat{M}^d=\frac{1}{2}+\frac{1}{2}\tanh\bigg(\alpha\bigg(\frac{1}{a}-|D-d|\bigg)\bigg)
M^d=21+21tanh(α(a1−∣D−d∣))
其中, α \alpha α 控制 Heaviside step 函数的尖锐程度。实验中作者经验性设置 a l p h a = 1 0 3 alpha=10^3 alpha=103。
2.2. 重聚焦结构
为了将立体深度估计和重聚焦结合到
S
t
e
R
e
F
o
SteReFo
SteReFo 中,作者提出了 4 种结构,如下图所示。
第一种(
A
1
A_1
A1),被称为
S
e
q
u
e
n
t
i
a
l
d
e
p
t
h
Sequential depth
Sequentialdepth ,使用上述景深渲染方法将立体网络估计出的视差图进行渲染。第一阶段立体深度估计网络的训练是监督的,而第二阶段景深渲染则无需学习。
第二种( A 2 A_2 A2),是第一种结构的变种,使用端到端的训练方式,利用原图和对应真实的视差图渲染好的景深图作为 GT,训练网络,使用 pixel-wise Euclidean 损失。
第三种( B B B),鉴于立体网络中的 cost volume 已经提供了一个类似于视差分层的表达,作者将 cost volume 的每个 channel 作为 mask M d M^d Md。由于立体网络提取的特征层是原图分辨率的 1/8,作者使用双线性差值上采样,并使用一个网络来优化。训练过程依然使用渲染好的景深图作为 GT,损失函数为 L 2 L_2 L2 损失。这个方法被称作 c o s t v o l u m e r e f i n e m e n t cost volume refinement costvolumerefinement。
第四种( C C C),描述了一个 b l u r r e f i n e m e n t blur refinement blurrefinement 过程,仅将 StereoNet 产生的的深度图恢复为 1/2 分辨率,同时将图像缩放为 1/2 分辨率,做景深渲染,之后上采样渲染后的图到原始分辨率。训练使用的 GT 与损失函数与前两种一样。
3. 实验
实验部分作者对比了上述四种结构的效果,发现第一种
A
1
A_1
A1 方法在可视化效果上要优于其他 3 种,如下图所示。
在定量的指标上,方法
A
1
A_1
A1 也优于其他方法,如下表所示。
作者还将方法应用在视频动态目标的重聚焦上,具体细节见原文。