Henriques, João F., et al. “High-speed tracking with kernelized
correlation filters.” Pattern Analysis and Machine Intelligence, IEEE
Transactions on 37.3 (2015): 583-596.
本文的跟踪方法效果甚好,速度奇高,思想和实现均十分简洁。其中利用循环矩阵进行快速计算的方法尤其值得学习。另外,作者在主页上十分慷慨地给出了各种语言的实现代码。
本文详细推导论文中的一系列步骤,包括论文中未能阐明的部分。请务必先参看这篇简介循环矩阵性质的博客。
思想
一般化的跟踪问题可以分解成如下几步:
- 在 I t I_t It帧中,在当前位置 p t p_t pt附近采样,训练一个回归器。这个回归器能计算一个小窗口采样的响应。
- 在 I t + 1 I_{t+1} It+1帧中,在前一帧位置 p t p_t pt附近采样,用前述回归器判断每个采样的响应。
- 响应最强的采样作为本帧位置 p t + 1 p_{t+1} pt+1。
循环矩阵表示图像块
在图像中,循环位移操作可以用来近似采样窗口的位移。
训练时,围绕着当前位置进行的一系列位移采样可以用二维分块循环矩阵 X X X表示,第ij块表示原始图像下移i行右移j列的结果。类似地,测试时,前一帧结果附近的一系列位移采样也可以用 X X X表示。
这样的 X X X可以利用傅里叶变换快速完成许多线性运算。
线性回归训练提速
此部分频繁用到了循环矩阵的各类性质,请参看这篇博客。
线性回归的最小二乘方法解为:
w = ( X H X + λ I ) − 1 X H y w=\left( X^HX+\lambda I\right)^{-1}X^Hy w=(XHX+λI)−1XHy
根据循环矩阵乘法性质, X H X X^HX XHX的特征值为 x ^ ⊙ x ^ ∗ \hat x \odot \hat x^* x^⊙x^∗。 I I I本身就是一个循环矩阵,其生成向量为 [ 1 , 0 , 0...0 ] [1,0,0...0] [1,0,0...0],这个生成向量的傅里叶变换为全1向量,记为 δ \delta δ。
w = ( F d i a g ( x ^ ⊙ x ^ ∗ ) F H + λ F d i a g ( δ ) F H ) − 1 X H y w=\left( Fdiag(\hat x \odot \hat x^*)F^H+\lambda Fdiag(\delta)F^H\right)^{-1}X^Hy w=(Fdiag(x^⊙x^∗)FH+λFdiag(δ)FH)−1XHy
= ( F d i a g ( x ^ ⊙ x ^ ∗ + λ δ ) F H ) − 1 X H y =\left( Fdiag(\hat x \odot \hat x^*+\lambda\delta)F^H \right)^{-1}X^Hy =(Fdiag(x^⊙x^∗+λδ)FH)−1XHy
根据循环矩阵求逆性质,可以把矩阵求逆转换为特征值求逆。
w = F ⋅ d i a g ( 1 x ^ ⊙ x ^ ∗ + λ δ ) ⋅ F H X H y w=F\cdot diag\left(\frac{1}{\hat x \odot \hat x^*+\lambda\delta} \right) \cdot F^H X^H y w=F⋅diag(x^⊙x^∗+λδ1)⋅FHXHy
w = F ⋅ d i a g ( 1 x ^ ⊙ x ^ ∗ + λ δ ) ⋅ F H ⋅ F d i a g ( x ^ ∗ ) F H ⋅ y w=F\cdot diag\left(\frac{1}{\hat x \odot \hat x^*+\lambda\delta} \right) \cdot F^H \cdot Fdiag(\hat{x}^*)F^H\cdot y w=F⋅diag(x^⊙x^∗+λδ1)⋅FH⋅Fdiag(x^∗)