KCF -目标检测算法总结

2024-06-17 16:18
文章标签 算法 总结 目标 检测 kcf

本文主要是介绍KCF -目标检测算法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

KCF简介

KCF是一种鉴别式追踪方法,这类方法一般都是在追踪过程中训练一个目标检测器,使用目标检测器去检测下一帧预测位置是否是目标,然后再使用新检测结果去更新训练集进而更新目标检测器。而在训练目标检测器时一般选取目标区域为正样本,目标的周围区域为负样本,当然越靠近目标的区域为正样本的可能性越大。

简单来说 KCF 是 核相关滤波算法,滤波器 和 跟踪patch 进行相乘的到相关性,对应位置较大的值,相关性较强,即表示得到的目标位置。

KCF全称为Kernel Correlation Filter 核相关滤波算法。是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的,算法出来之后也算是轰动一时,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现,所以引起了一大批的学者对这个算法进行研究以及工业界也在陆续把这个算法应用在实际场景当中。这个算法主页里面有论文还有代码都可以在这里面下载,也有一些简介之类的,这篇文章在2015年作者又发在了TPAMI上面,所以大家可能会看到两个版本,但是没有改动,都是可以看到。论文下载地址相关滤波算法算是判别式跟踪,主要是使用给出的样本去训练一个判别分类器,判断跟踪到的是目标还是周围的背景信息。主要使用轮转矩阵对样本进行采集,使用快速傅里叶变化对算法进行加速计算。

KCF的主要贡献

  • 使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并成功的利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求。

  • 将线性空间的脊回归通过核函数映射到非线性空间,在非线性空间通过求解一个对偶问题和某些常见的约束,同样的可以使用循环矩阵傅里叶空间对角化简化计算。

  • 给出了一种将多通道数据融入该算法的途径。

二、详细介绍

Abstract:主要介绍了一下这篇文章的想法的由来以及算法的成就和所使用的东西,还介绍了一下论文在哪些数据集上测试了等。简介一般就是论文的总结,对论文做一个总体的介绍,大致的思想基本看了间接之后就能明白了,就是上面我写的那些,使用核相关滤波器训练一个判别式分类器,使用轮转矩阵生成样本去训练分类器,代码也是开源的。

Correlation Filter应用于tracking方面最朴素的想法就是:相关是衡量两个信号相似值的度量,如果两个信号越相似,那么其相关值就越高,而在tracking的应用里,就是需要设计一个滤波模板,使得当它作用在跟踪目标上时,得到的响应最大,最大响应值的位置就是目标的位置。(详细的介绍大家可以参考一下王泥喜龙一的博客地址)如下图所示: 
这里写图片描述 
CSK(论文下载地址)是这个算法改进的初级版本,这篇是主要引进了循环矩阵生成样本,使用相关滤波器进行跟踪,本篇KCF是对CSK进行更进一步的改进,引进了多通道特征,可以使用比着灰度特征更好的HOG(梯度颜色直方图)特征或者其他的颜色特征等。

2、Related Work

2.1、基于检测的跟踪 
这个听名字就比较好理解了,基于检测到的目标进行跟踪,首先在跟踪之前对目标进行检测,得到目标的位置,然后对目标进行学习,跟踪。 
2.2、样本转换和相关滤波 
对一些以前存在的样本转换的方法和相关滤波的一些知识进行一个介绍。For us, this hinted that a deeper connection between translated image patches and training algorithms was needed, in order to overcome the limitations of direct Fourier domain formulations.而且说出了样本和训练算法都是必须的,直接在频域使用傅里叶变化加快算法。 
2.3、后来的工作 
初始版本就是我上面说的CSK那篇,然后把多通道特征以及核函数这个加进来对算法进行提升。

3、Contributions

提出了一个快速的效果良好的跟踪算法,把以前只能用单通道的灰度特征改进为现在可以使用多通道的HOG特征或者其他特征,而且在现有算法中是表现比较好的,使用HOG替换掉了灰度特征,对实验部分进行了扩充,充分证明自己的效果是比较好的。使用核函数,对偶相关滤波去计算。

4、Building Blocks

4.1、 Linear regression 
主要使用岭回归函数,能够像SVM那些有良好的表现。训练的目的就是找到这么一个函数这里写图片描述使得我们的误差函数最小,在本文中使用的误差函数为这里写图片描述 
接下来的一切内容都是去讲怎么去最小化这个二次函数,以及怎么去找这个函数,这个方法也是比较简单的,就是对函数求导,然后使导数等于0,然后得到w,既是我们要求的函数。

