光流法是进行目标跟踪的传统方法, 参照视频B站进行学习, 做的笔记.
1. 运动场(Motion Field)与光流(Optical Flow)
光流, 顾名思义就是光的流动. 对于图像来说, 什么是光的流动呢? 想象一下摄像头是运动的(目标是运动的也一样), 目标的运动变化其实就是"像素点"的"移动", 因此称为光流, 如下图所示:
如上图所示, 假如摄像头是移动的, 那么这棵树的亮度模式就会发生变化, 那么发生变化的这个趋势实际上就代表了目标的运动.
问题1: 那么, 我们认为的所谓像素点亮度模式的变化和目标真实的运动之间有什么关系呢?
我们把目标真实物理运动在某个观测上的投影(Projection)称为运动场(Motion Field), 例如下图: 目标在往左上方移动, 它在sensor上的投影(也就是我们的观测)也有一个对应的移动方向, 也就是向下移动.
\space
问题2: 运动场和光流是等价的吗?
答案是否定的. 请看以下几种情况:
- 有运动场 无光流 或 有光流, 无运动场
下图的左边, 假设球体是旋转的, 但是光源不动. 是有运动场, 无光流的情形.右边反之, 球体是不动的, 但光源是运动的.
\space
- 光流和运动场并不相等
这个例子更直接. 例如理发店门口的彩灯, 我们知道真实的物理运动是水平向右的, 然而, 如果关注像素亮度的变化, 则光流的方向是向下的, 二者正好垂直.
\space
2. 光流约束方程
我们如何更好地通过光流来估计运动呢?
首先我们要做一些假设, 这样问题才可以进行下去. 我们考虑以下连续的两帧图片:
这张图片中鹰是运动的目标. 我们如果关注其中一个像素
(
x
,
y
)
(x,y)
(x,y), 假定下一帧的位置在
(
x
+
δ
x
,
y
+
δ
y
)
(x+\delta x, y+\delta y)
(x+δx,y+δy), 我们可以得到该像素点的速度(也就是亮度运动模式, 理论上的光流方向):
( u , v ) = ( δ x / δ t , δ y / δ t ) (u,v)=(\delta x/\delta t, \delta y/\delta t) (u,v)=(δx/δt,δy/δt)
假设1 两帧间的对应像素亮度不变
我们认为
δ
t
\delta t
δt足够小, 以至于不会使我们关心的像素点在两帧之间产生亮度变化, 假设亮度用
I
(
⋅
)
I(·)
I(⋅)表示, 有:
I
(
x
,
y
,
t
)
=
I
(
x
+
δ
x
,
y
+
δ
y
,
t
+
δ
t
)
I(x, y, t)=I(x+\delta x, y+\delta y, t+\delta t)
I(x,y,t)=I(x+δx,y+δy,t+δt)
我们对等号右边进行多元函数的Taylor展开, 并忽略二次项及以上的高阶项, 有:
I
(
x
+
δ
x
,
y
+
δ
y
,
t
+
δ
t
)
=
I
(
x
,
y
,
t
)
+
∂
I
∂
x
δ
x
+
∂
I
∂
y
δ
y
+
∂
I
∂
t
δ
t
I(x+\delta x, y+\delta y, t+\delta t)=I(x, y, t)+\frac{\partial I}{\partial x}\delta x+ \frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial t}\delta t
I(x+δx,y+δy,t+δt)=I(x,y,t)+∂x∂Iδx+∂y∂Iδy+∂t∂Iδt
联立上两式, 有:
∂
I
∂
x
δ
x
+
∂
I
∂
y
δ
y
+
∂
I
∂
t
δ
t
=
0
\frac{\partial I}{\partial x}\delta x+ \frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial t}\delta t=0
∂x∂Iδx+∂y∂Iδy+∂t∂Iδt=0
令 δ t → 0 \delta t\rightarrow 0 δt→0. 两边同除 δ t \delta t δt, 有:
∂ I ∂ x δ x δ t + ∂ I ∂ y δ y δ t + ∂ I ∂ t = 0 \frac{\partial I}{\partial x} \frac{\delta x}{\delta t}+ \frac{\partial I}{\partial y} \frac{\delta y}{\delta t}+\frac{\partial I}{\partial t}=0 ∂x∂Iδtδx+∂y∂Iδtδy+∂t∂I=0
式中的 δ x δ t , δ y δ t \frac{\delta x}{\delta t}, \frac{\delta y}{\delta t} δtδx,δtδy分别为光流真值(速度) u , v u,v u,v, 故将上式写为:
I x u + I y v + I t = 0 I_xu+I_yv+I_t=0 Ixu+Iyv+It=0
以上就是光流约束方程.
求解上式中 I x , I y , I t I_x, I_y, I_t Ix,Iy,It的方式与图像处理中求梯度的方式类似, 固定一个变量求其余变量得到差, 例如 I x I_x Ix按如下计算:
\space
好, 现在我们知道了
I
x
,
I
y
,
I
t
I_x, I_y, I_t
Ix,Iy,It, 如果讨论
u
,
v
u,v
u,v平面, 则式
I
x
u
+
I
y
v
+
I
t
=
0
I_xu+I_yv+I_t=0
Ixu+Iyv+It=0
规定了平面上的一条直线. 可是
u
,
v
u,v
u,v都是变量, 我们无法获得准确值.
具体地, 如上图, 假设光流真值为
u
=
(
u
,
v
)
\boldsymbol u=(u,v)
u=(u,v), 我们将其分解为垂直直线方向与平行直线方向
u
=
u
n
+
u
p
\boldsymbol{u}=\boldsymbol{u_n}+\boldsymbol{u_p}
u=un+up.
根据几何知识, 很快求得:
u n = ∣ I t ∣ I x 2 + I y 2 ( I x , I y ) \boldsymbol{u_n}=\frac{|I_t|}{\sqrt{I_x^2+I_y^2}}(I_x, I_y) un=Ix2+Iy2∣It∣(Ix,Iy)
然而, u p \boldsymbol{u_p} up我们不知道, 因此需要更多的约束条件.
3. Lucas Kanade算法
接上文, 我们需要更多的约束条件. Lucas Kanade算法所做的假设是:
假设2 假定对于每个像素, 运动场与光流和其邻域中的像素均相同
假设某像素的某邻域为
W
W
W, 大小为
n
×
n
n \times n
n×n的矩形, 则对于
W
W
W中的每个像素
(
k
,
l
)
∈
W
(k,l)\in W
(k,l)∈W, 光流都相同, 因此有:
I
x
(
k
,
l
)
u
+
I
y
(
k
,
l
)
v
+
I
t
(
k
,
l
)
=
0
,
(
k
,
l
)
∈
W
I_x(k,l)u+I_y(k,l)v+I_t(k,l)=0, (k,l)\in W
Ix(k,l)u+Iy(k,l)v+It(k,l)=0,(k,l)∈W
上面是
n
2
n^2
n2个方程, 我们写为矩阵形式:
[
I
x
(
1
,
1
)
I
y
(
1
,
1
)
.
.
.
.
.
.
I
x
(
n
,
n
)
I
y
(
n
,
n
)
]
[
u
v
]
=
[
−
I
t
(
1
,
1
)
.
.
.
−
I
t
(
n
,
n
)
]
\begin{bmatrix} I_x(1,1) & I_y(1,1) \\ ... & ... \\ I_x(n, n) & I_y(n, n) \end{bmatrix} \begin{bmatrix} u \\ v \\ \end{bmatrix}= \begin{bmatrix} -I_t(1,1) \\ ... \\ -I_t(n, n) \end{bmatrix}
⎣
⎡Ix(1,1)...Ix(n,n)Iy(1,1)...Iy(n,n)⎦
⎤[uv]=⎣
⎡−It(1,1)...−It(n,n)⎦
⎤
记为:
A
u
=
B
,
A
∈
R
n
2
×
2
,
u
=
[
u
,
v
]
T
,
B
∈
R
n
2
×
1
\boldsymbol{Au=B}, A \in \mathbb{R}^{n^2\times 2}, u=[u, v]^T, B\in \mathbb{R}^{n^2\times 1}
Au=B,A∈Rn2×2,u=[u,v]T,B∈Rn2×1
n 2 n^2 n2这个数有点大, 为了计算方便, 我们将方程写为:
(
A
T
A
)
u
=
A
T
B
\boldsymbol{(A^TA)u=A^TB}
(ATA)u=ATB
其中
A
T
A
∈
R
2
×
2
\boldsymbol{A^TA}\in \mathbb{R}^{2\times 2}
ATA∈R2×2. 假设
A
T
A
\boldsymbol{A^TA}
ATA可逆, 有:
u
=
(
A
T
A
)
−
1
A
T
B
\boldsymbol{u=(A^TA)^{-1}A^TB}
u=(ATA)−1ATB
可以看到, 光流估计值本质上就是 n 2 n^2 n2个约束方程 A u = B Au=B Au=B的最小二乘解, 因此就求解出光流了. 然而, LK算法以上的求解方式也有其局限性, 必须要求:
- A T A A^TA ATA可逆.
-
A
T
A
A^TA
ATA必须是well-conditioned. 所谓well-conditioned, 就是指其两个特征值
λ
1
,
λ
2
\lambda_1, \lambda_2
λ1,λ2满足:
二者都不要太接近0, 且
λ 1 ≥ λ 2 \lambda_1 \ge \lambda_2 λ1≥λ2且
不可以 λ 1 > > λ 2 \lambda_1 >> \lambda_2 λ1>>λ2.
weil-conditioned的意义是, 如果特征值都太小, 则求解出的
u
u
u也很小, 结果不可靠.
如果两个特征值相差很大, 则并不能确保具体的运动方向.
4. 粗糙到精细的光流估计(光流金字塔, Coarse to fine estimation)
LK算法有一个先验假设, 即 δ t \delta t δt足够小, 也就是小运动假设. 但如果运动范围很大的时候, 怎么做呢?
我们可以降低图片的分辨率, 例如通过池化的方式, 这样原来的大运动就会变成小运动. 如下图所示.
转化成小运动之后, 我们就可以利用之前的算法求解光流了.
假定我们有四种分辨率, 从低到高是1, 2, 3, 4. 在1分辨率上, 我们利用小运动的估计来计算光流, 假设结果为 ( u , v ) 0 (u,v)^0 (u,v)0.
这样, 我们在2分辨率上利用1分辨率上计算出的光流, 产生一个新的图像(类似于插帧). 这个图像会更接近原始分辨率的运动, 但不精确. 这一步叫做"Wrap".
因此, 同样地我们对插帧后的2分辨率再计算光流, 得到插帧到最终图像的光流变化 Δ ( u , v ) 1 \Delta (u,v)^1 Δ(u,v)1. 因此此时我们可以得到更精确的光流估计 ( u , v ) 1 = ( u , v ) 0 + Δ ( u , v ) 1 (u,v)^1=(u,v)^0+\Delta (u,v)^1 (u,v)1=(u,v)0+Δ(u,v)1. 这一步叫做"Plus".
再对3分辨率上应用此光流插帧, 一直这样下去. 如图所示:
因此, 我们就从粗糙分辨率的小运动, 一步一步估计到了精细分辨率的大运动, 总之是一个Warp+Plus的迭代过程.
5. 相机运动下的场景重构
讨论这个问题的前提是, 假设相机为正交相机(Orthographic Camera), 即无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变。或者说, 相机成像的场景的差异远大于景深, 因此物体的大小不再重要. 这时, 我们希望在相机运动的情况下, 还原2D图像中关键点的3D信息. 如下图所示.
5.0 问题建模
在world coordinate(真实的三维空间中), 假设第 t t t帧相机的坐标为 C f ∈ R 3 C_f\in\mathbb{R}^3 Cf∈R3, 场景中某个关键点的坐标为 P f ∈ R 3 P_f\in\mathbb{R}^3 Pf∈R3, 但相机得到的是2维图像, 假设在成像平面上的坐标为 [ u , v ] T ∈ R 2 [u, v]^T\in\mathbb{R}^2 [u,v]T∈R2, 如下图所示(其中O为world coordinate原点, i , j ∈ R 3 i,j\in\mathbb{R}^3 i,j∈R3为2D成像的单位坐标系的三维向量(在world coordinate中的向量), 代表了相机的朝向(位置)):
则根据几何关系, 有:
u
=
i
T
x
c
v
=
j
T
x
c
x
c
=
P
−
C
u = i^Tx_c\\ v=j^Tx_c \\ x_c = P - C
u=iTxcv=jTxcxc=P−C
所以
u
=
i
T
(
P
−
C
)
,
v
=
j
T
(
P
−
C
)
u = i^T(P-C),~~v=j^T(P-C)
u=iT(P−C), v=jT(P−C)
u
,
v
u,v
u,v我们是知道的, 然而相机的朝向(
i
,
j
i,j
i,j)和真实坐标
P
,
C
P,C
P,C我们都不知道. 那么怎么做才能求解
P
P
P呢?
在这里做一个假设, 假定world coordinate的原点在成像中所有关键点的中心:
∑
p
P
f
,
p
=
0
,
∀
f
\sum_pP_{f,p}=0,~~\forall f
p∑Pf,p=0, ∀f
其中 p p p表示第p个点.
我们考察在这个定义下的2D画面中的中心坐标:
u
‾
f
=
1
∣
P
∣
∑
p
∈
P
u
f
,
p
=
1
∣
P
∣
∑
p
∈
P
i
f
T
(
P
p
−
C
f
)
=
−
1
∣
P
∣
∑
p
∈
P
i
f
T
C
f
=
−
i
f
T
C
f
\overline{u}_f=\frac{1}{|P|}\sum_{p\in P}u_{f, p}\\ =\frac{1}{|P|}\sum_{p\in P}i_f^T(P_p - C_f)\\ =-\frac{1}{|P|}\sum_{p\in P}i_f^T C_f=-i_f^TC_f
uf=∣P∣1p∈P∑uf,p=∣P∣1p∈P∑ifT(Pp−Cf)=−∣P∣1p∈P∑ifTCf=−ifTCf
我们将2D坐标系的原点移动到上述的中心坐标, 则新坐标为
u
^
f
,
p
=
u
f
,
p
−
u
‾
f
=
i
f
T
(
P
p
−
C
f
)
−
(
−
i
f
T
C
f
)
=
i
f
T
P
p
\hat{u}_{f,p}=u_{f,p}-\overline{u}_f\\ = i_f^T(P_p-C_f)-(-i_f^TC_f)=i_f^TP_p
u^f,p=uf,p−uf=ifT(Pp−Cf)−(−ifTCf)=ifTPp
所以, 在以上的假设下, 新坐标与相机的真实位置无关了.
对于 v v v坐标, 同理有 v ^ f , p = j f T P p \hat{v}_{f,p}=j_f^TP_p v^f,p=jfTPp.
现在我们有
F
F
F帧, 假定每个帧都保持
N
N
N个关键点, 每个点有如下关系:
[
u
^
f
,
p
v
^
f
,
p
]
=
[
i
f
T
j
f
T
]
P
p
\begin{bmatrix} \hat{u}_{f,p}\\ \hat{v}_{f,p} \end{bmatrix} = \begin{bmatrix} i_f^T\\ j_f^T \end{bmatrix} P_p
[u^f,pv^f,p]=[ifTjfT]Pp
所以我们可以列出如下方程组:
简洁记为:
W
2
F
×
N
=
M
2
F
×
3
S
3
×
N
W_{2F\times N}=M_{2F\times 3}S_{3\times N}
W2F×N=M2F×3S3×N
方程右边的两个矩阵都是未知的. 下面介绍Tomasi-Kanade方法求解
5.1 问题求解
我们考虑对
W
W
W进行奇异值分解, 看能不能分解成两个矩阵相乘的形式进而定出
M
与
S
M与S
M与S. 设
W
W
W的SVD为:
W
=
U
Σ
V
T
W=U\Sigma V^T
W=UΣVT
显然
rank
(
W
)
≤
3
\text{rank}(W)\le 3
rank(W)≤3, 因此
W
W
W也只有三个非零奇异值, 采取其截断SVD:
W
=
U
1
Σ
′
V
1
T
W=U_1\Sigma' V_1^T
W=U1Σ′V1T
其中
U
1
∈
R
2
F
×
3
,
Σ
′
∈
R
3
×
3
,
V
1
T
∈
R
3
×
N
U_1\in \mathbb{R}^{2F\times 3}, \Sigma' \in \mathbb{R}^{3\times 3}, V_1^T\in \mathbb{R}^{3\times N}
U1∈R2F×3,Σ′∈R3×3,V1T∈R3×N.
我们将 W W W重写为
W
=
U
1
Σ
′
1
/
2
Q
Q
−
1
Σ
′
1
/
2
V
1
T
W=U_1\Sigma'^{1/2}QQ^{-1} \Sigma'^{1/2}V_1^T
W=U1Σ′1/2QQ−1Σ′1/2V1T
其中
Q
∈
R
3
×
3
Q \in \mathbb{R}^{3\times 3}
Q∈R3×3为非奇异矩阵, 令
M
=
U
1
Σ
′
1
/
2
Q
S
=
Q
−
1
Σ
′
1
/
2
V
1
T
M = U_1\Sigma'^{1/2}Q\\ S = Q^{-1} \Sigma'^{1/2}V_1^T
M=U1Σ′1/2QS=Q−1Σ′1/2V1T
现在的问题是求解出
Q
Q
Q, 则都可以计算. 我们注意到, 2D坐标的正交性我们还没有用到.
M
=
U
1
Σ
′
1
/
2
Q
=
[
i
^
1
T
.
.
.
i
^
F
T
]
Q
=
[
i
^
1
T
Q
.
.
.
i
^
F
T
Q
]
M = U_1\Sigma'^{1/2}Q= \begin{bmatrix} \hat{i}_{1}^T\\ ...\\ \hat{i}_{F}^T \end{bmatrix}Q= \begin{bmatrix} \hat{i}_{1}^TQ\\ ...\\ \hat{i}_{F}^TQ \end{bmatrix}
M=U1Σ′1/2Q=⎣
⎡i^1T...i^FT⎦
⎤Q=⎣
⎡i^1TQ...i^FTQ⎦
⎤
因此:
∀ f , i ^ f T Q Q T i ^ f = 1 , ∀ f 1 ≠ f 2 , i ^ f 1 T Q Q T i ^ f 2 = 0 \forall f, ~~\hat{i}_{f}^TQQ^T\hat{i}_{f}=1,\\ \forall f_1\ne f_2, ~~\hat{i}_{f_1}^TQQ^T\hat{i}_{f_2}=0 ∀f, i^fTQQTi^f=1,∀f1=f2, i^f1TQQTi^f2=0
上面共是 3 F 3F 3F个方程, 而 Q Q Q只有九个元素, 因此这是一个超定方程, 用各种方法一定能求解出 Q Q Q. 求解出 Q Q Q之后, 带入到SVD的结果式子, 就可以分别求出 M M M与 S S S.