KCF算法原理笔记

article/2025/11/11 2:37:26

        KCF算法全称是Kernelized Correlation Filters,是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的跟踪算法,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现。该算法主要使用循环矩阵对样本进行采集,使用快速傅里叶变换对算法进行加速计算。

第一部分 线性回归

Linear regression

       首先介绍一下脊回归,线性回归函数是f(z)=wTz,给定样本xi和对应的标签yi,目标是优化最大平方和误差来求出参数w,即

       其中λ是正则化参数,来防止过拟合现象的发生,就像深度学习中的那样。这个函数的通用求解公式是

       其中,矩阵X的每一行对应着一个向量xi,向量y的每一个值对应着yi,I是一个单位矩阵。

       ,每个样本是一个n*1维的向量

       ,X一共有m个样本

      

      

      

Cyclic shifts

       为了简单说明这种操作,先考虑一个通道,一维信号的情况。考虑一个n*1的向量x来表示一个感兴趣区域,把它当作一个基本样本,我们的目标是用基本样本(一个正样本)和通过移位操作来得到的几个虚假样本(作为负样本)来训练分类器。我们可以用循环移位算子来模拟这个向量的一维平移操作,用P矩阵来操作,P是n*n的矩阵:

                                                                       

       通过用P矩阵和向量x相乘的方式,我们就可以得到另一个向量,那么再用P*Px我们就可以再得到一个不同的向量,我们就可以说,通过在x向量前面乘上P的1到n-1次幂,我们能得到n-1个不同的虚假向量,得到新的负样本,如下图所示:

       对于二维图片,经过这种平移操作,可以得到很多张新的图片,如下图所示:

 

Circulant matrices

       经过上面的操作,我们只需要给出一个样本,我们就能生成n个不同的样本,那么对于求解脊回归问题,我们给出一个基础向量x=[x1,x2,x3,…,xn]T,然后我们就能得到X了:

       带入到上面脊回归的求解公式,我们就可以计算出w了,是不是很巧妙呐。可是如果进行这种矩阵运算求解还是很复杂,所以怎么办呐?一个非常令人震惊的有用的发现出现了,所有的循环矩阵都能够在傅氏空间中使用离散傅里叶矩阵进行对角化,X相似于对角阵

       其中对应于生成X的向量(就是X的第一行矩阵)x傅里叶变化后的值,=F(x)=,F是离散傅里叶矩阵,是常量

 

Putting it all together

       现在我们发现可以用上面的方式在求X了,上面脊回归在傅里叶域的求解方法是这样的

       然后我们就可以X=带入上面的公式里了

注意这里的分号是点除运算,就是对应元素相除。因为

 

所以

                                                                                      

       非常简洁高效的公式,不由得说一句,数学真美!!!

第二部分 非线性回归

Kernel trick – brief overview

       对于非线性回归问题来说,我们希望找到一个非线性映射函数,使映射后的函数在线性空间下是可分的,那么对于非线性回归问题我们就可以描述为找到一个回归函数,给定样本xi和对应的标签yi,目标是优化最大平方和误差来求出参数w。

       设w由训练样本的非线性变换ψ(xi)的线性组合构成:

       记κ(xi,xj)=ψ(xi)ψ(xj),称为核函数。所以

       ,k(z)中的第i个元素为训练样本xi和测试样本z的核函数值。

Fast kernel regression

f(z)是关于z的非线性函数,但却是关于κ(z)的线性函数,可以使用线性函数的优化方法求解α。

       K是所有训练样本的核相关矩阵。如果核函数选择得当,使得x内部元素顺序更换不影响核函数取值,则可以保证K也是循环矩阵。以下核都满足这样的条件:

这里k是核相关矩阵的第一行,表示原始生成向量x0和移位了i的向量xi的核函数。

       两者都是同一个向量和自身位移结果进行运算。因为所有涉及到的核函数都只和位移的绝对值有关,所以ki=kN−i,即k是对称向量。因为对称向量的傅里叶变换是实数,有:

Fast detection

       对于第一帧图像来说,在第一帧标注好的框的周围划分一个上下文目标区域,得到训练样本和标签来训练检测器,其中训练集是由上下文目标区域和由其移位得到的若干样本组成,对应的标签是根据距离越近正样本可能性越大的准则赋值的,然后可以得到α。

假设我们要预测第二帧图中目标的位置,我们就在上一帧框的附近划分一个感兴趣区域,对于这个感兴趣区域z,我们对这个感兴趣区域进行移位操作,即,其中

                                                                                           

                                                       ,X是循环矩阵,每一行表示的是训练集x向量

                                                                                         

