KCF中的循环矩阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KCF 中的循环矩阵
在学习KCF ⽬标跟踪算法时,会⽤到⼀个数学概念:循环矩阵,其对KCF 的速度提升起到了⾮常关键的作⽤,值得了解下。
1. 傅⾥叶矩阵(DFT Matrix)
在了解循环矩阵的定义前,需要先了解下离散傅⾥叶矩阵:
2. 循环矩阵定义
形状如下的矩阵X 称为循环矩阵,x 为循环矩阵X 的⽣成向量,为矩阵第⼀⾏, 其他⾏都是x 向右循环位移得到。
X =C (x )=x 1x 2x 3x 4
x 4x 1x 2x 3x 3x 4x 1x 2
x 2x 3x 4x 1通过x ⽣成X , 可以由排列矩阵和x 相乘,连续平移x 得到,⽰例代码如下:
import numpy as np
x = np.array(
[[1, 2, 3, 4]]
)
P = np.array(
[[0, 0, 0, 1],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]
)
X = np.zeros((4, 4))
X[0, :] = x
for i in range(1, 4):
X[i, :] = np.dot(P, X[i-1, :]).T # 排列矩阵P 每作⽤⼀次x ,x 向右移动⼀位
print(X)
输出:
[[1. 2. 3. 4.]
[4. 1. 2. 3.]
[3. 4. 1. 2.]
[2. 3. 4. 1.]]
[]
3. 循环矩阵性质
循环矩阵很多优秀的性质,其中最重要的⼏个性质为如下:
1. 任意循环矩阵可以被傅⾥叶变换矩阵对⾓化
⼀般⽤如下⽅式表达这⼀概念:
X=C(x)=F⋅diag(ˆx)⋅F H
其中X是⼀个循环矩阵,x是X的⽣成向量, ˆx(读作x hat)为原向量x的傅⾥叶变换;F是傅⾥叶变换矩阵,F H表⽰共轭转置: F H=(F∗)T。
换句话说,X 相似于对⾓阵,X的特征值是ˆx的元素。
另⼀⽅⾯,如果⼀个矩阵能够表⽰成两个傅⾥叶矩阵夹⼀个对⾓阵的乘积形式,则它是⼀个循环矩阵。
其⽣成向量是对⾓元素的傅⾥叶逆变换:
F⋅diag(y)⋅F H=C(−1(y)),(−1(y)表⽰y的傅⾥叶逆变换)
2. 循环矩阵乘向量等价于⽣成向量的逆序和该向量卷积
数学表⽰如下:
(Xy)=(C(x)y)=(¯x∗y)=∗(x)⊙(y)
这⾥¯x表⽰x的逆序排列,∗表⽰卷积。
注意:卷积本⾝也包含逆序操作。
此外,这⾥最后⼀个等号利⽤了信号与系统中的“时域卷积,频域相乘”,即时域卷积定理,它表明两信号在时域的卷积积分对应于在频域中该两信号的傅⾥叶变换的乘积。
3. 循环矩阵的乘积仍是循环矩阵,可以以较低的复杂度计算循环矩阵的乘积
数学表⽰如下:
X H X=F⋅diag(ˆx⊙ˆx∗)⋅F H=C(−1(ˆx⊙ˆx∗))
公式中最终所得的乘积也是循环矩阵,其⽣成向量是原⽣成向量对位相乘的傅⾥叶逆变换。
以K表⽰的是矩阵的尺⼨,可以发现计算速度提升⾮常明显, KCF主要就是利⽤了这条性质:
原始计算量:两个⽅阵相乘O(K3)
转化后的计算量:反向傅⾥叶O(Klog(K))+向量点乘(K)
在⾮线形的情况下,当引⼊了核之后,也可以得到同样的⼀个情况。
此时需要这个核满⾜⼀定的条件,它是可以具备循环矩阵的⼀些性质的,例如常⽤的⾼斯核、线性核都满⾜这个条件,因此可以直接拿来⽤。
4. KCF中的循环矩阵
关于KCF的理论推导有很多⽂章描述了,请参考:
4.1核矩阵K是循环矩阵
在上述KCF的理论推导中有⼀个前提:即下⾯表达式中的核矩阵K是循环矩阵
优化函数最优解:α=(ϕ(X)Tϕ(X)+λI)−1y=(K+λI)−1y
这个前提条件是怎么来的呢?满⾜什么条件时K是循环矩阵呢?
K为核矩阵,其形式如下:(若X为nxm的矩阵,表⽰有n条数据,每⼀条数据的维度为m, 那么对应的核矩阵为nxn的矩阵,每⼀个元素表⽰两条数据的内积)
核矩阵K=k(x1,x1)k(x1,x2)…k(x1,x n)
k(x2,x1)k(x2,x2)…k(x2,x n)
⋮⋮⋮
k(x n,x1)k(x n,x2)…k(x n,x n)
=
ϕ(x1)ϕ(x1)ϕ(x1)ϕ(x2)…ϕ(x1)ϕ(x n)
ϕ(x2)ϕ(x1)ϕ(x2)ϕ(x2)…ϕ(x2)ϕ(x n)
⋮⋮⋮
ϕ(x n)ϕ(x1)ϕ(x n)ϕ(x2)…ϕ(x n)ϕ(x n)
=ϕ(X)ϕ(X)T
K为循环矩阵的条件就是X为循环矩阵,通过循环矩阵的⼏条性质可以得到:
循环矩阵的转置是循环矩阵: 若X是循环矩阵,X T也是循环矩阵
循环矩阵乘以循环矩阵,还是循环矩阵:X和X T都是循环矩阵,则XX T也是循环矩阵
相⽐于XX T,ϕ(X)ϕ(X)T多了⼀层核函数,但对于满⾜⼀定条件的核函数,⾼斯核,多项式核,对应的矩阵仍然是循环矩阵我们可以举个例⼦验证下,测试代码和结果如下:
def GaussianKernel(X, Y, gamma=1.0):
n = X.shape[0]
ret = np.zeros((n, n))
[][]
for i in range(n):
for j in range(n):
ret[i,j] = np.sum(np.power((X[i, :] - Y[:, j].T), 2))
ret = np.exp(ret/(-2*gamma*gamma))
return ret
def recycle_matrix():
X = np.array(
[[1, 2, 3, 4],
[4, 1, 2, 3],
[3, 4, 1, 2],
[2, 3, 4, 1]]
)
print("*********X*********")
print(X)
print("*********X^TX*********")
print(np.dot(X, X.T))
print("*********K*********")
K = GaussianKernel(X, X.T)
print(K)
# 调⽤sklearn中的⾼斯核函数
# from sklearn.gaussian_process.kernels import RBF
# kernel = RBF()
# K = kernel(X, X.T)
# print(K)
if __name__ == "__main__":
recycle_matrix()
4.2 样本X是循环矩阵
上⾯已经得到:样本X是循环矩阵,则核矩阵K是循环矩阵的。
那么X怎样才能成为循环矩阵呢?论⽂中描述如下:
⼀维样本构成循环矩阵
论⽂中,作者先⽤⼀维样本举例,如下图所⽰,循环矩阵的⽣成向量(base sample)是⼀个⼀维的向量(1*m),这个向量向右循环移动n-1次,⽣成n-1个向量,所有向量组成⼀个nxm的循环矩阵
⼆维样本构成循环矩阵
论⽂接下来以⼆维样本为例,如下图所⽰,循环矩阵的⽣成向量是⼀张⼆维图⽚(假设为m*m),每移动⼀次就会⽣成⼀个mxm的矩阵,所有这些mxm 的矩阵最后拼接起来组成⼀个⼤的循环矩阵,下⾯是其移动⽰例过程:
这⾥是⼀个循环图⽚的⽰例,使⽤base sample,若我们向下移动15个像素,也就是从下⾯剪切15个像素拼到上⾯,就会变成左⼆图,若移动30个就可以⽣成左⼀图,右侧的图⽚是上移⽣成的。
这就是在做tracking时循环采样的样本,⼀般会在⽬标周围取⼀个⽐⽬标更⼤的⼀个框,然后对⼤框框取的图像区域进⾏循环采样,那么就会⽣成这样⼀些新的样本来模拟我们的正样本并⽤于训练
参考:
Processing math: 100%。