从MOSSE到CSK算是了解相关滤波跟踪的必经之路了。CSK在MOSSE模型的基础上增加了正则项以避免过拟合,提出了分类器的概念,同时引入了循环矩阵和核函数提高运算速率。
答应我,看CSK或者KCF之前,请一定先去看一下SVM(支持向量机)!
顺便指路我学习SVM的整理(https://blog.youkuaiyun.com/qq_32763701/article/details/83859575),如果你看了这个,请跳转算法部分开始看
为什么引入循环矩阵?
很多文章里解释引入循环矩阵是为了利用循环矩阵的特性达到密集采样(dense sampling)和转到频域提高运算效率的目的,但循环矩阵具体是如何达到这一目的我姑且写一下我的理解。
我们回忆一下MOSSE算法里求相关性的操作是通过在怀疑区域里滑动卷积得到的,如果是要求密集采样(而不是随机采样)的话,要求卷积模板在这一区域从第一个像素滑动到最后一个像素,在这一区域产生大量候选窗(这些候选窗重合度还很大),最终目标匹配得到最后的输出结果。这一过程明显计算量巨大,影响跟踪速度。
所以作者引进循环矩阵这个好工具:
第一行为实际采集的目标特征,其他行表示周期性地把最后的矢量依次往前移产生的虚拟目标特征。因为整个循环矩阵都是由 n × 1 n\times 1 n×1 v e c t o r vector vector u ^ \hat{u} u^演变而来,所以循环矩阵不需要空间专门去保存它。这一操作的具体效果作者在15年的KCF算法里做了更直观地解释:
直接利用循环矩阵去和滤波器点乘(后面会解释)很直观地省略了卷积模板在检测区域内滑动的过程,简化了对重合度高的候选窗的运算,提高了速度。
也可以理解为滤波器模板在频域内与样本特征边缘求相关时边界循环补充的结构。
(解释见(https://blog.youkuaiyun.com/qq_17783559/article/details/82321239))
另一方面,如上图所示,循环矩阵对像素的移动产生了目标发生上下位移的结果,可以理解为在这一帧里样本数增加了。更多的样本数意味着训练的结果更准确。
此外,循环矩阵傅里叶对角化特性也是引入循环矩阵重要的原因之一。
根据循环矩阵的特点,存在 u ⊗ v = C ( u ) v = F − 1 ( F ( u ) ⊙ F ( v ) ) u\otimes v=C\left ( u \right )v=F^{-1}\left ( F\left ( u \right )\odot F\left ( v \right )\right ) u⊗v=C(u)v=F−1(F(u)⊙F(v))
利用这一特性证明循环矩阵的和、点积、求逆都是循环矩阵,在频域利用这一特性大大提高了运算速率。
(证明见(https://blog.youkuaiyun.com/shenxiaolu1984/article/details/50884830))
为什么引入核函数?
核函数是模式识别里的一个技巧。我们知道在低维空间中线性不可分的模式可以映射到高维空间实现线性可分,比如:(参考(https://blog.youkuaiyun.com/qq_32763701/article/details/83859575))
其中红线和黑线分别表示两类数据,在二维空间里线性不可分,映射到高维空间后利用二次函数(曲线)实现了可分。
但问题在于,虽然在高维空间实现了线性可分,但一是映射关系难以求解,二是在高维空间运算时,容易导致维数灾难,维数越大,计算量也指数增大。
引入核函数的目的是利用在原空间的核函数的值表示高维空间的向量的內积,简化计算。
在CSK算法的证明中,在将输入函数 x \mathbf{x} x映射到高维空间后,出现高位空间内的內积项 < φ ( x ) , φ ( x ′ ) > <\varphi \left ( \mathbf{x} \right ),\varphi \left ( \mathbf{x'} \right )> <φ(x),φ(x′)>。
核函数要实现的就是令 k ( x , x ′ ) = < φ ( x ) , φ ( x ′ ) > k\left ( \boldsymbol{x},\boldsymbol{x'} \right )=<\varphi \left ( \mathbf{x} \right ),\varphi \left ( \mathbf{x'} \right )> k(x,x′)=<φ(x),φ(x′)>,把高维空间的內积转换为原空间的核函数值。
算法:核化的最小二乘法(KRLS)
首先我们回忆一下MOSSE算法的基本模型
min H ∗ ∑ i ∣ F i ⋅ H ∗ − G i ∣ 2 \min_{H^*}\sum_{i}\left | F_{i}\cdot H^*-G_{i} \right |^{2} minH∗∑i∣Fi⋅H∗−Gi∣2
其中 F i F_{i} Fi是输入图像特征, H ∗ H^* H∗是滤波器, G i G_{i} Gi表示响应,具体推导过程见前一篇文章。相关滤波跟踪·MOSSE算法的梳理
CSK算法在MOSSE模型的基础上将相关用分类器运算表示,并做了一些修改
min w ∑ i L ( y i , f ( x i ) ) + λ ∥ w ∥ 2 \min_{w}\sum_{i}L\left ( y_{i},f\left ( \mathbf{x_{i} }\right ) \right )+\lambda \left \|\mathbf{w} \right \|^2 minw∑iL(yi,f(xi))+λ∥w∥2
嘛,虽然看起来各种不像,但其实化开以后本质还是一样的。
接下来进入推导过程。
一点小tips
首先,我们最好先弄懂几个小数学知识:
1. A A A是一个列向量, ∥ A ∥ 2 = A T ⋅ A \left \| A \right \|^2=A^T\cdot A ∥A∥2=AT⋅A
2. A A A, B B B均为列向量, A T ⋅ B = < A , B > A^T\cdot B =<A,B> AT⋅B=<A,B>
3. S = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + ⋯ + a n b n S=\sum_{i=1}^na_{i}b_{i}=a_{1}b_{1}+a_{2}b_{2}+\cdots +a_{n}b_{n} S=i=1∑naibi=a1b1+a2b2+⋯+anbn
如果 A = [ a 1 a 2 ⋮ a n ] A=\begin{bmatrix} a{1}\\ a_{2}\\ \vdots \\ a_{n} \end{bmatrix} A=⎣⎢⎢⎢⎡a1a2⋮an⎦⎥⎥⎥⎤, B = [ b 1 b 2 ⋮ b n ] B=\begin{bmatrix} b{1}\\ b_{2}\\ \vdots \\ b_{n} \end{bmatrix} B=⎣⎢⎢⎢⎡b1b2⋮bn⎦⎥⎥⎥⎤,则 S = A T ⋅ B S=A^T\cdot B S=AT⋅B
如果 A = [ a 1 a 2 ⋮ a n ] A=\begin{bmatrix} a{1}\\ a_{2}\\ \vdots \\ a_{n} \end{bmatrix} A=⎣⎢⎢⎢⎡a1a2⋮a