Tracking-Learning-Detection (TLD算法总结)
一、TLD算法简介
TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生ZdenekKalal在2012年7月提出的一种新的单目标长时间跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、鲁棒、可靠。
二、TLD framework
TLD是一个用于针对视频中未知物体长期跟踪的架构。简单来说,TLD算法由三部分组成:跟踪模块、检测模块、学习模块。跟踪模块是观察帧与帧之间的目标的动向。检测模块是把每张图看成独立的,然后去定位。学习模块将根据跟踪模块的结果对检测模块的错误进行评估,生成训练样本来对检测模块的目标模型进行更新,避免以后出现类似错误。
TLD跟踪系统最大的特点就在于能对锁定的目标进行不断的学习,以获取目标最新的外观特征,从而及时完善跟踪,以达到最佳的状态。也就是说,开始时只提供一帧静止的目标图像,但随着目标的不断运动,系统能持续不断地进行探测,获知目标在角度、距离、景深等方面的改变,并实时识别,经过一段时间的学习之后,目标就再也无法躲过。
TLD技术采用跟踪和检测相结合的策略,是一种自适应的、可靠的跟踪技术。TLD技术中,跟踪器和检测器并行运行,二者所产生的结果都参与学习过程,学习后的模型又反作用于跟踪器和检测器,对其进行实时更新,从而保证了即使在目标外观发生变化的情况下,也能够被持续跟踪。
三、TLD算法实现
1. detector 检测器的实现
检测器包括三个:一是方差检测器;二是随机深林;三是最近邻分类器;
step1 首先,输入一幅图,人工指定目标矩形框,然后通过在整幅图上进行扫面窗口得到一堆图像patch。
扫描窗口的实现:设定了21个尺度,在选定的目标矩形框大小基础上,向上梯度10个,向下梯度10个。尺度梯度为1.2,每个梯度下都进行窗口扫描,步进为窗口大小(宽度和高度都是10%)的10%,获取按照设定的扫描方式扫描得到整幅图像的patch。当然大小也有限制,最小窗口尺寸为15x15。
step 2 从patch中得到用于训练和测试的随机深林和最近邻分类器的样本。
选择的标准是从patch与目标矩形框的重叠度overleap,重叠度越大,越认为是正样本,重叠度越小就认为是负样本。具体的正样本和负样本见下图:
对于最近邻分类器,正样本只有一个就是best_box,即我们认为选定的或者是TLD输出的上一帧最好的结果。
step 3 方差分类器
利用平方积分图IIimage和积分图Iimage可快速计算任意patch的方差:var(patch) = IIimage(patch)- Iimage(patch)x Iimage(patch)。方差小于best_box的方差50%的patch就直接淘汰。只有通过方差分类器的才能进入随机森林
step 4 随机深林的训练和测试
这是随机深林的训练过程和测试过程:随机深林的大小为10棵树,树的大小为13个节点,每个节点都是一个基于像素比较的decisionstump。Decisionstump就是一个阈值切割,大于则为1,小于则为0;
Decisionstump的构造是随机的选取输入patch中的两点位置上的像素值进行比较,每棵树之间的decisionstump选取的点是随机的,同一颗树上的decisionstump也是随机的,所以称之为随机深林。但是,在随机深林初始化后,forest的结构也就固定了,每次通过随机深林时所对应的node节点上的decision
stump是固定的,即每一帧上对应的同一棵树上的同一个节点所代表的像素比较点的位置是固定的,因此才能进行后验概率的学习。
首先是将通过方差检测的图像patch,分别输入10棵树上,树的每个节点上进行一个特征的decisionstump切割,最后每棵树的输出为一个13位的二进制编码.
利用采集到的正样本和负样本对decisiontree的输出二进制值的后验概率进行学习:P(y|X)=pN/(pN+nN),有了这个我们就可以进行决策:10棵树的P之和与设定的阈值相比较就可以进行决策。而学习的过程就类似一个perception,犯错了才进P值的调整(犯了漏检则增加pN,犯了误检则增加nN)。
y |
0 |
0 |
…… |
0.7 |
1 |
X |
0 |
1 |
…… |
2^13-2 |
2^13-1 |
比如,输入的样本为(X,1),但是却小于阈值,被判定为负样本,则说明对应的P太小,需要提高,因此对P(1|X)进行增大。
测试过程:
利用测试集输入到训练好的随机深林中进行测试,主要是用来调整阈值。测试集都是负样本,从而统计负样本在随机深林上的得分,取得分最高的作为阈值。(这样所有的负样本基本上是不可能通过随机深林的)
step 5 最近邻分类器的训练和测试
最近邻分类器实际上就是在线的模板匹配,将输入的图像patch,通过仿射变换转变为15*15的patch,并进行0均值化,然后与在线的正样本模板和负样本模板进行匹配,计算对应的相关相似度和保守相似度。
最近邻分类器训练
最近邻分类器的训练过程其实就是更新在线模板的过程,如果输入的patch为正样本,但与在线的正、负模板pEx、nEx的相关相似度小于阈值,则分类错误,就将该输入的patch放入在线正模板pEx中。如果输入的patch为负样本,但与在线的正、负样本相关相似度大于阈值,则分类错误,就将该输入的patch放入负样本模板nEx中。效果就是动态地更新了在线模板
最近邻分类器测试
最近邻分类器的测试过程实际上跟随机深林的测试过程一样,为了调增对应的阈值,测试集全部是负样本,选取负样本中得到相关相似度最高的值作为最近邻分类器的分类阈值。
2. 中值流跟踪器的实现
TLD算法的跟踪模块(Tracker),是一种在名为中值流跟踪(Median-Flow tracker)的跟踪方法基础上增加了跟踪失败检测算法的新的跟踪方法。中值流跟踪方法利用目标框来表示被跟踪目标,并在连续的相邻视频帧之间估计目标的运动。
在TLD算法中,原作者将10*10的格子中的像素点作为初始特征点,并利用金字塔LK光流法来在连续的相邻视频帧之间估计若干特征点的运动。
跟踪模块的跟踪失败检测算法:
中值流跟踪算法的前提假设是目标是可见的,所以当目标完全被遮挡或者消失于视野,则不可避免地出现跟踪失败。为了能够解决这些问题,我们采用如下策略:
让di表示其中某一个点的移动位移, dm表示位移中值,则残差可定义为 |di-dm|。如果残差大于10个像素,那么就认为跟踪失败。这个策略能够很稳定地就确定出由剧烈移动或者遮挡所造成的跟踪失败。
获取points1和points2的10x10亚像素精度区域,并进行像素匹配,得到匹配度作为相似度的衡量。通过计算points1和FB_points之间的距离,并归一化,作为错误匹配度的衡量。
剔除50%相似度小的和50%错误匹配度大的特征点
3. 综合器的实现
综合器(Integrator)把检测器和跟踪器得到的目标框予以综合,并作为TLD最后的输出。如果跟踪器或者检测器都没有得到目标框,那么就认定当前帧中被跟踪目标没有出现的,否则,综合器将具有最大保守相似度的图像片作为最终的目标框所在位置。
)先通过 重叠度 对检测器检测到的目标boundingbox进行聚类,每个类的重叠度小于0.5:clusterConf(dbb,dconf,
cbb, cconf);
)再找到与跟踪器跟踪到的box距离比较远的类(检测器检测到的box),而且它的相关相似度比跟踪器的要大:记录满足上述条件,也就是可信度比较高的目标box的个数:if(bbOverlap(tbb,
cbb[i])<0.5 && cconf[i]>tconf)confident_detections++;
)判断如果只有一个满足上述条件的box,那么就用这个目标box来重新初始化跟踪器(也就是用检测器的结果去纠正跟踪器):if(confident_detections==1)
bbnext=cbb[didx];
)另外,如果跟踪器没有跟踪到目标,但是检测器检测到了一些可能的目标box,那么同样对其进行聚类,但只是简单的将聚类的cbb[0]作为新的跟踪目标box
4. 学习模块的实现
Learning实际上就是重新组织正负样本对随机森林和最近邻分类器进行训练。训练的方式跟上面讲解的一样。
什么时候重新组织训练呢?实际上只对有跟踪结果参与的目标输出进行训练。
对新得到的当前帧的TLD目标输出box进行最近邻的检测,得到与在线模型的正负模板的相关相似度,如果相关相似度比较小,或者方差比较小,或者已经在在线模型中了,就不用训练学习了。否则就在该输出的位置进行类似初始化时候的训练一样,随机深林的后验概率和最近邻分类器的在线模板进行更新。当然就没有了像初始训练中的将数据集拆分为训练集和测试集的过程了。
Tracking-Learning-Detection (TLD算法总结)的更多相关文章
- TLD算法
TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了! ...
- MBMD(MobileNet-based tracking by detection algorithm)作者答疑
If you fail to install and run this tracker, please email me (zhangyunhua@mail.dlut.edu.cn) Introduc ...
- TLD算法原理2--学习理解之(三)
TLD(Tracking-Learning-Detection)是一种新的单目标长时间(long term tracking)跟踪算法.该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算 ...
- TLD算法原理--学习理解之(二)
正如名字所示,TLD算法主要由三个模块构成:追踪器(tracker),检测器(detector)和机器学习(learning). 对于视频追踪来说,常用的方法有两种,一是使用追踪器根据物体在上一帧的位 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- [笔记]Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart
之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...
- [Object Tracking] Contour Detection through OpenCV
利用OpenCV检测图像中的长方形画布或纸张并提取图像内容 - 阅读笔记 相对来说,如下链接是此文的高阶方案版本,做对比是极好的. [Object Tracking] Contour Detectio ...
- Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart
之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...
- TLD算法概述--学习理解之(一)
liuyihai@126.com http://www.cnblogs.com/liuyihai/ TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zd ...
随机推荐
- python3爬虫--反爬虫应对机制
python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需 ...
- adb命令过滤w级别日志命令
adb logcat *:W 过滤某关键字日志 adb logcat *:W | find "woyihome" 过滤某关键字日志,生成txt文档 adb logcat *:W | ...
- DT资讯文章生成静态出现MySQL Error解决办法
今天有个朋友的DT系统生成静态出现 MySQL Query:SELECT * FROM [pre]article_21 WHERE status=3 and itemid<>516548 ...
- python完成数组格式的请求参数的加密计算
#输入 '''order_id:31489 join_course[0][join_tel]:13130999882 join_course[0][join_name]:任学雨 join_course ...
- urql 高度可自定义&&多功能的react graphql client
urql 是一个很不错的graphql client,使用简单,功能强大,通过exchanges 实现了完整的自定义特性 通过urql 的exchanges 我们可以实现灵活的cache策略 参考资料 ...
- linux命令之------Less命令
Less命令 1)作用:less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件. 2)ctrl+F 向前移动一屏: 3) ...
- vue-cli之路由独立成JS文件之后,如何在路由中获取vuex属性或者设置国际化i18n的当前使用语言
国际化vue-i18n的使用: import Vue from 'vue'; import VueI18n from 'vue-i18n'; // 引入语言包 import zh from '@/co ...
- 计蒜客——Reversion Count
Reversion Count 解析:题目数字的长度最大为 99,因此使用字符串处理,那么必然这些数存在某些规律.对于数 a (XYZW) 和数 b (WZYX),原式 = (1000X + 100Y ...
- JavaScript对象及面向对象
1.创建对象(1)自定义对象 语法:var 对象名称=new Object();(2)内置对象 String(字符串)对象. Date(对象)对象 Array(数组)对象 Boll ...
- Stringbuilde方法的用法以及其作用
Stringbuilde的方法有以下几种(常用的):(java中的语法) 在程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号来实现,但是这种方式达到目 ...