MATLAB运动目标追踪--算法综述

经典目标追踪算法,在这个界面可以对现在的各种算法有比较好的了解---》https://www.zhihu.com/question/26493945

 

以下转载自知乎关于卡尔曼的相关部分:
 

相信学过现代控制原理的同学都明白,状态方程是根据上一时刻的状态对这一时刻的估计,好,问题来了,为什么要估计,因为我们采得到的图像有噪声(或者直接说有误差,简单的大白话的感觉就是,你遍历的图像数据,第一,图像本身就采集的不准,第二,遍历的不准,因为图形的遍历一般是基于各种特征进行的,所以肯定是会存在特征丢失,导致不准,还有你的遍历算法也会不准)所以,即使你采用诸如遗传算法等高级一点的算法进行遍历,也没有卵用,因为就不准。那有没有什么方法可以消除这种“不准”呢?好啦,大名鼎鼎的卡尔曼滤波出来了,卡尔曼滤波的重要核心就是可以计算对下一时刻的估计。听起来很悬乎对不对。简单来说,你的状态方程可以进行估计,那么你的观测方程可以对估计进行纠正。也就是说,我自己首先会有一个底,大概我算出来的值,或者说我这个图形遍历的匹配率大概是多少,比如说我用状态方程算出这个点的匹配率是0.8,观测方程算出来是0.9,那么我觉得这个0.9可能是存在偏差的,那我把这点的匹配率取个0.85怎么样(当然真正的卡尔曼算法里不是简单的取平均值,而是利用了协方差。重点在于思想),所以很清楚啦。这就是为什么我们需要对下一时刻进行估计,就是为了消除这种“不准”。

接下来我们来讨论一下为什么要使用粒子滤波呀?

首先。卡尔曼滤波有一个很大的前提,那就是a、系统噪声必须是符合高斯分布(也就是正态分布)。b、必须是线性系统。(当然,EKF通过将非线性系统线性化的方法处理非线性系统)。这俩个点,实际的操练中还真的挺难同时满足的,例子我就不举了。

粒子滤波的好处在于,对系统没啥要求。兵来将挡,水来土掩。嘻嘻嘻。因为粒子滤波的核心思想就是就是基于奖励惩罚机制(强化学习)的优化~~~~首先,根据状态转移方程,对于每个粒子的位置进行更新。但是这个更新只是基于dead reckon得到的,我们要融合绝对定位与相对定位,绝对定位的信息还没有融合进去呢。根据状态转移方程得到的新状态到底行不行?能有多大的概率?这还取决于绝对定位的结果也就是输出方程。把状态转移方程的结果代入输出方程,得到一个输出,这个输出是估计值,而根据绝对定位的观测,这个值对应的观测值 也是可以测量得到的,现在这两个值之间有个差额,很明显,这个差额越小,刚才的到的状态越可信,这个差额越大,状态越不可信。好,就把这个指标作为评估函数(像GA,pso等优化算法里的evaluation function),来修正各个状态的估计概率。。。。简单地说就是,我一开始在整个地图上均匀分配一大波粒子(当然有改进的预处理算法,可以事先往正确点靠,减少计算量),每个粒子都可以算出一个估计值对不对,然后咱们再得到一个实际的观测值,那么把和观测值相差较小的粒子留下来。。。(具体留多少个粒子需要根据你系统模型,当然现在也有自适应的算法,可以自己改变留下来的粒子数目),这样每个粒子都有一个和观测值的差值,然后再进行下一次同样方法的更新(这个过程叫做重采样),最后我们就会留下可信度非常高的粒子啦。。这一般就是最后的正确值。。。。。

最后,我们再简单讨论一下,为什么粒子算法这么好,卡尔曼还用的这么广?