然后选择f(zj)值最大的作为新目标区域,由zj可以知道目标移动的位置。

定义是测试样本和训练样本在核空间上的核矩阵

       ,ψ(Z)中的每一行代表zj向量,1*n X n*n X n*n=1*n.

      ,因为是循环矩阵,所以,类似前面的推导,                                                                                                     

第三部分 核相关矩阵快速计算

Dot-product and polynomial kernels

经过上面的推导,我们发现现在我们要计算的部分只有了。

对于内积和多项式核:

对于多项式核:

Radial Basis Function and Gaussian kernels

       对于径向基核:

       对于高斯核:

第四部分 多通道问题

       首先让我们来看一下二维特征怎么应用到上面的各种公式中去。

       设图片,假设存在一个函数,使,然后计算核相关矩阵K。

       移位生成的样本数量一共是m*n个,所以

       其中,是二维傅里叶变换矩阵,是生成块矩阵K的生成矩阵,是对进行傅里叶变换。

                                                                                    

       论文中在提取目标区域的特征时可以是灰度特征,但是使用Hog特征能够取得更好的效果,那么Hog特征该如何加入前面提到的模型呢?

       Hog特征是将图像划分成较小的局部块,称为cell,在cell里提取梯度信息,绘制梯度方向直方图,然后为了减小光照影响,将几个cell的方向直方图串在一起进行block归一化,最终将所有的cell直方图串联起来就是图像的特征啦。

那么,按照传统的方式一张图像就提取出一个向量,但是这个向量怎么用啊?我们又不能通过该向量的移位来获得采样样本,因为,你想啊,把直方图的一个bin循环移位有什么意义啊?

所以论文中Hog特征的提取是将sample区域划分成若干的区域,然后在每个区域提取特征,代码中是在每个区域提取了32维特征,即3XnOrients+5,其中nOrients=9就是梯度方向划分的bin个数,每个方向提取了3个特征,2个是对方向bin敏感的,1个是不敏感的,另外4个特征是关于表观纹理的特征还有一个是零,表示阶段特征。提取了31个特征(最后一个0不考虑)之后,不是串联起来,而是将每个cell的特征并起来,那么一幅图像得到的特征就是一个立体块,假设划分cell的结果是mXn,那么fhog提取结果就是mXnX31,我们就相当于得到了31张图片。那么就可以通过cell的位移来获得样本,这样对应的就是每一通道对应位置的移位,所有样本的第i通道都是有生成图像的第i通道移位获得的,所以独立的在每一个通道上计算,就可以利用循环矩阵的性质了。

对于线性核来说,求k的公式如下所示,其中xc和xc‘代表每个通道的图片:

同理对于高斯核来说,公式如下:

以此类推。。。

第五部分 整体代码和实验结果

 

从实验结果可以看出,用hog特征对跟踪效果有个非常大的提升。

第五部分 总结

KCF算法引入了hog特征和核方法,在跟踪的精度核速度上都取得了非常好的效果,但是KCF也有一些问题,比如它对尺度变化,高度运动和遮挡问题会很敏感。

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/qidffqp4.shtml

相关文章

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

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

【KCF算法解析】High-Speed Tracking with Kernelized Correlation Filters笔记

前段时间研究了一下KCF算法,单单看论文有很多看不懂的地方。查阅参考了,很多博客和其他材料才算了解了文章的大题思路,现将个人的理解在此记录,作为笔记。 主要内容 0.1 目标跟踪的背景介绍 0.2 学习该算法需先了解的预备知识 …

前端项目如何做测试?

前端项目也叫web端项目(通俗讲就是网页上的功能)是我们能够在屏幕上看到并产生交互的体验。 前端项目如何做测试? 要讲清楚这个问题,先需要你对测试流程现有一个全局的了解,先上一张测试流程图: 接下来下…

gt2e支持升级鸿蒙,鸿蒙测试版下月发布,Mate40或率先升级

鸿蒙系统终于要来了,Mate 40或成为率先升级的机型,12月中下旬将推出开发者测试版本,网友评论称终于等到你,国产操作系统终于要来了。 前一阵子余承东说鸿蒙系统将不会在今年推出,当时这个消息说实话让很多人感到失望&a…

gt2e鸿蒙系统,华为Watch GT2e评测:轻松开启年轻人一手掌控的百变运动潮酷生活...

