读研期间做相关滤波视觉跟踪,读了很多相关滤波的论文,但是由于当年矩阵论和数字信号处理基础太菜,一直没搞明白相关滤波的闭合解是怎么推出来的,各种论文里面的推导都是直接给个结果,过程不详。最近终于搞明白了推导的过程和原理,在这里记录一下。我觉得应该是全网最清晰最易懂的相关滤波推导了。
如果不加说明,以下粗体字 x \mathbf{x} x代表列向量,加帽 x ^ \hat{\mathbf{x}} x^代表 x \mathbf{x} x的傅里叶变换
在推导之前首先回顾几个定理:
循环卷积定理 若 x \mathbf{x} x的傅里叶变换为 x ^ \hat{\mathbf{x}} x^, y \mathbf{y} y的傅里叶变换为 y ^ \hat{\mathbf{y}} y^,则 x \mathbf{x} x与 y \mathbf{y} y的卷积 x ⊗ y \mathbf{x}\otimes\mathbf{y} x⊗y的傅里叶变换为 x ^ \hat{\mathbf{x}} x^与 y ^ \hat{\mathbf{y}} y^的点积 x ^ ⊙ y ^ \hat{\mathbf{x}}\odot\hat{\mathbf{y}} x^⊙y^。
帕斯瓦尔定理
∣
∣
x
∣
∣
2
=
1
N
∣
∣
x
^
∣
∣
2
||\mathbf{x}||^2=\frac{1}{N}||\hat{\mathbf{x}}||^2
∣∣x∣∣2=N1∣∣x^∣∣2
N
N
N为信号长度。
还有一个小结论,信号的反序的傅里叶变换等于原信号傅里叶变换的共轭
证明一下,记
y
\mathbf{y}
y为
x
\mathbf{x}
x的反序,即
y
[
k
]
=
x
[
N
−
k
]
\mathbf{y}[k]=\mathbf{x}[N-k]
y[k]=x[N−k]
y
^
[
k
]
=
∑
n
=
0
N
−
1
x
[
N
−
n
]
e
−
j
2
π
N
n
\hat{\mathbf{y}}[k]=\sum_{n=0}^{N-1}\mathbf{x}[N-n]e^{-j\frac{2\pi}{N}n}
y^[k]=n=0∑N−1x[N−n]e−jN2πn
令
N
−
n
=
t
N-n=t
N−n=t
y
^
[
k
]
=
∑
t
=
0
N
−
1
x
[
t
]
e
−
j
2
π
N
(
N
−
t
)
=
∑
t
=
0
N
−
1
x
[
t
]
e
j
2
π
N
t
=
x
∗
^
[
k
]
\hat{\mathbf{y}}[k]=\sum_{t=0}^{N-1}\mathbf{x}[t]e^{-j\frac{2\pi}{N}(N-t)}\\ =\sum_{t=0}^{N-1}\mathbf{x}[t]e^{j\frac{2\pi}{N}t}=\hat{\mathbf{x}^{*}}[k]
y^[k]=t=0∑N−1x[t]e−jN2π(N−t)=t=0∑N−1x[t]ejN2πt=x∗^[k]
在卷积操作中,信号要经过反褶操作,而信号的互相关没有经过反褶操作,因此则 x \mathbf{x} x与 y \mathbf{y} y的互相关 x ∗ y \mathbf{x}*\mathbf{y} x∗y的傅里叶变换为 x ∗ ^ \hat{\mathbf{x}^{*}} x∗^与 y ^ \hat{\mathbf{y}} y^的点积 x ∗ ^ ⊙ y ^ \hat{\mathbf{x}^{*}}\odot\hat{\mathbf{y}} x∗^⊙y^
有了这几个定理,现在开始推导吧。
相关滤波是要学习一个与
x
\mathbf{x}
x维度相同的滤波器
h
\mathbf{h}
h,使两者的互相关
h
∗
x
\mathbf{h}*\mathbf{x}
h∗x尽量接近目标函数
y
\mathbf{y}
y,使下面的目标函数最小。
E
(
h
)
=
∣
∣
h
∗
x
−
y
∣
∣
2
+
λ
∣
∣
h
∣
∣
2
E(\mathbf{h})=||\mathbf{h}*\mathbf{x}-\mathbf{y}||^2+\lambda||\mathbf{h}||^2
E(h)=∣∣h∗x−y∣∣2+λ∣∣h∣∣2
根据帕斯瓦尔定理,最小化上式相当于最小化
E
(
h
^
)
=
∣
∣
h
^
⊙
x
^
−
y
^
∣
∣
2
+
λ
∣
∣
h
^
∣
∣
2
E(\hat{\mathbf{h}})=||\hat{\mathbf{h}}\odot\hat{\mathbf{x}}-\hat{\mathbf{y}}||^2+\lambda||\hat{\mathbf{h}}||^2
E(h^)=∣∣h^⊙x^−y^∣∣2+λ∣∣h^∣∣2
把点积写成矩阵相乘的形式
E
(
h
^
)
=
∣
∣
d
i
a
g
(
x
^
)
h
^
−
y
^
∣
∣
2
+
λ
∣
∣
h
^
∣
∣
2
E(\hat{\mathbf{h}})=||diag(\hat{\mathbf{x}})\hat{\mathbf{h}}-\hat{\mathbf{y}}||^2+\lambda||\hat{\mathbf{h}}||^2
E(h^)=∣∣diag(x^)h^−y^∣∣2+λ∣∣h^∣∣2
往下推还需要知道几个结论
∣
∣
x
∣
∣
2
=
x
H
x
||\mathbf{x}||^2=\mathbf{x}^H\mathbf{x}
∣∣x∣∣2=xHx
H表示共轭转置
下面这两个结论参见《matrix cookbook》
∂
x
T
A
x
∂
x
=
A
+
A
T
\frac{\partial \mathbf{x^TAx}}{\partial \mathbf{x}}=\mathbf{A+A^T}
∂x∂xTAx=A+AT
∂ x T a ∂ x = ∂ a T x ∂ x = a \frac{\partial \mathbf{x^T a}}{\partial \mathbf{x}}=\frac{\partial \mathbf{a^T x}}{\partial \mathbf{x}}=\mathbf{a} ∂x∂xTa=∂x∂aTx=a
接着往下推
E
(
h
^
)
=
(
d
i
a
g
(
x
^
)
h
^
−
y
^
)
H
(
d
i
a
g
(
x
^
)
h
^
−
y
^
)
+
λ
h
^
H
h
^
=
h
^
H
d
i
a
g
(
x
∗
^
)
d
i
a
g
(
x
^
)
h
^
−
h
^
H
d
i
a
g
(
x
∗
^
)
y
^
−
y
^
H
d
i
a
g
(
x
^
)
h
^
+
y
^
H
y
^
+
λ
h
^
H
h
^
E(\hat{\mathbf{{h}}})=(diag(\hat{\mathbf{x}})\hat{\mathbf{h}}-\hat{\mathbf{y}})^H(diag(\hat{\mathbf{x}})\hat{\mathbf{h}}-\hat{\mathbf{y}})+\lambda \hat{\mathbf{h}}^H \hat{\mathbf{h}}\\ =\hat{\mathbf{h}}^Hdiag(\hat{\mathbf{x}^*})diag(\hat{\mathbf{x}})\hat{\mathbf{h}}-\hat{\mathbf{h}}^Hdiag(\hat{\mathbf{x}^*})\hat{\mathbf{y}}-\hat{\mathbf{y}}^Hdiag(\hat{\mathbf{x}})\hat{\mathbf{h}}+\hat{\mathbf{y}}^H\hat{\mathbf{y}}+\lambda \hat{\mathbf{h}}^H\hat{\mathbf{h}}
E(h^)=(diag(x^)h^−y^)H(diag(x^)h^−y^)+λh^Hh^=h^Hdiag(x∗^)diag(x^)h^−h^Hdiag(x∗^)y^−y^Hdiag(x^)h^+y^Hy^+λh^Hh^
将目标函数对
h
^
\hat{\mathbf{h}}
h^求偏导(共轭转置和转置不太一样,但是验证一下也是成立的,不太严谨地求个导)
∂
E
(
h
^
)
∂
h
^
=
2
d
i
a
g
(
x
∗
^
⊙
x
^
)
h
^
−
2
d
i
a
g
(
x
∗
^
)
y
^
+
2
λ
h
^
\frac{\partial E(\hat{\mathbf{h}})}{\partial \hat{\mathbf{h}}}=2diag(\hat{\mathbf{x}^{*}}\odot{\hat{\mathbf{x}}})\hat{\mathbf{h}}-2diag(\hat{\mathbf{x}^{*}})\hat{\mathbf{y}}+2\lambda \hat{\mathbf{h}}
∂h^∂E(h^)=2diag(x∗^⊙x^)h^−2diag(x∗^)y^+2λh^
令
∂
E
(
h
^
)
∂
h
^
=
0
\frac{\partial E(\hat{\mathbf{h}})}{\partial \hat{\mathbf{h}}}=0
∂h^∂E(h^)=0,解得
h
^
=
(
d
i
a
g
(
x
∗
^
⊙
x
^
)
+
λ
I
)
−
1
d
i
a
g
(
x
∗
^
)
y
^
=
x
∗
^
⊙
y
^
x
∗
^
⊙
x
^
+
λ
\hat{\mathbf{h}}=(diag(\hat{\mathbf{x}^{*}}\odot{\hat{\mathbf{x}}})+\lambda I)^{-1}diag(\hat{\mathbf{x}^{*}})\hat{\mathbf{y}}\\ =\frac{\hat{\mathbf{x}^{*}}\odot\hat{\mathbf{y}}}{\hat{\mathbf{x}^{*}}\odot{\hat{\mathbf{x}}}+\lambda}
h^=(diag(x∗^⊙x^)+λI)−1diag(x∗^)y^=x∗^⊙x^+λx∗^⊙y^
这就是论文里常见的那个公式的由来了。
多通道情况的推导参见fDSST论文的附录,利用了每个像素之间的独立性。
另外 Henriques的KCF论文[2]里是利用循环矩阵傅里叶变换对角化的性质去推导的,很多博主的推导都指出原论文推导结果错误,推出的滤波器结果是
w
^
=
x
^
⊙
y
^
x
∗
^
⊙
x
^
+
λ
\hat{\mathbf{w}}=\frac{\hat{\mathbf{x}}\odot\hat{\mathbf{y}}}{\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}}+\lambda}
w^=x∗^⊙x^+λx^⊙y^
分母上的
x
^
\hat{\mathbf{x}}
x^没有共轭,而且从论文的附录5的推导看,确实推不到式(57),后来看了一下作者的学位论文,推导这个公式的起点不是论文中带有共轭转置的(3)式,而是论文的(2)式。
w
=
(
X
T
X
+
λ
I
)
−
1
X
T
y
\mathbf{w}=(X^TX+\lambda I)^{-1}X^Ty
w=(XTX+λI)−1XTy
也就是说样本矩阵
X
X
X学习到的滤波器
w
\mathbf{w}
w在空域中都是实数。
回顾一下论文里的样本矩阵
X
=
C
(
x
)
=
[
x
1
x
2
x
3
⋯
x
n
x
n
x
1
x
2
⋯
x
n
−
1
x
n
−
1
x
n
x
1
⋯
x
n
−
2
⋮
⋮
⋮
⋱
⋮
x
2
x
3
x
4
⋯
x
1
]
X=C(\mathbf{x})=\left[\begin{array}{ccccc}{x_{1}} & {x_{2}} & {x_{3}} & {\cdots} & {x_{n}} \\ {x_{n}} & {x_{1}} & {x_{2}} & {\cdots} & {x_{n-1}} \\ {x_{n-1}} & {x_{n}} & {x_{1}} & {\cdots} & {x_{n-2}} \\ {\vdots} & {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {x_{2}} & {x_{3}} & {x_{4}} & {\cdots} & {x_{1}}\end{array}\right]
X=C(x)=⎣⎢⎢⎢⎢⎢⎡x1xnxn−1⋮x2x2x1xn⋮x3x3x2x1⋮x4⋯⋯⋯⋱⋯xnxn−1xn−2⋮x1⎦⎥⎥⎥⎥⎥⎤
再使用这个性质
X
=
F
d
i
a
g
(
x
^
)
F
H
X=F diag(\hat{\mathbf{x}})F^{H}
X=Fdiag(x^)FH
这个时候发现
X
T
X^T
XT的第一行正好是
x
\mathbf{x}
x的倒序,因此它的傅里叶变换为
x
∗
^
\hat{\mathbf{x}^*}
x∗^, 所以
X
T
X
=
F
d
i
a
g
(
x
∗
^
)
F
H
F
d
i
a
g
(
x
^
)
F
H
=
F
d
i
a
g
(
x
∗
^
⊙
x
^
)
F
H
X^TX=Fdiag(\hat{\mathbf{x}^*})F^HFdiag(\hat{\mathbf{x}})F^H=Fdiag(\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}})F^H
XTX=Fdiag(x∗^)FHFdiag(x^)FH=Fdiag(x∗^⊙x^)FH
再代入上面的式子
w
=
(
F
d
i
a
g
(
x
∗
^
⊙
x
^
)
F
H
+
λ
F
F
H
)
−
1
F
d
i
a
g
(
x
∗
^
)
F
H
y
=
F
d
i
a
g
(
1
x
∗
^
⊙
x
^
+
λ
)
F
H
F
d
i
a
g
(
x
∗
^
)
F
H
y
=
F
d
i
a
g
(
x
^
x
∗
^
⊙
x
^
+
λ
)
y
∗
^
\mathbf{w}=(Fdiag(\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}})F^H+\lambda FF^H)^{-1}Fdiag(\hat{\mathbf{x}^*})F^H\mathbf{y}\\ =Fdiag(\frac{1}{\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}}+\lambda})F^{H}Fdiag(\hat{\mathbf{x}^*})F^H\mathbf{y}\\ =Fdiag(\frac{\hat{\mathbf{x}}}{\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}}+\lambda})\hat{\mathbf{y}^*}
w=(Fdiag(x∗^⊙x^)FH+λFFH)−1Fdiag(x∗^)FHy=Fdiag(x∗^⊙x^+λ1)FHFdiag(x∗^)FHy=Fdiag(x∗^⊙x^+λx^)y∗^
两边乘
F
H
F^H
FH
w
^
∗
=
d
i
a
g
(
x
^
x
∗
^
⊙
x
^
+
λ
)
y
∗
^
\hat{\mathbf{w}}^*=diag(\frac{\hat{\mathbf{x}}}{\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}}+\lambda})\hat{\mathbf{y}^*}
w^∗=diag(x∗^⊙x^+λx^)y∗^
两边取共轭
w
^
=
x
∗
^
⊙
y
^
x
∗
^
⊙
x
^
+
λ
\hat{\mathbf{w}}=\frac{\hat{\mathbf{x}^{*}}\odot\hat{\mathbf{y}}}{\hat{\mathbf{x}^*}\odot\hat{\mathbf{x}}+\lambda}
w^=x∗^⊙x^+λx∗^⊙y^
结果相同,因此原论文结果正确,只是推导过程错误。
记录一点自己的理解,希望可以帮到大家。
参考博文
MOSSE(DSST)类和KCF类中滤波器推导结果不一致的解释
参考文献
[1] Petersen K B, Pedersen M S The Matrix Cookbook book
[2] Danelljan M , Häger, Gustav, Khan F S , et al. Discriminative Scale Space Tracking[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2016, 39(8):1561-1575. paper
[3] Henriques J F, Rui C, Martins P, et al. High-Speed Tracking with Kernelized Correlation Filters[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2015, 37(3):583-596. paper