目录
事件相机有关的论文解读之
A Unifying Contrast Maximization Framework for Event Cameras,with Applications to Motion,Depth,and Optical Flow Estimation
这篇论文是关于事件相机的一篇使用传统做法估计姿态、深度和光流的文章。
关于事件相机:
事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~
对于事件相机还不了解的朋友们可以看我这一系列的另一篇博客:事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域?
这篇论文的地址:http://rpg.ifi.uzh.ch/docs/CVPR18_Gallego.pdf
作者在youtube上上传了项目的视频:https://youtu.be/KFMZFhi-9Aw
那下面就开始叭
前言不必多说,关于事件相机的一些介绍和前人工作的一些总结。
贡献
本文提出了第一个统一的框架,用于解决计算机视觉中事件相机的几个重要估计问题。 简而言之,我们的框架在图像平面上寻找最适合事件数据的点轨迹,并通过这样做,能够恢复描述相机和场景之间的相对运动的参数。 该方法对事件组进行操作,利用它们的时空和极性信息来产生准确的结果。 与一个事件一个事件的处理方法相比,我们的方法不需要其他外加信息,它既可用于特征时间很短的估计问题(光流) ,也可用于估计时间较长的问题(单目深度估计)。我们的框架还隐式地处理事件之间的数据关联,这是基于事件的视觉的核心问题。 此外,该框架生成经过运动校正的事件图像,这些图像近似于引起事件的图像梯度。 这些图像可以作为输入,以更复杂的处理算法,如视觉-惯性数据融合,目标识别等。
解读:
作者贡献中说的很清楚,他整篇论文的所有方法都是基于点轨迹的寻找。同时,作者也说出了基于事件视觉的核心问题,即事件数据之间的关联。说得更简单一点,就是事件是一个时间序列,但它们之间也存在着空间信息,即不同事件点位置。所以在任何一个算法中,提取这些事件(四元组)中的时空信息不言而喻是最重要的。所有我们想要的结果也都隐藏在这些时空信息中。至于最后说的生成运动矫正的事件图像,在能够预测光流后什么都好说了。
下面,作者以举例的形式介绍了在光流估计时,他所提出的基于寻找点轨迹方法的具体操作
例子:光流估计
根据光流的基本假设,作者认为在某一个点的附近极短时间内光流是恒定值。即
x
⃗
(
t
)
=
x
⃗
(
0
)
+
v
⃗
t
\vec x(t)=\vec x(0)+\vec vt
x(t)=x(0)+vt,其中
x
⃗
≐
(
x
,
y
)
T
\vec x\doteq (x,y)^T
x≐(x,y)T。
在估计过程中,我们可以用光流将每一个事件都映射到一个固定的时间
t
r
e
f
t_{ref}
tref(reference time):
x
⃗
k
′
≐
W
(
x
⃗
k
,
t
k
;
θ
⃗
k
)
=
x
⃗
k
−
(
t
k
−
t
r
e
f
)
θ
⃗
\vec x_k'\doteq W(\vec x_k,t_k;\vec \theta_k)=\vec x_k-(t_k-t_{ref})\vec \theta
xk′≐W(xk,tk;θk)=xk−(tk−tref)θ
其中
θ
⃗
=
v
⃗
\vec \theta=\vec v
θ=v即每个像素的速度。这样的话如果我们估计的光流是正确的,那么映射后的事件将有很多重叠。在图像上直观的感受就是去模糊。
那么用什么来评价光流预测正确与否,即模糊的大与小呢,作者提出直接求方差的方法:
H
(
x
⃗
;
θ
⃗
)
≐
∑
k
=
1
N
e
b
k
δ
(
x
⃗
−
x
⃗
k
)
H(\vec x;\vec \theta)\doteq\sum\limits_{k=1}^{N_e}{b_k\delta(\vec x-\vec x_k)}
H(x;θ)≐k=1∑Nebkδ(x−xk)
这个函数H就是把映射后的事件累加成一幅图片,其中
δ
\delta
δ为狄拉克冲激函数。
b
k
b_k
bk可以取1,那么就是对所有事件进行累加。也可以取
b
k
=
p
k
b_k=p_k
bk=pk,即按照极性累加。
f
(
θ
⃗
)
=
σ
2
(
H
(
x
⃗
;
θ
⃗
)
)
≐
1
N
e
∑
i
,
j
(
H
i
j
−
μ
H
)
2
f(\vec \theta)=\sigma^2(H(\vec x;\vec \theta))\doteq\frac{1}{N_e}\sum\limits_{i,j}(H_{ij}-\mu_H)^2
f(θ)=σ2(H(x;θ))≐Ne1i,j∑(Hij−μH)2
这一步就是计算映射后累加图片的方差。可以想象,当随机变量是每个像素上的事件个数时,如果大多数事件都重叠在了他们最初的点上,那么这个分布将遍及0到最大重叠事件数,那么这个分布方差就会很大。而相反如果光流估计不准确,事件很少重叠导致模糊加重,那么事件分散将更散乱,事件个数这个随机变量将只是一些小的数字,分布会更加集中,方差就会更小。
所以作者提出通过最大化这个方差来估计光流,作者遍历所有光流来找到使这个方差取最大的光流值,如下图:
当通过遍历找到最大值时,最大值所对应点的x、y方向速度即为光流的估计值。
最后,作者提出了可以将上面累计图片时候的
δ
\delta
δ函数替换成
δ
s
(
t
)
\delta_s(t)
δs(t),该函数为一个高斯核,也即不是简单地对这个像素点上事件进行累加,每一个像素上的累加结果和这个像素周围的一定范围内的事件有关。这样在累计事件时可以更好地保留空间上的信息。
在得到光流估计值后,就得到了每个像素点在每个时刻的速度,那么相当于得到了事件的轨迹,在之后的姿态、深度估计中,将应用上面得到的轨迹(相当于去模糊)然后使用以下基本框架
基本框架
1、将事件根据点轨迹映射到统一时间( Warp the events into an image H, according to the point trajectories defined by the above-mentioned geometric model and candidate parameters θ. )
2、计算一个分值函数f
3、优化上述分值函数
深度估计
在深度估计上,作者的做法就类似光流估计了,同样在优化一个方差(作者把这个值称为contrast)
作者假设每一时刻的相机位姿
P
(
t
)
P(t)
P(t)是已知的,同样在很短的一段时间内,某一像素点附近的区域里深度应该变化不大,假设深度相同,那么根据位姿和假设深度就可以将后面的事件映射回最初时间上(即reference time)。如果假设的深度是正确的话,事件应该重合,那么图片的方差应该是最大的。写成公式就是:
对每个事件点
e
k
=
(
x
⃗
k
,
t
k
,
p
k
)
e_k=(\vec x_k,t_k,p_k)
ek=(xk,tk,pk),将其映射为
e
k
′
=
(
x
⃗
k
′
,
t
r
e
f
,
p
k
)
e_k'=(\vec x_k',t_{ref},p_k)
ek′=(xk′,tref,pk)
其中
x
⃗
k
′
=
W
(
x
⃗
k
,
P
(
t
k
)
,
P
v
;
θ
)
\vec x_k'=W(\vec x_k,P(t_k),P_v;\theta)
xk′=W(xk,P(tk),Pv;θ)
P
v
≐
P
(
t
r
e
f
)
P_v\doteq P(t_{ref})
Pv≐P(tref)
结果如图:
到此,大家也看出他的套路了,方法就是这样,后面就是在套,也没什么新意了。
个人总结
后面的部分作者还介绍了在纯旋转下的姿态估计,以及在平坦场景下的姿态估计。总的来说,限制还是比较强的,就像深度和光流估计,假设了每一个点在短时间内光流和深度不变,虽说是合理的可以利用的假设,但必定在一定程度上限制了准确率的进一步提高。再如后面的旋转情况和平坦情况,也限制了是纯旋转和平坦,所以相对来说限制还是比较高的。
但是,在现在这个十篇论文九篇深度学习的学术氛围下,还能改进提高经典算法,也是一个相当不错的工作了。
同时,虽说它是经典方法,但它求方差等的操作也能给基于学习的方法提供设计损失函数时一个很好的思路。在后面我将分享的另一篇文章里,作者就利用了这样的启发。