一些我看过的Object tracking算法的理解
2014-03-03 19:53
274 查看
最近因为要做一个体育视频跟踪的项目,所以看了一些paper,经过一段时间的代码阅读以及从网上看一些大牛们的讲解,基本上对算法和代码有了一个清晰的轮廓,为了以后可能要用到这些算法,所以在这里简要的总结下,可能写的不是太详细。
首先总的说的下,最近几年(08-13)的paper中基本上都是有跟踪、检测、学习的三个过程,不同的是检测器和跟踪器的设计以及学习算法不同的探索,其中有的paper将compressive representation加入到算法中,得到了很好的实时效果。
TLD算法:这是我看的第一个算法,当时折磨了我很长时间。TLD算法是讲跟踪过程分为了跟踪、检测和学习三个过程:跟踪是用Opencv里的Median-flow算法进行跟踪,就是在第一帧图片里初始化objec patch后,在下一帧中,在初始化的patch里均匀撒点,然后跟踪这些点,用这些点来大致重建patch,得到新的包含目标的patch,跟踪器在整个过程中是不变的,学习算法没有更新跟踪器。检测器是在当前检测帧中,全局搜索与在线模型最匹配的patch,也即Object
patch,由于TLD算法中设置的patch有上万个,如果直接用opencv里的matchTemplate函数进行匹配检测,根本无法满足实时性,所以它的检测分为三个部分:首先是查看每一个patch中的方差是否大于阈值,只有大于阈值的时候才认为该patch中可能含有目标,这样能直接剔除掉至少百分之五十的patch,然后使用Fern classifier继续剔除无用的patch,最后用NN classifer(最近森林分类器)得到最终的若干个可能的Object patch,系统用一定的准则在跟踪器得到的一个patch和检测器得到的若干个patch中进行选择最终的包含目标的patch(当然检测器和跟踪器也可能根本得不到目标patch,这样的情况下系统也会有处理方法)。最后,根据确定的Object
patch,在其周围产生若干正样本和负样本用于检测器中 Fern classifer 和 NN classfier的update。
点评:TLD算法C++版的比较慢,Matlab版的比较快,它对目标经常消失于视野然后重新出来的场合下尤其有效,不过原作者的代码比较繁琐(Matlab+C)。下面是论文和Code的链接。
http://personal.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html
real-time compressIve tracking:不得不说的是,该算法的思想简练,代码精辟,且效果极好,不过在人物交叉的时候显然不如TLD。
该算法的主要思想是:根据compressIve representation原理,一个高维的稀疏向量H在满足某种条件时可以降维成低维向量L,且L保存了H的绝大部分信息。L=MH。其中,L维m维向量,H维n维向量(特别大),M为转换矩阵。根据该思想,算法首先构造一个固定的转换矩阵M(在算法运行过程中一直不变),在初始化object patch后,在离该patch比较近的地方提取正样本patch,在较远的地方提取负样本patch(他们可以看做为H,即高维向量)在经M降维后训练朴素贝叶斯分类器。然后在循环的每一帧处理过程中,首先在上一帧的patch位置附近构造不同大小的patch,然后将这些patch降维,用训练好的朴素贝叶斯分类器分类得到分数最高的patch,该patch就被认为当前帧中包含目标的patch,然后在该patch附近继续提取正样本和负样本,Update朴素贝叶斯分类器,就这样一直循环。论文和算法的链接见下面:
http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm
PS:本文会后续中继续分享我对别的Object trackingpaper的个人心得。
首先总的说的下,最近几年(08-13)的paper中基本上都是有跟踪、检测、学习的三个过程,不同的是检测器和跟踪器的设计以及学习算法不同的探索,其中有的paper将compressive representation加入到算法中,得到了很好的实时效果。
TLD算法:这是我看的第一个算法,当时折磨了我很长时间。TLD算法是讲跟踪过程分为了跟踪、检测和学习三个过程:跟踪是用Opencv里的Median-flow算法进行跟踪,就是在第一帧图片里初始化objec patch后,在下一帧中,在初始化的patch里均匀撒点,然后跟踪这些点,用这些点来大致重建patch,得到新的包含目标的patch,跟踪器在整个过程中是不变的,学习算法没有更新跟踪器。检测器是在当前检测帧中,全局搜索与在线模型最匹配的patch,也即Object
patch,由于TLD算法中设置的patch有上万个,如果直接用opencv里的matchTemplate函数进行匹配检测,根本无法满足实时性,所以它的检测分为三个部分:首先是查看每一个patch中的方差是否大于阈值,只有大于阈值的时候才认为该patch中可能含有目标,这样能直接剔除掉至少百分之五十的patch,然后使用Fern classifier继续剔除无用的patch,最后用NN classifer(最近森林分类器)得到最终的若干个可能的Object patch,系统用一定的准则在跟踪器得到的一个patch和检测器得到的若干个patch中进行选择最终的包含目标的patch(当然检测器和跟踪器也可能根本得不到目标patch,这样的情况下系统也会有处理方法)。最后,根据确定的Object
patch,在其周围产生若干正样本和负样本用于检测器中 Fern classifer 和 NN classfier的update。
点评:TLD算法C++版的比较慢,Matlab版的比较快,它对目标经常消失于视野然后重新出来的场合下尤其有效,不过原作者的代码比较繁琐(Matlab+C)。下面是论文和Code的链接。
http://personal.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html
real-time compressIve tracking:不得不说的是,该算法的思想简练,代码精辟,且效果极好,不过在人物交叉的时候显然不如TLD。
该算法的主要思想是:根据compressIve representation原理,一个高维的稀疏向量H在满足某种条件时可以降维成低维向量L,且L保存了H的绝大部分信息。L=MH。其中,L维m维向量,H维n维向量(特别大),M为转换矩阵。根据该思想,算法首先构造一个固定的转换矩阵M(在算法运行过程中一直不变),在初始化object patch后,在离该patch比较近的地方提取正样本patch,在较远的地方提取负样本patch(他们可以看做为H,即高维向量)在经M降维后训练朴素贝叶斯分类器。然后在循环的每一帧处理过程中,首先在上一帧的patch位置附近构造不同大小的patch,然后将这些patch降维,用训练好的朴素贝叶斯分类器分类得到分数最高的patch,该patch就被认为当前帧中包含目标的patch,然后在该patch附近继续提取正样本和负样本,Update朴素贝叶斯分类器,就这样一直循环。论文和算法的链接见下面:
http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm
PS:本文会后续中继续分享我对别的Object trackingpaper的个人心得。
相关文章推荐
- 面向对象
- 关于MarshalByRefObject的解释
- Java中的Object类
- JSONException:java.lang.String cannot be converted to JSONObject
- Objective-C 对象和消息模型
- Objective-C对象模型及应用
- java中Array/List/Map/Object与Json互相转换详解
- Objective-C的方法声明和调用
- 《高效学习OpenGL》 之 深度测试 遮挡查询 glDepthFunc(), glGenQueries(), glBeginQuery(), glGetQueryObjectiv()
- Objective-C中字典的使用
- Objective-C中数组的使用
- Objective-C中字符串的使用
- 错误解决 error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such fil
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
- iPhone/Mac Objective-C内存管理教程和原理剖析
- js之ActiveX控件使用说明 new ActiveXObject()
- Python - 类(class)的变量 和 对象(object)的变量 详解 及 代码
- Python - 类(class)的变量 和 对象(object)的变量 详解 及 代码
- js之ActiveX控件使用说明 new ActiveXObject()
- 利用Java反射实现普通对象到JSONObject的转换