本文主要记录KCF tracker算法原理
KCF Tracker
Created 2020.11.11 by Cong Yu; Last modified: 2022.09.15-v1.0.0
Contact: windmillyucong@163.com
Copyleft! 2022 Cong Yu. Some rights reserved.
References
- OpenCV Modules Tracking API
- paper KCF paper
论文总结
基本信息
- 标题: High-Speed Tracking with Kernelized Correlation Filters
- 作者: João F. Henriques, Rui Caseiro, Pedro Martins, Jorge Batista
- 发表: 2014年4月30日提交至arXiv,最终版本2014年11月5日
- DOI: https://doi.org/10.1109/TPAMI.2014.2345390
- arXiv链接: https://arxiv.org/abs/1404.7584
核心贡献
1. 理论创新
- 循环矩阵理论: 基于一个关键观察 - 平移和缩放的样本补丁集合存在大量冗余(重叠像素被约束为相同),提出了处理数千个平移补丁数据集的解析模型
- 傅里叶域对角化: 证明了生成的数据矩阵是循环的,可以用离散傅里叶变换对其进行对角化,将存储和计算复杂度降低了几个数量级
- 核化扩展: 对于核回归,推导出新的核化相关滤波器(KCF),与其他核算法不同,KCF具有与线性对应算法完全相同的复杂度
2. 算法优势
- 计算效率: 通过傅里叶变换将矩阵运算转化为向量的逐元素乘积(Hadamard积),大幅提升计算速度
- 多通道支持: 提出了线性相关滤波器的快速多通道扩展,通过线性核实现,称为双相关滤波器(DCF)
- 实时性能: 算法运行速度达到数百帧每秒,同时保持高精度
3. 性能表现
- 基准测试: 在50个视频的基准测试中,KCF和DCF都超越了顶级跟踪器如Struck和TLD
- 代码简洁: 整个跟踪框架仅用几行代码实现(算法1),并已开源
- 速度与精度: 在保持高跟踪精度的同时实现了极高的运行速度
技术原理
1. 判别式分类器
- 现代跟踪器的核心组件是判别式分类器,用于区分目标和周围环境
- 为应对自然图像变化,分类器通常使用平移和缩放的样本补丁进行训练
2. 相关滤波等价性
- 对于线性回归,该方法等价于相关滤波器,这被一些最快的竞争跟踪器使用
- 相关滤波器源于信号处理领域,其核心思想是设计滤波模板,使其作用在跟踪目标上时得到最大响应
3. 循环矩阵采样
- 使用目标周围区域的循环矩阵采集正负样本
- 利用脊回归训练目标检测器
- 成功利用循环矩阵在傅里叶空间可对角化的性质简化计算
算法流程
- 样本生成: 通过循环移位生成大量训练样本
- 特征提取: 支持HOG特征等多通道特征,替代单一灰度特征
- 分类器训练: 使用脊回归在核空间中训练判别式分类器
- 目标定位: 通过相关响应的最大值确定目标位置
- 模型更新: 在线更新分类器以适应目标外观变化
历史意义
- 算法谱系: KCF是MOSSE算法的改进版本,也是后续CSK、STC、Color Attributes等跟踪器的基础
- 开源贡献: 作者将跟踪框架开源,促进了相关领域的进一步发展
- 实用价值: 算法在保证高精度的同时实现了实时性能,具有很强的实用价值
实验验证
- 在多个标准数据集上进行了充分的实验验证
- 与当时最先进的跟踪算法进行了全面比较
- 证明了算法在速度和精度方面的显著优势
详细公式推导
1. 脊回归基础
1.1 问题定义
设训练样本集为 ${(x_i, y_i)}_{i=1}^n$,其中 $x_i \in \mathbb{R}^d$ 为特征向量,$y_i \in \mathbb{R}$ 为标签。
线性回归函数: \(f(x) = w^T x\)
其中 $w \in \mathbb{R}^d$ 是权重向量。
1.2 脊回归目标函数
脊回归的目标函数为: \(\min_w \sum_{i=1}^n (w^T x_i - y_i)^2 + \lambda \|w\|^2\)
写成矩阵形式: \(\min_w \|Xw - y\|^2 + \lambda \|w\|^2\)
其中:
- $X = [x_1, x_2, \ldots, x_n]^T \in \mathbb{R}^{n \times d}$ 为数据矩阵
- $y = [y_1, y_2, \ldots, y_n]^T \in \mathbb{R}^n$ 为标签向量
- $\lambda > 0$ 为正则化参数
1.3 解析解
对目标函数求导并令其为零: \(\frac{\partial}{\partial w}(\|Xw - y\|^2 + \lambda \|w\|^2) = 2X^T(Xw - y) + 2\lambda w = 0\)
解得: \(w = (X^T X + \lambda I)^{-1} X^T y\)
2. 循环矩阵理论
2.1 循环矩阵定义
给定向量 $x = [x_0, x_1, \ldots, x_{n-1}]^T$,其循环矩阵 $C(x)$ 定义为:
\[C(x) = \begin{bmatrix} x_0 & x_{n-1} & x_{n-2} & \cdots & x_1 \\ x_1 & x_0 & x_{n-1} & \cdots & x_2 \\ x_2 & x_1 & x_0 & \cdots & x_3 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ x_{n-1} & x_{n-2} & x_{n-3} & \cdots & x_0 \end{bmatrix}\]2.2 循环移位操作
循环矩阵可以通过排列矩阵 $P$ 生成: \(P = \begin{bmatrix} 0 & 0 & \cdots & 0 & 1 \\ 1 & 0 & \cdots & 0 & 0 \\ 0 & 1 & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \cdots & 1 & 0 \end{bmatrix}\)
则 $C(x) = [x, Px, P^2x, \ldots, P^{n-1}x]$
2.3 傅里叶域对角化
关键定理: 所有循环矩阵都可以被离散傅里叶变换矩阵对角化。
设 $F$ 为 $n \times n$ 的DFT矩阵,其元素为: \(F_{jk} = \frac{1}{\sqrt{n}} e^{-2\pi i jk/n}, \quad j,k = 0,1,\ldots,n-1\)
则循环矩阵 $C(x)$ 可以对角化为: \(C(x) = F^H \text{diag}(\hat{x}) F\)
其中:
- $F^H$ 是 $F$ 的共轭转置
- $\hat{x} = F x$ 是 $x$ 的离散傅里叶变换
- $\text{diag}(\hat{x})$ 是以 $\hat{x}$ 为对角元素的对角矩阵
3. 循环矩阵脊回归
3.1 循环样本生成
在目标跟踪中,我们从基础样本 $x$ 生成所有循环移位版本作为训练样本: \(X = C(x) = [x, P x, P^2 x, \ldots, P^{n-1} x]\)
对应的标签向量为 $y$,其中 $y_0 = 1$(目标位置),其他位置为负值或零。
3.2 傅里叶域求解
利用循环矩阵的对角化性质,脊回归的解可以在傅里叶域中高效计算:
\[w = (X^T X + \lambda I)^{-1} X^T y\]由于 $X = C(x) = F^H \text{diag}(\hat{x}) F$,我们有: \(X^T X = F^H \text{diag}(\hat{x}^*) F \cdot F^H \text{diag}(\hat{x}) F = F^H \text{diag}(\lvert \hat{x} \rvert^2) F\)
其中 $\hat{x}^*$ 是 $\hat{x}$ 的复共轭,$\lvert \hat{x} \rvert^2$ 表示逐元素的模长平方。
因此: \(X^T X + \lambda I = F^H \text{diag}(\lvert \hat{x} \rvert^2 + \lambda) F\)
最终解为: \(w = F^H \text{diag}\left(\frac{\hat{x}^* \odot \hat{y}}{\lvert \hat{x} \rvert^2 + \lambda}\right)\)
其中 $\odot$ 表示逐元素乘积(Hadamard积)。
4. 核化相关滤波器
4.1 核函数引入
为了处理非线性问题,引入核函数 $\kappa(x, x’)$,将数据映射到高维特征空间。
常用的核函数包括:
- 线性核: $\kappa(x, x’) = x^T x’$
- 多项式核: $\kappa(x, x’) = (x^T x’ + c)^d$
- 高斯核: $\kappa(x, x’) = \exp(-\frac{|x - x’|^2}{2\sigma^2})$
4.2 对偶问题
在核空间中,脊回归的对偶形式为: \(\alpha = (K + \lambda I)^{-1} y\)
其中 $K$ 是核矩阵,$K_{ij} = \kappa(x_i, x_j)$。
4.3 循环核矩阵
对于循环生成的样本,核矩阵具有特殊的循环结构: \(K = C(\kappa^{xx})\)
其中 $\kappa^{xx} = [\kappa(x, x), \kappa(x, Px), \ldots, \kappa(x, P^{n-1}x)]^T$。
4.4 傅里叶域核回归
利用循环矩阵的对角化性质: \(\alpha = F^H \text{diag}\left(\frac{\hat{y}}{\hat{\kappa}^{xx} + \lambda}\right)\)
其中 $\hat{\kappa}^{xx} = F \kappa^{xx}$。
5. 检测阶段
5.1 响应计算
对于新的候选区域 $z$,其响应函数为: \(f(z) = \sum_{i=0}^{n-1} \alpha_i \kappa(z, P^i x)\)
5.2 傅里叶域加速
定义 $\kappa^{xz} = [\kappa(P^0 x, z), \kappa(P^1 x, z), \ldots, \kappa(P^{n-1} x, z)]^T$
则响应可以表示为: \(f = C(\kappa^{xz}) \alpha\)
在傅里叶域中: \(\hat{f} = \hat{\kappa}^{xz} \odot \hat{\alpha}\)
最终响应: \(f = F^H \hat{f} = F^H (\hat{\kappa}^{xz} \odot \hat{\alpha})\)
6. 多通道扩展
6.1 多通道特征
对于 $d$ 通道的特征 $x^{(1)}, x^{(2)}, \ldots, x^{(d)}$,线性核可以表示为: \(\kappa(x, x') = \sum_{l=1}^d (x^{(l)})^T x'^{(l)}\)
6.2 双相关滤波器(DCF)
对于多通道线性核,每个通道的贡献可以独立计算: \(\hat{\alpha}^{(l)} = \frac{\hat{y}}{\sum_{j=1}^d \hat{\kappa}^{xx,(j)} + \lambda}\)
最终响应为所有通道的加权和: \(\hat{f} = \sum_{l=1}^d \hat{\kappa}^{xz,(l)} \odot \hat{\alpha}^{(l)}\)
7. 计算复杂度分析
7.1 传统方法复杂度
- 矩阵求逆: $O(n^3)$
- 矩阵乘法: $O(n^2 d)$
7.2 KCF方法复杂度
- FFT计算: $O(n \log n)$
- 逐元素运算: $O(n)$
- 总复杂度: $O(nd \log n)$
对于典型的跟踪窗口大小($n \approx 10^3$)和特征维度($d \approx 10^2$),KCF方法比传统方法快几个数量级。
8. 更新策略
8.1 在线学习
为适应目标外观变化,采用指数移动平均更新: \(\hat{x}_t = (1-\eta)\hat{x}_{t-1} + \eta\hat{x}_t\) \(\hat{\alpha}_t = (1-\eta)\hat{\alpha}_{t-1} + \eta\hat{\alpha}_t\)
其中 $\eta$ 是学习率参数。
8.2 模型退化防止
为防止模型过拟合,可以采用:
- 自适应学习率调整
- 置信度阈值控制
- 长期记忆机制
这些公式推导展示了KCF算法如何通过循环矩阵理论和傅里叶变换实现高效的目标跟踪,将原本复杂的矩阵运算转化为简单的逐元素运算,大幅提升了计算效率。