原文:http://blog.csdn.net/zwlq1314521/article/details/50427038

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^∗))

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α

2014新跟踪算法KCF笔记相关推荐

  1. 目标跟踪算法KCF原理详解

    一直以来没有很想写这个,以为这个东西比较简单,还算是比较容易理解的一个算法,但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西,我一直以为关于细节的东西大家可以自己去理解,大家都是想快速了 ...

  2. 目标跟踪算法——KCF入门详解

    一直以来没有很想写这个,以为这个东西比较简单,还算是比较容易理解的一个算法,但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西,我一直以为关于细节的东西大家可以自己去理解,大家都是想快速了 ...

  3. CMT跟踪算法学习笔记

    近期在学习目标跟踪算法的过程中发现,CMT算法的代码实测效果非常不错.对比之前学习过的SCM之类基于稀疏表示的跟踪算法,CMT的鲁棒性虽然不一定比之更高,但稀疏表示的方法普遍耗时很严重,导致其无法应用 ...

  4. TPAMI2015跟踪算法KCF原理及代码解析

    文章和代码下载地址: http://www.robots.ox.ac.uk/~joao/circulant/ 一.基础公式的由来 相关滤波跟踪器可以表示为最小化的岭回归问题: 表示期望相应,表示正则系 ...

  5. LADCF目标跟踪算法学习笔记(Learning Adaptive Discriminative Correlation Filters via Temporal Consistency prese)

    LADCF论文链接:https://www.researchgate.net/publication/326696472 摘要: 在最近的跟踪基准及比赛中,判别式相关滤波类跟踪器性能优异,然而现有的D ...

  6. KCF跟踪算法原理 入门详解

    一.算法介绍 KCF全称为Kernel Correlation Filter 核相关滤波算法.是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins ...

  7. 人脸跟踪:KCF核相关滤波算法

    一直以来没有很想写这个,以为这个东西比较简单,还算是比较容易理解的一个算法,但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西,我一直以为关于细节的东西大家可以自己去理解,大家都是想快速了 ...

  8. KCF跟踪算法论文阅读与原理分析

    文章目录 前言 一.KCF的前身:MOSSE算法 1.相关滤波 2.MOSSE算法 二.岭回归与循环矩阵 1.岭回归(Ridge Regression) 2.循环矩阵 2.1 循环移位 2.2 循环矩 ...

  9. kcf 跟随_基于YOLO和KCF的目标跟踪算法研究

    1. 引言 随着AI技术的不断发展,其子领域计算机视觉技术也获得了突飞猛进的进步,计算机视觉即通过机器实现"人眼"对事物的测量和判别能力.目前,计算机视觉技术主要应用于智能视频监控 ...

最新文章

  1. 知否,知否,交通数据邂逅【数据故事计划二等奖】
  2. HTML常见小问题2
  3. python class 是否存在某个变量_一文抵十课,考验你的Python变量是否理解透彻了
  4. C++之error: cannot bind non-const lvalue reference of type ‘myString’ to an rvalue of type ‘myString
  5. Linux CentOS 修改服务器主机名hostname
  6. 解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题
  7. numpy基础(part14)--积分
  8. Spring @transactional annotation 事务使用详解
  9. android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?
  10. 前端学习(3095):vue+element今日头条管理-回顾
  11. 龙蜥社区成立系统运维SIG,开源sysAK系统运维工具集
  12. 博客园电子期刊2010年10月刊发布啦
  13. Spring.Net学习笔记(3)-创建对象
  14. 公务员报考二级专业目录计算机类,国家公务员考试报考专业(公务员考试二级专业目录)...
  15. 保险业IT整体规划图
  16. Linux学习笔记(购买使用阿里云服务器,基本命令,安装JDK,Tomcat等环境)
  17. 基于蜜蜂优化算法优化的卷积神经网络(CNN)图像分类——附代码
  18. 【工程师整活】Ai-WB1-A1S实现离线语音+APP+天猫精灵控制风扇
  19. PMP项目管理学习总结,建议收藏
  20. (附源码)SSM网络故障报修系统 毕业设计 291146

热门文章

  1. linux环境下运行open error,错误:运行OpenCL代码时clGetPlatformIDs -1001(Linux)
  2. 相位展开matlab程序,[转载]全相位FFT算法的MATLAB程序
  3. 皮一皮:外语学的好,就是这么溜~
  4. 皮一皮:高手。。。真是高手
  5. 来活儿了!赶紧检查下代码里有没有脏话...
  6. 皮一皮:大自然的力量你无法想象...
  7. Spring Boot 2.4.3、2.3.9 版本发布,你准备好了吗?
  8. Docker 被禁,K8S 救火!
  9. 都2020 了,最流行的密码居然依旧是...
  10. Mysql 都会遭受哪些方面的攻击?