【TechWeb】4月23日,华为nova7发布会上,华为Watch GT系列家族新成员——华为Watch GT 2e手表也正式发布。这款手表主要面向95后Z世代年轻人群体,定位运动潮流内核,潮流的外观造型和丰富的运动功能上吸引了不少年轻人关注的目光,同时也吸引了小编尝鲜的好奇之心。 潮酷外观…

vue_test_unit_e2e常见问题npm run unit单元测试和npm run e2e集成测试问题

vue项目要进行unit和e2e常见问题 localStorage is not available for opaque origins console.error node_modules\vue\dist\vue.runtime.common.dev.js 通常根据vue init webpack myproject 生成的项目,选择了unit和e2e模块后,都会有些问题。 1.首先是…

谈谈端到端测试(End-to-End Testing)

谈谈端到端测试(End-to-End Testing) 当今的软件系统是复杂的,并且与许多子系统相互关联。如果任何子系统出现故障,整个软件系统都可能崩溃。这是一个主要的风险,可以通过端到端测试来避免。 端到端测试是一种技术&a…

“汽车人”眼中的网络安全---关于AUTOSAR E2E及测试开发实践

1.前言 上篇文章“聊聊网络安全的5W1H”对网络安全知识体系和技术脉络做了深入浅出的介绍,提到AUTOSAR所定义的网络和通信安全相关的技术,本期我们将介绍其中的E2E策略(严格来说属于Safety的范围),并分享在项目中的测…

【E2E】E2E通信保护协议学习1

文章目录 前言一、E2E简介和功能介绍1.E2E简介2.一些名词简写及其对应含义 二、一些功能规格1.通讯保护概述2.配置文档概述 总结 前言 在软件测试工作中,E2E是功能的一部分。 非E2E专业工程师,如果有哪里写的不对,请大家多多指正。 一、E2E简…

使用Nightwatch进行E2E测试

本文在线预览 E2E测试 不同于行为驱动测试(BDD)和单元测试独立运行并使用模拟/存根,端到端测试将试着尽可能从用户的视角,对真实系统的访问行为进行仿真。对Web应用来说,这意味着需要打开浏览器、加载页面、运行Java…

cypress进行e2e测试之理论

cypress 进行 e2e 测试之理论 cypress 是目前 e2e 很火的一个测试组件,内部绑定了 macha、chai、chai-jquery 之类的断言,为了让代码代码 更有说服力,减少提交测试错误,进行 e2e 测试显然是非常有必要的。 官网 GitHub 借鉴官网一句话来说…

自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 测试工具对比-适合TDD或 BDD、断言、异步测试 测试工具的类型

自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD、断言、异步测试 & 测试工具的类型 前端自动化测试 测试是一个庞大的主题,包括各种分类的测试,诸如黑盒测试/白盒测试、单元测…

web前端测试——e2e测试

开发环境:安装有node的macbook(windows没测) 第一步: 创建自己需要测试的项目,如在桌面创建一个test目录作为我们的项目根目录。 打开sublim text ,并将项目拖到sublim text中,方便管理。 第…

E2E 端到端测试学习 - E2E 介绍、Cypress 案例基本使用

E2E 测试介绍 E2E E2E(end to end)端到端测试是最直观可以理解的测试类型。在前端应用程序中,端到端测试可以从用户的视角通过真实浏览器自动检查应用程序是否正常工作。 E2E 把整个系统当作一个黑盒,测试人员模拟真实用户在浏…

Unity射线与UI碰撞检测

问题产生背景:我们有的时候,需要实现射线与3D UI之间的碰撞,当射线碰撞到3D UI之后(将Canvas设置为World Space),调整到合适的位置。使用LineRender表示射线的直观显示,使用一把枪结合第一人称控…

unity中射线碰撞检测总结

这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处; 射线碰撞检测,就是由某一物体发射出一道射线&#…

Unity 射线与碰撞范围检测【踩坑记录】

射线检测 射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider,Physics.Raycast是不会检测到Collider 2D的(这个让我有一次debug了好久才发现) 对应API如下 Physics.Raycast(Vector3 origin,Vec…

Unity 碰撞位置

获取碰撞位置的方法1:使用 Collider.ClosestPoint Returns a point on the collider that is closest to a given location. 返回碰撞器上最接近给定位置的点。 下方是子弹打到物体上,生成撞击火星的代码: // 碰撞体的检测 private void O…

Unity入门7——物理系统之碰撞检测

一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider至少一个物体有刚体 Mass:质量 默认为千克&a…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbody这个组件,刚体中有一个参数适用于检测碰撞的 如下图 Collision Detection就是碰撞检测。 然而有时候开发游戏,对于高速运动的物体(比如&#xff…