【目标跟踪】KCF高速跟踪详解
2017-04-21 20:01
232 查看
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.
本文的跟踪方法效果甚好,速度奇高,思想和实现均十分简洁。其中利用循环矩阵进行快速计算的方法尤其值得学习。另外,作者在主页上十分慷慨地给出了各种语言的实现代码。
本文详细推导论文中的一系列步骤,包括论文中未能阐明的部分。请务必先参看这篇简介循环矩阵性质的博客。
一般化的跟踪问题可以分解成如下几步:
1. 在It帧中,在当前位置pt附近采样,训练一个回归器。这个回归器能计算一个小窗口采样的响应。
2. 在It+1帧中,在前一帧位置pt附近采样,用前述回归器判断每个采样的响应。
3. 响应最强的采样作为本帧位置pt+1。
在图像中,循环位移操作可以用来近似采样窗口的位移。
训练时,围绕着当前位置进行的一系列位移采样可以用二维分块循环矩阵X表示,第ij块表示原始图像下移i行右移j列的结果。类似地,测试时,前一帧结果附近的一系列位移采样也可以用X表示。
这样的X可以利用傅里叶变换快速完成许多线性运算。
此部分频繁用到了循环矩阵的各类性质,请参看这篇博客。
线性回归的最小二乘方法解为:
w=(XHX+λI)−1XHy
根据循环矩阵乘法性质,XHX的特征值为x^⊙x^∗。I本身就是一个循环矩阵,其生成向量为[1,0,0...0],这个生成向量的傅里叶变换为全1向量,记为δ。
w=(Fdiag(x^⊙x^∗)FH+λFdiag(δ)FH)−1XHy
=(Fdiag(x^⊙x^∗+λδ)FH)−1XHy
根据循环矩阵求逆性质,可以把矩阵求逆转换为特征值求逆。
w=F⋅diag(1x^⊙x^∗+λδ)⋅FHXHy
w=F⋅diag(1x^⊙x^∗+λδ)⋅FH⋅Fdiag(x^∗)FH⋅y
利用F的酉矩阵性质消元:
w=F⋅diag(x^∗x^⊙x^∗+λδ)⋅FH⋅y
分号表示用1进行对位相除。
反用对角化性质:Fdiag(y)FH=C(F−1(y)),上式的前三项还是一个循环矩阵。
w=C(F−1(x^∗x^⊙x^∗+λδ))⋅y
利用循环矩阵卷积性质F(C(x)⋅y)=x^∗⊙y^:
F(w)=(x^∗x^⊙x^∗+λδ)∗⊙F(y)
由于x^⊙x^∗的每个元素都是实数,所以共轭不变:
F(w)=x^x^⊙x^∗+λδ⊙F(y)=x^⊙y^x^⊙x^∗+λδ
论文中,最后这一步推导的分子部分写成x^∗⊙y^,是错误的。但代码中没有涉及。
线性回归系数ω可以通过向量的傅里叶变换和对位乘法计算得到。
不熟悉核方法的同学可以参看这篇博客的简单说明。核回归方法的回归式为:
f(z)=αTκ(z)
其中κ(z)表示测试样本z和所有训练样本的核函数。参数有闭式解:
α=(K+λI)−1y
K为所有训练样本的核相关矩阵:Kij=κ(xi,xj)。如果核函数选择得当,使得x内部元素顺序更换不影响核函数取值,则可以保证K也是循环矩阵。以下核都满足这样的条件:
设核相关矩阵的生成向量是k。推导和之前线性回归的套路非常类似:
α=(Fdiag(k^)FH+Fdiag(λδ)FH)−1y=(Fdiag(k^+λδ)FH)−1y
=Fdiag(1k^+λδ)FHy=C(F−1(1k^+λδ))y
利用循环矩阵卷积性质F(C(x)⋅y)=x^∗⊙y^:
α^=(1k^+λδ)∗⊙y^
这里k是核相关矩阵的第一行,表示原始生成向量x0和移位了i的向量xi的核函数。考察其处于对称位置上的两个元素:
ki=κ(x0,xi),kN−i=κ(x0,xN−i)
两者都是同一个向量和自身位移结果进行运算。因为所有涉及到的核函数都只和位移的绝对值有关,所以ki=kN−i,即k是对称向量。
举例:x0=[1,2,3,4],x1=[4,1,2,3],x3=[2,3,4,1]。使用多项式核κ(x,y)=xTy,容易验证κ(x0,x1)=κ(x0,x3)。
对称向量的傅里叶变换为实数,有:
α^=(1k^+λδ)⊙y^=y^k^+λδ
论文中,利用k的对称性消除共轭的步骤没有提及。
线性回归系数α可以通过向量的傅里叶变换和对位乘法计算得到。
所有待检测样本和所有训练样本的核相关矩阵为K,每一列对应一个待测样本。可以一次计算所有样本的响应(N×1向量):
y′=KTα
利用循环矩阵的转置性质性质,C(k)的特征值为k^∗:
y′=C(k)T⋅α=C(k^∗)⋅α=k∗∗α
利用循环矩阵的卷积性质:
y′=(k∗)∗α=k∗α
两边傅里叶变换:
y′^=k^⊙α^
论文中,利用转置消除共轭的步骤没有提及。
所有侯选块的检测响应可以通过向量的傅里叶变换和对位乘法计算得到。
无论训练还是检测,都需要计算核相关矩阵K的生成向量k。除了直接计算每一个核函数,在某些特定的核函数下可以进一步加速。
κ(x,y)=f(xTy)
其中f为多项式函数。写成矩阵形式:
K=f(XTY)
f在矩阵的每个元素上单独进行。根据循环矩阵性质,XTY也是一个循环矩阵,其生成向量为F−1(y^⊙x^∗)。所以核相关矩阵的生成向量为:
k=f(F−1(y^⊙x^∗))
κ(x,y)=f(||x−y||2)
其中f是线性函数。简单展开:
κ(x,y)=f(||x−y||2)=f(||x||2+||y||2+2xTy)
由于X中的所有x都通过循环移位获得,故||x||2对于所有x是常数,同理||y||2也是。所以核相关矩阵的生成向量为:
k=f(||x||2+||y||2+F−1(y^⊙x^∗))
有一些核函数,虽然能保证K是循环矩阵,但无法直接拆解出其特征值,快速得到生成向量。比如Hellinger核:∑ixiyi−−−−√,Intersection核:∑imin(xi,yi)。
在多通道情况下(例如使用了HOG特征),生成向量x变成M×L,其中M是样本像素数,L是特征维度。在上述所有计算中,需要更改的只有向量的内积:
xTy=∑l(xl)Tyl
注:非常感谢GX1415926535和大家的帮助,发现原文一处错误。(21)式中不应有转置,应为:
f(z)=Kzα
correlation filters.” Pattern Analysis and Machine Intelligence, IEEE
Transactions on 37.3 (2015): 583-596.
本文的跟踪方法效果甚好,速度奇高,思想和实现均十分简洁。其中利用循环矩阵进行快速计算的方法尤其值得学习。另外,作者在主页上十分慷慨地给出了各种语言的实现代码。
本文详细推导论文中的一系列步骤,包括论文中未能阐明的部分。请务必先参看这篇简介循环矩阵性质的博客。
思想
一般化的跟踪问题可以分解成如下几步:1. 在It帧中,在当前位置pt附近采样,训练一个回归器。这个回归器能计算一个小窗口采样的响应。
2. 在It+1帧中,在前一帧位置pt附近采样,用前述回归器判断每个采样的响应。
3. 响应最强的采样作为本帧位置pt+1。
循环矩阵表示图像块
在图像中,循环位移操作可以用来近似采样窗口的位移。训练时,围绕着当前位置进行的一系列位移采样可以用二维分块循环矩阵X表示,第ij块表示原始图像下移i行右移j列的结果。类似地,测试时,前一帧结果附近的一系列位移采样也可以用X表示。
这样的X可以利用傅里叶变换快速完成许多线性运算。
线性回归训练提速
此部分频繁用到了循环矩阵的各类性质,请参看这篇博客。线性回归的最小二乘方法解为:
w=(XHX+λI)−1XHy
根据循环矩阵乘法性质,XHX的特征值为x^⊙x^∗。I本身就是一个循环矩阵,其生成向量为[1,0,0...0],这个生成向量的傅里叶变换为全1向量,记为δ。
w=(Fdiag(x^⊙x^∗)FH+λFdiag(δ)FH)−1XHy
=(Fdiag(x^⊙x^∗+λδ)FH)−1XHy
根据循环矩阵求逆性质,可以把矩阵求逆转换为特征值求逆。
w=F⋅diag(1x^⊙x^∗+λδ)⋅FHXHy
w=F⋅diag(1x^⊙x^∗+λδ)⋅FH⋅Fdiag(x^∗)FH⋅y
利用F的酉矩阵性质消元:
w=F⋅diag(x^∗x^⊙x^∗+λδ)⋅FH⋅y
分号表示用1进行对位相除。
反用对角化性质:Fdiag(y)FH=C(F−1(y)),上式的前三项还是一个循环矩阵。
w=C(F−1(x^∗x^⊙x^∗+λδ))⋅y
利用循环矩阵卷积性质F(C(x)⋅y)=x^∗⊙y^:
F(w)=(x^∗x^⊙x^∗+λδ)∗⊙F(y)
由于x^⊙x^∗的每个元素都是实数,所以共轭不变:
F(w)=x^x^⊙x^∗+λδ⊙F(y)=x^⊙y^x^⊙x^∗+λδ
论文中,最后这一步推导的分子部分写成x^∗⊙y^,是错误的。但代码中没有涉及。
线性回归系数ω可以通过向量的傅里叶变换和对位乘法计算得到。
核回归训练提速
不熟悉核方法的同学可以参看这篇博客的简单说明。核回归方法的回归式为:f(z)=αTκ(z)
其中κ(z)表示测试样本z和所有训练样本的核函数。参数有闭式解:
α=(K+λI)−1y
K为所有训练样本的核相关矩阵:Kij=κ(xi,xj)。如果核函数选择得当,使得x内部元素顺序更换不影响核函数取值,则可以保证K也是循环矩阵。以下核都满足这样的条件:
设核相关矩阵的生成向量是k。推导和之前线性回归的套路非常类似:
α=(Fdiag(k^)FH+Fdiag(λδ)FH)−1y=(Fdiag(k^+λδ)FH)−1y
=Fdiag(1k^+λδ)FHy=C(F−1(1k^+λδ))y
利用循环矩阵卷积性质F(C(x)⋅y)=x^∗⊙y^:
α^=(1k^+λδ)∗⊙y^
这里k是核相关矩阵的第一行,表示原始生成向量x0和移位了i的向量xi的核函数。考察其处于对称位置上的两个元素:
ki=κ(x0,xi),kN−i=κ(x0,xN−i)
两者都是同一个向量和自身位移结果进行运算。因为所有涉及到的核函数都只和位移的绝对值有关,所以ki=kN−i,即k是对称向量。
举例:x0=[1,2,3,4],x1=[4,1,2,3],x3=[2,3,4,1]。使用多项式核κ(x,y)=xTy,容易验证κ(x0,x1)=κ(x0,x3)。
对称向量的傅里叶变换为实数,有:
α^=(1k^+λδ)⊙y^=y^k^+λδ
论文中,利用k的对称性消除共轭的步骤没有提及。
线性回归系数α可以通过向量的傅里叶变换和对位乘法计算得到。
核回归检测提速
所有待检测样本和所有训练样本的核相关矩阵为K,每一列对应一个待测样本。可以一次计算所有样本的响应(N×1向量):y′=KTα
利用循环矩阵的转置性质性质,C(k)的特征值为k^∗:
y′=C(k)T⋅α=C(k^∗)⋅α=k∗∗α
利用循环矩阵的卷积性质:
y′=(k∗)∗α=k∗α
两边傅里叶变换:
y′^=k^⊙α^
论文中,利用转置消除共轭的步骤没有提及。
所有侯选块的检测响应可以通过向量的傅里叶变换和对位乘法计算得到。
核相关矩阵计算提速
无论训练还是检测,都需要计算核相关矩阵K的生成向量k。除了直接计算每一个核函数,在某些特定的核函数下可以进一步加速。
多项式核
κ(x,y)=f(xTy)其中f为多项式函数。写成矩阵形式:
K=f(XTY)
f在矩阵的每个元素上单独进行。根据循环矩阵性质,XTY也是一个循环矩阵,其生成向量为F−1(y^⊙x^∗)。所以核相关矩阵的生成向量为:
k=f(F−1(y^⊙x^∗))
RBF核
κ(x,y)=f(||x−y||2)其中f是线性函数。简单展开:
κ(x,y)=f(||x−y||2)=f(||x||2+||y||2+2xTy)
由于X中的所有x都通过循环移位获得,故||x||2对于所有x是常数,同理||y||2也是。所以核相关矩阵的生成向量为:
k=f(||x||2+||y||2+F−1(y^⊙x^∗))
其他核
有一些核函数,虽然能保证K是循环矩阵,但无法直接拆解出其特征值,快速得到生成向量。比如Hellinger核:∑ixiyi−−−−√,Intersection核:∑imin(xi,yi)。
多通道
在多通道情况下(例如使用了HOG特征),生成向量x变成M×L,其中M是样本像素数,L是特征维度。在上述所有计算中,需要更改的只有向量的内积:xTy=∑l(xl)Tyl
注:非常感谢GX1415926535和大家的帮助,发现原文一处错误。(21)式中不应有转置,应为:
f(z)=Kzα
相关文章推荐
- 【目标跟踪】KCF高速跟踪详解
- KCF高速跟踪详解
- 目标跟踪算法——KCF入门详解
- KCF高速跟踪详解
- KCF高速跟踪详解
- KCF目标跟踪算法笔记
- 目标跟踪KCF算法一些介绍
- opencv2 camshift目标跟踪详解及测试代码
- 同一窗口下基于KCF 目标跟踪和基于模板匹配的目标跟踪效果比较
- KCF目标跟踪方法分析与总结
- KCF目标跟踪方法分析与总结
- 目标跟踪:KCF
- KCF目标跟踪方法分析与总结
- KCF目标跟踪方法分析与总结
- 目标跟踪:KCF--调通C++代码
- 目标跟踪算法学习笔记之一:KCF
- 目标跟踪:KCF代码分析(matlab版本)
- 目标跟踪:KCF运行流程图(matlab版本)
- KCF目标跟踪算法介绍
- KCF目标跟踪方法总结与分析