在线性问题中:

在求解这里的最小值的时候,将f(xi)根据公式(1)换成矩阵形式Wt*X(为什么可以转换成这种形式参考SVM),X的每一行表示一个采样结果的xi,X是经过第一行的xi不断循环得到的一个矩阵,Wt表示W的转置。y表示yi组成的向量。然后计算公式(2)对W的求导等于0可以得到:

(3)

 

(4)

(4)式即将(3)式中的转置转换成了共轭,只要是考虑在下面的傅里叶转换中有负数的出现。

这里我们看到在求w得最小值的时候有矩阵求逆的操作,这使得计算量比较大。然而根据之前说的X是一个循环矩阵,形式为:

(5)

将矩阵进行傅立叶变换后,循环矩阵有一个性质:


(6)

即一个循环矩阵可以用它的第一行的向量进行傅里叶变换之后表示,x带一个帽子表示对向量x进行了傅里叶变换。傅里叶变换的具体理解可以参考:此篇傅里叶博客

对于如何进行傅里叶转换可以参考:傅里叶转换方法

然后就可以发现一个循环矩阵可以转换成用一个向量来表示。将(6)式带入(4)式化简:

 

w戴帽子的意思就是进行了傅里叶转换,这样就从一个矩阵的运算换到了向量的运算。减少了求逆的操作。

当然在大多数情况下我们解决的是非线性问题

那我们就引进了高维求解和 核函数的概念(仔细的求解参考上文提到的SVM文章)。

在高维空间中非线性问题w可以变成一个线性问题。

 

(7)

fai(xi)表示将x映射到高位空间的函数。

那我们的目标函数就可以表示成

(8)

其中k表示核函数它的定义运算如下:

由(8)可见之前求最小w的问题转换成了求最小阿尔法的问题。将(8)带入(2)阿尔法的求解参考一篇文章“R. Rifkin, G. Yeo, and T. Poggio, “Regularized least-squares classification,Nato Science Series Sub Series III Computer and Systems Sciences, vol. 190, pp. 131–154, 2003.”

最后可以解得

 

(9)

进行傅里叶变换:

这里Kxx代表K矩阵的第一行元素的傅里叶变换。K也是一个循环矩阵可证,此处省略具体方式可参考“High-Speed Tracking with Kernelized Correlation Filters João F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista”的5.2节。

这样(8)式可以表示成:

C(x)表示由向量x循环移位得到的矩阵

Kz是所有训练样本和候补patch之间的核矩阵

(9)

傅里叶变换后的形式

现在就剩讨论一下k的形式,如果k是线性核的话就可以转换成我们在讨论线性问题时求得的w的傅里叶转换之后的形式。本篇文章中用的是高斯核,形式如下:

 

多通道问题

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

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

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

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

我们来看1D的情况,1D弄明白了,2D也就明白咯,因为我们上面说了怎么推导2D的
样本cell数为M,每个cell特征维数为L,第个样本的第通道向量表示成,样本的总特征可以表示成.

于是K矩阵的第一行有

这里用到

这是dot product kernel的情况,那径向基核就很容易推了

 

2.其实讲到这里已经把精髓讲完了,下面讲一些推导细节,加深理解。

2.1循环矩阵对角化有神奇效果,大大降低了运算量。首先举个例子,来展现它神奇的效果。就拿上文出现的岭回归公式当例子吧,看看能把它简化成什么样。

化简过程:

这是我早前推的,比起他的公式,我个人更喜欢他的代码嘻嘻。这个公式推下来并没有用,只是让我们见识一下循环矩阵化简的威力,真正用到代码里去的是下面3个推导。

 

2.2大家是否还记得我们这里实际上用到的是核化的岭回归啊?也就是比普通的稍微简化了一些的,所以推导起来也比较容易。

论文结果: 

嗯,好像看起来还不错哦,既没有求逆又没有很多矩阵乘法运算。它的代码其实更感人。

简单的不能再简单了,至此,训练过程结束。下面看检测过程,同样化简得面目全非。

 

2.3检测出跟踪结果,就是当前输入的帧和滤波器求相关性,相关性最大的即为跟踪结果。