其实通过我的介绍,大家也能发现,粒子滤波的计算量比卡尔曼滤波大的不是一个数量级的。 - - 。卡尔曼滤波一次估计花了几个简单的数学公式(甚至我可以用手算,我们学校期末考试出了一道卡尔曼滤波的手推题,也是。。。大部分人都能算出来)。。。。然而粒子滤波。。。呵呵哒。经历了那么多次迭代。才估计出来了 。 。。。- - 虽然你比卡尔曼精准。。但是我还是不得不吐槽一下。。(这里其实更需要吐槽的是另一种滤波算法——马尔卡夫算法,具体计算量怎么大,自行google)所以呀 ,在我们不需要精度很高的时候,卡尔曼滤波还是非常好用的。。。吧,好久没来填坑了,我现在来填坑,至于程序,程序github多的是,就不贴了,图在日后填坑吧。多目标我的程序,需要等paper发表后给大家贴出来。

先说一下为什么卡尔曼要来跟踪。

如果纯度跟踪算法,而不是基于detection,或是最近特火的类TLD算法(注意一个‘类’子,他包含很多),跟踪算法其实是解决传感器的检测问题,我们很多时候把传感器想的太理想了,特别是仿真的时候,其实噪声还是很多的,同时目标可能有时能检测到有时检测不到,你可以想象一个人从你面前跑过去,其实不一定你每一眼都看见了他,但是也不影响你对他的跟踪,为什么?因为你自动补全了信息,如果你看得是马拉松,很多人都在跑,为什么你能跟踪这个呢?有人说他长的不一样,如果我脸盲+他们是一个代表队的,我想我努努力还是能跟上他的,为什么?因为我对他的之前信息有推断,对他下一秒有期望,我还是能跟上他的,这个过程不仅是跟踪过程,也是一个滤波过程,所以跟踪算法就是滤波算法,卡尔曼所以是能解决跟踪问题的。

多目标的问题,其实问题很多,我们先假设一下吧,高斯,线性运动,(这个大家用卡尔曼必须这么假设)同时目标数目不能变(变数目的话,也能解决,需要引入detection,如果引入detection,我觉得就是耍流氓,为什么耍流氓,我最后说), 这时你就需要迭代了,假设目标为A,B,C,第一次迭代,假设A为跟踪物体,B,C为噪声,跟踪一遍,第二次假设B为跟踪物体,A,C为噪声,以此类推,。。。所以他的缺点明显,对于遮挡基本无解,同时这几个迭代运算量特别大。

为什么说detection耍流氓?因为现在Detection比tracking 要准确的很多,唯一缺点就是速度慢,所以需要用detection给算法家flag的,我觉得就是耍流氓,现在电脑运算那么快,GPU一跑都没事,为什么你不直接detection?跟踪的根本作用是跟踪那些不可检测的物体,没有特征的物体,比如数据,或者相似物体,同时它对于形变和遮挡都比detection靠谱,所以我个人很讨厌增加额外信息在增加系统鲁棒性的算法还有就是一对参数的算法,在我心里好的算法应该是用精简的语言+尽可能少的信息来获得最准确的答案。

跑题这么多了,最后说一下,因为Kalman问题这么多,多目标我们一般不会去用Kalman,而是用粒子滤波和PHD滤波。

本人在读相关的博一,所以很多理解不到位的欢迎指正,欢迎邀请回答问题,但是本人很笨很懒,代码图片需要经过小组同一才能上传。

编辑于 2016-05-11

在检测很准的情况下,现在基于的深度学习的检测算法,比如ssd都可以较为准备的检测目标,但是不论检测有多准,漏检的问题是无法避免的,比如目标间相互遮挡,等等,甚至就是漏检。当发生这种情况时才能体现出卡尔曼滤波的作用,虽然我没有检测到,但是我能根据之前的运动状态估算出当前目标的位置,当目标再次出现时重新跟踪上目标,我认为这一点是kalman的意义所在。

但是在图像处理中,观测信息可能并不稳定,特别是摄像头将实际的三维信息投影到二维平面上,目标运动的位置信息中噪声较多,因此即使你检测的很准确,但是kalman也无法完全精准的预测。

特别是在多目标追踪中,当两个目标运动参数极为相似时,卡尔曼也无法分辨出两个目标。这是就需要对目标进行一些特征计算的工作了。

感觉干货满满
http://votchallenge.net/vot2016/trackers.html

http://cvlab.hanyang.ac.kr/tracker_benchmark/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值