———————————————————————————————————————————————————————————————————————————
注:在OpenCV中有背景提取的函数,在OpenCV中BackgroundSubtractor类型下面的几个函数中BackgroundSubstractorMOG2就是对高斯混合模型的C++实现。如果想看源代码可以直接去OpenCV文件夹下自行查找。另外,还有一个函数BackgroundSubstractorKNN,我测试的效果比前一个更好,后面会介绍KNN对应的模型。
———————————————————————————————————————————————————————————————————————————
本文介绍高斯混合模型(Gaussian mixture model,简称GMM)及其推导。从数学角度来看待该模型。该模型是对单一高斯概率密度函数的扩展延伸。可以对任意形状的密度分布进行平滑的近似。其在图像处理领域,可以实现提取背景图像。
假设一组d维度的点,i=1,2,3....n,如果这些点的分布近似椭圆球形,那么我们可以使用高斯密度函数进行刻画:
其中: μ为中心点,∑ 代表此密度函数的共变异矩阵,这些参数决定了函数形状的中心,宽幅,走向等等。
注释:共变异矩阵也就是协方差矩阵,分别为m与n个标量元素的列向量随机变量X与Y,二者对应的期望值分别为μ与ν,这两个变量之间的协方差定义为m×n矩阵
(来自维基百科)
最佳的用来描述这些点的参数值的计算方法,则可以采用概率论中的极大似然估计(MLE,Maximum Likelihood Estimation)来计算。在上述概率密度分布函数下,假设Xi为相互独立的事件,那么发生X={x1,x2,x3...xn}的概率密度为
由于X已经发生,因此我们只需要找出μ和∑即可使得p(X;μ,∑)有最大值。使用极大似然估计MLE,转化到计算J(μ,∑)的最大值上去。
想求得μ的最佳结果,有最值问题可知,J对μ,∑分别计算偏导数即可:
令等式为零,解得
对于∑的计算可以参考高等分析的资料,结果为
第一部分中的结果是基于椭球状的分布假设之上的,如果不满足该假设,那么就需要用到数个高斯函数的加权平均来表示。以三个高斯函数为例
其概率密度函数的参数(α1,α2,α3,μ1,μ2,μ3,∑1,∑2,∑3),并且α1,α2,α3,要满足以下条件:
α1+α2+α3=1
以此种方式表示的概率密度函数称之为“高斯混合密度函数”或“高斯混合模型(Gaussian Mixture Model)”,简称GMM。
在该模型中,为了简化讨论,假设各个高斯密度函数的协方差矩阵可表示为:
此时单一的高斯密度函数可以表示为:
讲义中省略下表j,从而简化方程。对方程中的各个参数进行微分计算,从而得到:
当协方差矩阵为一个常数和一个单位阵的乘积时,上面的P(x)可以简化为
此时p(x)的参数θ=(α1,α2,α3,μ1,μ2,μ3,∑1,∑2,∑3),参数个数为1+1+1+d+d+d+1+1+1=6+3d
同理根据极大似然估计MLE,可以求得θ的最佳解。由:
为方便计算,引入数学符号:
即贝叶斯公式:
因此βj(x)可以看成是下列事件的概率:观测到的随机数x,则对应的是有第j个高斯密度函数所产生的。欲求J(θ)的最大值,使用微分:
两式分别为零得:
此外,计算微分时,α(WOW,在csdn上输入数学字符时太痛苦了),依旧需要满足之和为1的条件,因此,使用拉格朗日乘数法(Lagrange Multiplier),并且新的目标函数设为Jnew
三个式子相加,从而
进而得到(1)(2)(3)三个含有6+3d个未知变量的方程。使用迭代法进行计算,得到最后的结果。
1.设定一个起始参数数值θ=(α1,α2,α3,μ1,μ2,μ3,σ1^2,σ2^2,σ3^2),讲义中是选用α1=α2=α3=1/3,并使用K-means的方式计算中心点作为,μ1,μ2,μ3;
2.使用θ计算βi(1,2,3...n);
3.计算新的μj:
4.计算新的σj
5.计算新的αj
6.令(里面输错了),如果θ减去新的θ,后的内积小于某个设定数值,结束,否则返回第二步;
该方案能够逐步收敛到局部最大值,但并不一定是全局最大,因此在下一篇文章中给出另一种方法,并给出其证明过程。