嗯,这篇论文真是不断地感动着我们这些吃瓜群众,原来可以这么简单。看着公式,代码闭着眼睛都能编了。

 

现在只剩一个问题了,那就是核相关性怎么求。

2.4核相关性的化简。好像解决了这个就完美了,那这个核相关性好求吗?如果不好求的话,就空亏一篑了,放心,跟踪界的allstar Henriques(葡萄牙人的名字我至今不会读)当然已经帮我们解决好了,依然简单。

我们这里只推导点积核。剩下的多项式核,径向基核,高斯核类比就能得到。论文里效果最好的是高斯核。

 

注意,代码里第2行是使用HOG特征的关键,他把31层HOG特征全部加起来了,这个简单的操作使得之前的CSK能用很多高维特征,故性能大增。

 

补充

循环矩阵傅里叶对角化

文献中,一般用如下方式表达这一概念: 

 对角化怎么理解?

 

总结

KCF相对于其他的tracking-by-detection方法速度得到了极大的提升,效果也相对较好,思想和实现十分简单。

 

enter description here

借上图来总结下KCF的过程,左图是刚开始我们使用红色虚线框框定了目标,然后红色实线框就是使用的padding了,其他的框就是将padding循环移位之后对齐目标得到的样本,由这些样本就可以训练出一个分类器,当分类器设计好之后,来到了下一帧图像,也就是右图,这时候我们首先在预测区域也就是红色实线框区域采样,然后对该采样进行循环移位,对齐目标后就像图中显示的那个样子 了,(这是为了理解,实际中不用对齐。。。),就是周围那些框框啦,使用分类器对这些框框计算响应,显然这时候白色框响应最大,因为他和之前一帧红色框一样,那我们通过白色框的相对移位就能推测目标的位移了。

然后继续,再训练再检测。。。。

论文中还说到几点

  1. 对特征图像进行cosine window加权,这主要是为了减轻由于边界移位导致图像不光滑。

  2. padding的size是目标框的2.5倍,肯定要使用padding窗口,要不然移位一次目标就被分解重组合了。。。效果能好哪去。。

  3. 对于标签使用了高斯加权

  4. 前后帧结果进行了线性插值,为了让他长记性,不至于模型剧烈变化。

但是其缺点也是很明显的。

  1. 依赖循环矩阵,对于多尺度的目标跟踪效果并不理想。当然可以通过设置多个size,在每个size上进行KCF运算,但这样的话很难确定应预先设置多少size,什么样的size,而且对size的遍历必将影响算法的速度。KCF最大的优势就是速度。

我在想能不能通过少量特征点的匹配来调整窗口的size,当然这样的话,速度也是个问题。

 

enter description here


这种情况下还能保证最大响应就对应着目标中心所在的框吗?如果不能偏差会不会越来越大?

  1. 初始化矩阵不能自适应改变,其实这个问题和上一个缺点类似,这里强调的是非刚体运动,比如跳水运动员,刚开始选定区域肯定是个瘦长的矩形框,但当运动员开始屈体的时候显然这个预选定框就很大误差了。

 

enter description here

 

3.难处理高速运动的目标

  1. 难处理低帧率中目标,这个和3类似,都是说相邻帧间目标位移过大。

 

enter description here

 

目标下一帧出现位置不在你的padding内,你怎么也不可能移位找到。。。

5.虽然算法中对模型系数进行线性插值,但是对于目标一旦被遮挡若干帧之后,可能模型就再也回不去了。。。因为模型已经完全被遮挡物污染掉了。

6.我觉的论文还有一个问题就是仅仅通过检测到的框中心和目标实际中心的距离来度量性能,这是有问题的。
比如我现在有一个人垂直我的镜头逐渐远去了,但他的中心一直在我镜头的中心处,那我就开始画个框就是镜头的视角范围,那这样我检测结果百分之百,可是有什么用呢。。。。当然论文方法是在很多不同数据集上检验的性能还是很有说服力的。我的意思就是对于单个数据集不能仅凭这个指标定方法的好坏。

 

引用:

https://blog.csdn.net/shenxiaolu1984/article/details/50884830

https://www.jianshu.com/p/9aacd075a689

https://zhuanlan.zhihu.com/p/26685032

https://www.cnblogs.com/YiXiaoZhou/p/5925019.html

https://blog.csdn.net/crazyice521/article/details/53525366

这篇关于KCF -目标检测算法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069929

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费