基于meanshift的目标跟踪小结(卡尔曼滤波及CAMshift)
近期学习了meanshift,kalman滤波器和CAMshift的原理,简单总结一下。
目标跟踪的分类
- 生成式模型(generative)
在当前帧对目标区域建模,下一帧寻找与模型最相似的区域为预测位置,比较著名的有卡尔曼滤波,粒子滤波,mean-shift。
但这一类方法没有考虑目标的背景信息,图像信息没有得到较好的应用。
- 判别式模型(discrimination)
将目标跟踪看作一个二元分类问题,提取目标和背景信息训练分类器,将目标从背景中分离出来,得到当前帧的目标位置。
如支持向量机,当前帧以目标区域为正样本,背景区域为负样本,用机器学习方法训练分类器,下一帧用训练好的分类器找最优区域。
而主流的方向似乎都是机器学习多一些,但自己还没有了解清楚原理。SVM的话以前接触过,但数学理论方面不过关,推导的话比较吃力,准备最近再试着学习一遍。
Mean Shift
即均值漂移算法,向概率密度最大的方向移动。
具体数学推导可以参考相关文章,这里简单说一下它的特点。
- 搜索窗口不变,每次的搜索半径一样
- 每次计算质心,向概率密度最大的方向移动
Kalman滤波器
有时候很佩服这些搞基础理论研究的前辈们,是他们的努力推动着科学的发展。有些理论可能这一辈子也看不到它的应用价值,再过了几十年后才会逐渐应用上,但幸运的是卡尔曼的理论在火箭发射上应用了,当年的计算机存储量和计算能力有限,换了这个算法后节省了空间提高了速度,具有跨时代的意义。
卡尔曼滤波器由预测部分和观测两部分组成。
预测部分是根据上一时刻的状态预测当前的状态,而观测部分是通过预测的状态计算出观测值。
形象一点理解,比如有一辆小车,匀速前进,那么你知道了上一时刻的速度,位置就可以预测出以后的状态,而实际观测的值呢,和你预测的值又有一些偏差,因此需要去修正。
通过了一系列的更新后,反馈,有点像经典控制理论中的闭环反馈一样,通过结果来不断的修正初值再得到更好一点的结果。
- 那么我们如何去建立数学模型来表示这个过程呢?
如果我们把目标的跟踪看成一个个点的移动,就可以抽象成一个数学模型,在某个位置上的一个点,向其他方向移动。
X呢,表示它的位置和速度的状态,而Z表示实际的观测值,也就是用实际的值来修正这个模型。
如果我们取一个很小的t,就可以近似的认为物体的运动是一个匀速的过程。
在更新的过程中,噪声是一个很关键的东西,用一个随机的东西加进来会让它的效果更好,让它有更好的适应能力,像SVM里的分类那种软的分类一样。噪声则根据矩阵的维度用随机数定义。
卡尔曼增益的更新我觉得是一个很精彩的部分,它是预测和观测更新的桥梁,下面展示一个关系图,可以直观的看出来他们的过程。
可以很清楚的看出他们的更新步骤,首先进行初始化,定义一下然后进行不断的用观测值来修正。即用Z来修正这个关系。
而应用到Mean Shift只需要把Mean Shift的结果给Z就可以得到更好的跟踪结果了。
CAMshift
当时看的时候也不懂,看到英文缩写一定要学习一下它的全称。
即continuously adaptive mean shift,也就是说它是mean shift算法的一个改进过程,通过不断的调整能自适应的调整搜索框的大小。
meanshift算法它本身的局限性上面提到了一句句,搜索窗口它是不变的!这样随着人物的走进,它并不能因为人物变大而去改变搜索窗口最后导致跟踪的效果很差。
CAM shift的特点总结一下就是
- 采用HSV分量中的H色调分量,对光线的影响较弱(相比RGB)
- 是连续的meanshift,搜索窗口会改变
那搜索窗口是怎么变的呢?
和mean shift一样,我们要寻找它的质心,计算窗口的概率密度,如果这个比设定小,说明有地方多余了,还需要缩小搜索窗口,如果大了呢,说明这个搜索窗口装不下,那么得扩大搜索窗口。
通过不断的更新搜索窗口来实现目标的跟踪。
不足和以后的方向
可能有些地方写的不好甚至有问题,希望大家指出来交流学习。
以后可以试着学习一下方向
- 遮挡问题
- 搜索框的角度变化
- 背景的滤波预处理
- 机器学习方向的目标跟踪
看近年的大多数是机器学习的,那么准备学习推导一下SVM的理论,让自己有点认识,如果有可能的话可以和meanshift结合一下改进。