Mean Shift(均值漂移)原理及在视频跟踪中的使用

MeanShift(均值漂移)

MeanShift(均值漂移)的核心思想就是通过计算均值,将一个点移动到密度最大的地方。具体的实现步骤及原理,通过迭代随机选择一个特征点作为圆心,计算设置的半径范围内所有的特征点到圆心的向量,圆心是七点起点。最终得到一个向量,这个向量就是这个选择的圆心将要移动的距离和方向;继续迭代到当这个向量的模小于设置的阈值的时候,停止迭代,这个点就是我们要找的中心点。

计算公式就是:

给定\(d\)维空间\(R_d\)的\(n\)个样本点 ,\(i=1,…,n\),在空间中任选一点\(x\),那么Mean Shift向量的基本形式定义为:

\[M_{h}=\frac{1}{K} \sum_{x_{i} \in S_{k}}\left(x_{i}-x\right) \]

\(S_k\)是一个半径为h的高维球(这里我们就讨论的二位图像)区域,满足以下关系的y点的集合,

\[S_{h}(x)=\left\{y:\left(y-x_{i}\right){T}\left(y-x{i}\right)<h^{2}\right\} \]

\(k\)表示在这\(n\)个样本点\(x_i\)中,有\(k\)个点落入\(S_k\)区域中.

MeanShift示意图


任选一个点,然后以这个点为圆心,h为半径做一个高维球,因为有d维,d可能大于2,所以是高维球。落在这个球内的所有点和圆心都会产生一个向量,向量是以圆心为起点落在球内的点位终点。然后把这些向量都相加。相加的结果就是下图中黄色箭头表示的MeanShift向量。

Mean Shift(均值漂移)原理及在视频跟踪中的使用

然后,再以这个MeanShift 向量的终点为圆心,继续上述过程,又可以得到一个MeanShift 向量。

Mean Shift(均值漂移)原理及在视频跟踪中的使用

MeanShift算法在视频目标跟踪中的应用


MeanShift算法在视频跟踪中的应用首先就需要建立向上面一样的特征点用于计算加和的向量。这里不能直接用图像中的像素值来作为向量,我个人的理解就是图像中的像素并没有什么特别的地方,这个选择特征点呢!

那么就必须对图像进行处理才能得到我们想要的特征图,方法就是获取反向投影图。

反向投影图

反向投影图的获取

首先我们需要得到上一帧中的感兴趣区域(也就是目标区域),就是我们平时所理解的给定的第一帧的目标区域,我们的目标就是在下一帧中找到这上一帧的给定的目标区域相识的区域。

比如下图中红色框中的人是我们要跟踪的对象,我们需要统计这个框中的颜色直方图(表示的是框里面的个像素值出现的次数,这里我们需要做归一化处理,像素值出现的次数可以大于255)。就得到0-1之间的概率值,可以这么理解。
Mean Shift(均值漂移)原理及在视频跟踪中的使用
Mean Shift(均值漂移)原理及在视频跟踪中的使用

然后到下一帧图像中,去对应整张图像的像素值,对应到的0-1之间的概率值。可以根据这个概率值进行阈值分割,就可以得到如上面所示的分割图像。感觉上面这个图并没有做阈值分割(这是我在网上找到的图)。

MeanShift会存在一些问题,就是上图中的红色的车和和穿红色衣服的人之间,如果距离很近的话就会造成跟踪错误,因为他们的方向投影图都很相似。

我们随机选取一个比较亮的值来作为特征点,就可以进行上面的均值漂移操作了。

补充:

颜色直方图的地方,一般将RGB图像转化为了HSV图像,原因在于在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在 OpenCV 的 HSV 格式中,H(色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]),,然后得到H(色调)的这个通道的分布直方图,即表示不同颜色出现的频数,这个H(色调)这个通道的直方图分布指的是在第一帧所框住的目标图像的(即便也就是目标的直方图分布)。

在MeanShift中加入核函数


为什么要在MeanShift中加入核函数?

\[M_{h}=\frac{1}{K} \sum_{x_{i} \in S_{k}}\left(x_{i}-x\right) \]

上面的公式表示所有的相加的权重的是一样的,如果极个别的特征点在里中心点比较远的地方,就容易参数比较大的误差。如果我们在这里加上核函数,即便就是在前面加上了一个权重值,距离越远权重值就越小,距离越近权重值就越大,就可以抵消一些特殊的特征点造成的误差影响。

改进后的向量叠加公式为:

\[M_{h}(X)=\frac{\sum_{X^{i} \in S_{h}}\left[K\left(\frac{X^{i}-X}{h}\right) \cdot\left(X^{i}-X\right)\right]}{\sum_{X^{i} \in S_{h}}\left[K\left(\frac{X^{i}-X}{h}\right)\right]} \]

其中\(K\left(\frac{X^{i}-X}{h}\right)\)表示高斯核函数。高斯核函数的对应权重示意图如下。相减越接近0,权重值就越大。上面公式下面是权重值相加,原来是\(K\)。

上一篇:Numpy.mean() 关于axis参数的理解


下一篇:枚举