均值漂移(Meanshift)算法理解
1.均值漂移的基本概念:沿着密度上升方向寻找聚簇点
设想在一个有N个样本点的特征空间
初始确定一个中心点center,计算在设置的半径为D的圆形空间内所有的点(xi)与中心点center的向量
计算整个圆形空间内所有向量的平均值,得到一个偏移均值
将中心点center移动到偏移均值位置
重复移动,直到满足一定条件结束
2.均值漂移运算:
2.1 Mean shift的基础公式:
偏移均值
Sh:以x为中心点,半径为h的高维球区域; k:包含在Sh范围内点的个数; xi:包含在Sh范围内的点
中心更新
将中心点移动到偏移均值位置
Mt为t状态下求得的偏移均值; xt为t状态下的中心
2.2 引入核函数的偏移均值:
核函数
核函数只是用来计算映射到高维空间之后的内积的一种简便方法,目的为让低维的不可分数据变成高维可分。利用核函数,可以忽略映射关系,直接在低维空间中完成计算。
引入核函数的偏移均值
在均值漂移中引入核函数的概念,能够使计算中距离中心的点具有更大的权值,反映距离越短,权值越大的特性。改进的偏移均值:
其中,x为中心点;xi为带宽范围内的点;n为带宽范围内的点的数量;g(x)为对核函数的导数求负
3.均值漂移的应用:
聚类(K均值聚类)
图像分割(将图像映射到特征空间,对采样点进行均值漂移聚类)
对象轮廓检验(光线传播算法)
目标跟踪(求解最优化Bhattacharya系数函数)
4.均值漂移跟踪过程:
针对meanshift 的计算过程, 有人脸box(就是需要跟踪的区域),还有就是原图(就是输入图像,这个图像中包含了人脸)
刚开始box标记在人脸上(第一帧,完全正确!),接下来的一帧 --- 新的一帧中(人脸移动了,但是box还在原处),现在就要移动box跟踪人脸,
也就是在新的一帧中找人脸(如果直接检测就完全不需要跟踪啦。跟踪的目的就是减少检测的次数,因为检测太费劲!)
那么就需要找出这一帧(新的一帧)中哪个区域与人脸(第一帧的box)比较相似了!!!
至此有了一个大的概念,在新的一帧中差找与人脸最相似的区域,并将box移动过去。
又会有两个问题:
(1)相似不相似怎么计算?
(2)相似不相似怎么表现呢?
对于第一个问题:
有个叫什么皮尔逊相关性计算的公式,这里就不在细说。大概的意思是这样的,判断两个图像的相似性,可以通过计算两个图像直方图分布来计算。
计算box图像与图像块1的相关性,可以得到一个[0,1]之间的数。
这样得到一个相关性图(概率图),每一个像素的值都是[0,1]的小数。这也没法看啊!!!怎么办???
劳动人民的智慧还是不错滴,将[0,1]映射到[0,255]就产生一张灰度图了。相关性越高的地方,在灰度图中就越亮。也就是第一张图中的各种点。我感觉这个灰度图就是反向投影图!!!不再解释,被其他博客的人坑了好长时间!
下面将计算第一个点是如何迈出它的第一步的:
似不似算出来的移动有点大,有点大,不用怕,第二次迭代的时候就修正过来啦!!!
貌似,我这种只是一种可见的方式,肯定还会有其他的移动方式,比如计算质心什么玩意的。对不对,大笨狗始终是大笨狗。
opencv官方文档中的meanshift迭代过程: