paper 62:高斯混合模型(GMM)参数优化及实现

高斯混合模型(GMM)参数优化及实现 (< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:office:smarttags" />2010-11-13)

1 高斯混合模型概述< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

高斯密度函数估计是一种参数化模型。有单高斯模型(Single Gaussian Model, SGM)和高斯混合模型(Gaussian mixture model,GMM)两类。类似于聚类,根据高斯概率密度函数(PDF,见公式1)参数的不同,每一个高斯模型可以看作一种类别,输入一个样本< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" /> ,即可通过PDF计算其值,然后通过一个阈值来判断该样本是否属于高斯模型。很明显,SGM适合于仅有两类别问题的划分,而GMM由于具有多个模型,划分更为精细,适用于多类别的划分,可以应用于复杂对象建模。

下面以视频前景分割应用场景为例,说明SGM与GMM在应用上的优劣比较:

l        SGM需要进行初始化,如在进行视频背景分割时,这意味着如果人体在前几帧就出现在摄像头前,人体将会被初始化为背景,而使模型无法使用;

l        SGM只能进行微小性渐变,而不可突变。如户外亮度随时间的渐变是可以适应的,如果在明亮的室内突然关灯,单高斯模型就会将整个室内全部判断为前景。又如,若在监控范围内开了一辆车,并在摄像头下开始停留。由于与模型无法匹配,车会一直被视为前景。当车过很长时间离去时,由于车停留点的亮度发生了很大的变化,因此已经无法与先前的背景模型相匹配;

l        SGM无法适应背景有多个状态,如窗帘,风吹的树叶。单高斯模型无法表示这种情况,而使得前背景检测混乱,而GMM能够很好地描述不同状态;

l        相对于单高斯模型的自适应变化,混合高斯模型的自适应变化要健壮的多。它能解决单高斯模型很多不能解决的问题。如无法解决同一样本点的多种状态,无法进行模型状态转化等。

2 理论说明部分

因博客中无法编辑公式,故详细文档见这里。代码如下:

3 源码

3.1 单高斯模型

下面代码实现了SGM,并实现了人脸肤色检测。其中图像处理、矩阵运算采用了openCV库函数

/*****************************************************************************

       Single Gaussian Model for skin color extraction

       Param:

              img -- input image to extract the face region

              skinImg -- result

*****************************************************************************/

void CSkinColor::RunSGM(IplImage *img, IplImage **skinImg)

{

       if (img == NULL) return -1;

       //////////////////////////////////////////////////////////////////////////

       // 以下参数一组(117.4361,156.5599)来自源码 light2,与文章《王航宇:基于 YCbCr 高斯肤色模型的

       // 人脸检测技术研究》相同,另一组来自源码“肤色检测正式版”(103.0056, 140.1309)

       double M[]={103.0056, 140.1309}/*{117.4361,156.5599}*/;//M 为肤色在 YCbCr 颜色空间的样本均值(Cb, Cr),经验值

       double C[2][2]={{160.1301,12.1430},//C 为肤色相似度模型的协方差矩阵,同上为经验值

              {12.1430,299.4574}};// 注:因为运算仅需要该矩阵的逆矩阵值,故该值没有使用,仅作参考

       double invC[2][2]={0.0077 ,-0.0041,-0.0041 ,0.0047

       };//Ct 为C的逆矩阵值,由matlab计算而得

       //////////////////////////////////////////////////////////////////////////

       IplImage* pImg = img;

       double CrMean=0,CbMean=0,YMean=0;

       // 1 颜色转换:BGR->YCrCb

       IplImage*imgYCrCb=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);// YCrCb图像

       cvCvtColor(pImg, imgYCrCb, CV_BGR2YCrCb);// 第0,1,2层分别为Y,Cr,Cb

       IplImage *imgY = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);// YCrCb图像

       IplImage *imgCr = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);// YCrCb图像

       IplImage *imgCb = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);// YCrCb图像

       IplImage *imgY32 = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_32F,1);// YCrCb图像

       IplImage *imgCr32 = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_32F,1);// YCrCb图像

       IplImage *imgCb32 = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_32F,1);// YCrCb图像

       cvSplit(imgYCrCb, imgY, imgCr, imgCb, NULL);

       cvConvert(imgY, imgY32);

       cvConvert(imgCr, imgCr32);

       cvConvert(imgCb, imgCb32);

       //////////////////////////////////////////////////////////////////////////

       // 2 根据Sigle Gaussian Model计算颜色模型

       IplImage *PCbCr=cvCreateImage(cvGetSize(pImg), IPL_DEPTH_32F, 1);//YCrCb颜色模型

       IplImage *tempA=cvCreateImage(cvGetSize(pImg), IPL_DEPTH_32F, 1);//YCrCb颜色模型

       IplImage *tempB=cvCreateImage(cvGetSize(pImg), IPL_DEPTH_32F, 1);//YCrCb颜色模型

       cvSubS(imgCb32, cvScalar(M[0]), imgCb32);// x-m

       cvSubS(imgCr32, cvScalar(M[1]), imgCr32);// x-m

       cvAddWeighted(imgCb32, invC[0][0], imgCr32, invC[1][0], 0, tempA);

       cvAddWeighted(imgCb32, invC[0][1], imgCr32, invC[1][1], 0, tempB);

       cvMul(imgCb32, tempA, tempA, -0.5);

       cvMul(imgCr32, tempB, tempB, -0.5);

       cvAdd(tempA, tempB, PCbCr);

       cvExp(PCbCr, PCbCr);

       double max_val=0,min_val=0;

       cvMinMaxLoc(PCbCr,&min_val,&max_val);

       IplImage *proImg=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U, 1);//YCrCb颜色模型

       double a=255/(max_val);

       cvConvertScaleAbs(PCbCr,proImg,a,0);

       m_proimg = cvCloneImage(proImg);

       if ((*skinImg)!=NULL) cvReleaseImage(skinImg);

       *skinImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U, 1);//肤色结果

       // 释放内存

       cvReleaseImage(&proImg);

       cvReleaseImage(&imgYCrCb);

       cvReleaseImage(&imgY);

       cvReleaseImage(&imgCr);

       cvReleaseImage(&imgCb);

       cvReleaseImage(&imgY32);

       cvReleaseImage(&imgCr32);

       cvReleaseImage(&imgCb32);

       cvReleaseImage(&PCbCr);

       cvReleaseImage(&tempA);

       cvReleaseImage(&tempB);

}

  

3.1高斯混合模型

(1)以下matlab代码实现了高斯混合模型:

function [Alpha, Mu, Sigma] = GMM_EM(Data, Alpha0, Mu0, Sigma0)

%% EM 迭代停止条件

loglik_threshold = 1e-10;

%% 初始化参数

[dim, N] = size(Data);

M = size(Mu0,2);

loglik_old = -realmax;

nbStep = 0;

Mu = Mu0;

Sigma = Sigma0;

Alpha = Alpha0;

Epsilon = 0.0001;

while (nbStep < 1200)

  nbStep = nbStep+1;

  %% E-步骤 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  for i=1:M

    % PDF of each point

    Pxi(:,i) = GaussPDF(Data, Mu(:,i), Sigma(:,:,i));         

  end

  % 计算后验概率 beta(i|x)

  Pix_tmp = repmat(Alpha,[N 1]).*Pxi;

  Pix = Pix_tmp ./ (repmat(sum(Pix_tmp,2),[1 M])+realmin);

  Beta = sum(Pix);

  %% M-步骤 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  for i=1:M

    % 更新权值

    Alpha(i) = Beta(i) / N;

    % 更新均值

    Mu(:,i) = Data*Pix(:,i) / Beta(i);

    % 更新方差

    Data_tmp1 = Data - repmat(Mu(:,i),1,N);

    Sigma(:,:,i) = (repmat(Pix(:,i)‘,dim, 1) .* Data_tmp1*Data_tmp1‘) / Beta(i);

    %% Add a tiny variance to avoid numerical instability

    Sigma(:,:,i) = Sigma(:,:,i) + 1E-5.*diag(ones(dim,1));

  end

%  %% Stopping criterion 1 %%%%%%%%%%%%%%%%%%%%

%  for i=1:M

    %Compute the new probability p(x|i)

%    Pxi(:,i) = GaussPDF(Data, Mu(:,i), Sigma(i));

%  end

  %Compute the log likelihood

%  F = Pxi*Alpha‘;

%  F(find(F<realmin)) = realmin;

%  loglik = mean(log(F));

  %Stop the process depending on the increase of the log likelihood

%  if abs((loglik/loglik_old)-1) < loglik_threshold

%    break;

%  end

%  loglik_old = loglik;

  %% Stopping criterion 2 %%%%%%%%%%%%%%%%%%%%

  v = [sum(abs(Mu - Mu0)), abs(Alpha - Alpha0)];

  s = abs(Sigma-Sigma0);

  v2 = 0;

  for i=1:M

    v2 = v2 + det(s(:,:,i));

  end

  if ((sum(v) + v2) < Epsilon)

    break;

  end

  Mu0 = Mu;

  Sigma0 = Sigma;

  Alpha0 = Alpha;

end

nbStep

  

(2)以下代码根据高斯分布函数计算每组数据的概率密度,被GMM_EM函数所调用

function prob = GaussPDF(Data, Mu, Sigma)

%

% 根据高斯分布函数计算每组数据的概率密度 Probability Density Function (PDF)

% 输入 -----------------------------------------------------------------

%   o Data:  D x N ,N个D维数据

%   o Mu:    D x 1 ,M个Gauss模型的中心初始值

%   o Sigma: M x M ,每个Gauss模型的方差(假设每个方差矩阵都是对角阵,

%                                   即一个数和单位矩阵的乘积)

% Outputs ----------------------------------------------------------------

%   o prob:  1 x N array representing the probabilities for the

%            N datapoints.    

[dim,N] = size(Data);

Data = Data‘ - repmat(Mu‘,N,1);

prob = sum((Data*inv(Sigma)).*Data, 2);

prob = exp(-0.5*prob) / sqrt((2*pi)^dim * (abs(det(Sigma))+realmin));

  

(3)以下是演示代码demo1.m

% 高斯混合模型参数估计示例 (基于 EM 算法)

% 2010 年 11 月 9 日

[data, mu, var, weight] = CreateSample(M, dim, N);  // 生成测试数据

[Alpha, Mu, Sigma] = GMM_EM(Data, Priors, Mu, Sigma)

  

(4)以下是测试数据生成函数,为demo1.m所调用:

function [data, mu, var, weight] = CreateSample(M, dim, N)

% 生成实验样本集,由M组正态分布的数据构成

% % GMM模型的原理就是仅根据数据估计参数:每组正态分布的均值、方差,

% 以及每个正态分布函数在GMM的权重alpha。

% 在本函数中,这些参数均为随机生成,

%

% 输入

%   M    : 高斯函数个数

%   dim  : 数据维数

%   N    : 数据总个数

% 返回值

%   data : dim-by-N, 每列为一个数据

%   miu  : dim-by-M, 每组样本的均值,由本函数随机生成

%   var  : 1-by-M, 均方差,由本函数随机生成

%   weight: 1-by-M, 每组的权值,由本函数随机生成

% ----------------------------------------------------

%

% 随机生成不同组的方差、均值及权值

weight = rand(1,M);

weight = weight / norm(weight, 1); % 归一化,保证总合为1

var = double(mod(int16(rand(1,M)*100),10) + 1);  % 均方差,取1~10之间,采用对角矩阵

mu = double(round(randn(dim,M)*100));            % 均值,可以有负数

for(i = 1: M)

  if (i ~= M)

    n(i) = floor(N*weight(i));

  else

    n(i) = N - sum(n);

  end

end

% 以标准高斯分布生成样本值,并平移到各组相应均值和方差

start = 0;

for (i=1:M)

  X = randn(dim, n(i));

  X = X.* var(i) + repmat(mu(:,i),1,n(i));

  data(:,(start+1):start+n(i)) = X;

  start = start + n(i);

end

save(‘d:\data.mat‘, ‘data‘);

  

时间: 2024-10-13 01:47:59

paper 62:高斯混合模型(GMM)参数优化及实现的相关文章

贝叶斯来理解高斯混合模型GMM

最近学习基础算法<统计学习方法>,看到利用EM算法估计高斯混合模型(GMM)的时候,发现利用贝叶斯的来理解高斯混合模型的应用其实非常合适. 首先,假设我们对于贝叶斯比较熟悉,对高斯分布也熟悉.本文将GMM用于聚类来举例. 除了简单的高斯分布,理论上通过组合多个不同的高斯分布可以构成任意复杂的分布函数.如下图所示: 在最大似然,贝叶斯方法与朴素贝叶斯分类中,2.1中提到高斯概率密度用来计算连续变量情况下的朴素贝叶斯概率.该情况下的高斯分布是训练已知,然后对于输入变量求取其概率密度,结合类别的先验

6. EM算法-高斯混合模型GMM+Lasso详细代码实现

1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模型)带惩罚项的详细代码实现. 2. 原理 由于我们的极大似然公式加上了惩罚项,所以整个推算的过程在几个地方需要修改下. 在带penality的GMM中,我们假设协方差是一个对角矩阵,这样的话,我们计算高斯密度函数的时候,只需要把样本各个维度与对应的\(\mu_k\)和\(\sigma_k\)计算一维

高斯混合模型(GMM)

1. 有时候单一高斯分布不能很好的描述分布 image.png 上图左面用单一高斯分布去描述,显然没有右图用两个高斯分布去描述的效果好. 2. 引入混合高斯分 这里插一句,为什么是“高斯混合模型”,而不是别的混合模型,因为从中心极限定理知,只要K足够大,模型足够复杂,样本量足够多,每一块小区域就可以用高斯分布描述.而且高斯函数具有良好的计算性能,所GMM被广泛地应用. 单一高斯分布公式 image.png 混合高斯分布 每个GMM由K个高斯分布组成,每个高斯分布称为一个组件(Component)

高斯混合模型GMM

1.简介 众所周知,GMM(Gaussian Mixture-based Model)是用来分离场景中前景和背景的,或者叫做背景扣除,那么什么叫做背景扣除(Background Subtraction)呢?我们知道所谓的监控系统中,通常都是利用静态相机来捕捉场景的,因此其中比较具有挑战的一步就是如何检测出场景中的突然闯入者,传统的应用中都会假设场景中没有这样的闯入者,而在实际监控场景中,这种情况却是实实在在存在发生的,所以我们不能忽略.对于闯入者的检测,如果我们知道一个场景的统计模型,那些不服从

K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!

1. 聚类算法都是无监督学习吗? 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征.聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术. 常用的算法包括K-MEANS.高斯混合模型(Gaussian Mixed Model,GMM).自组织映射神经网络(Self-Organizing Map,SOM)

EM算法原理以及高斯混合模型实践

EM算法有很多的应用: 最广泛的就是GMM混合高斯模型.聚类.HMM等等. The EM Algorithm 高斯混合模型(Mixtures of Gaussians)和EM算法 EM算法 求最大似然函数估计值的一般步骤: (1)写出似然函数: (2)对似然函数取对数,并整理: (3)求导数,令导数为0,得到似然方程: (4)解似然方程,得到的参数即为所求. 期望最大化算法(EM算法): 优点: 1. 简单稳定: 2. 通过E步骤和M步骤使得期望最大化,是自收敛的分类算法,既不需要事先设定类别也

EM算法 - 2 - EM算法在高斯混合模型学习中的应用

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了弄懂其中的内容查阅了很多资料,所以里面应该会有引用其他帖子的小部分内容,如果原作者看到可以私信我,我会将您的帖子的地址付到下面. 3,如果有内容错误或不准确欢迎大家指正. 4,如果能帮到你,那真是太好了. 在开始讲解之前,我要先给看这篇文章的你道个歉,因为<2012.李航.统计学习方法.pdf>中

【转】高斯混合模型

本文就高斯混合模型(GMM,Gaussian Mixture Model)参数如何确立这个问题,详细讲解期望最大化(EM,Expectation Maximization)算法的实施过程. 单高斯分布模型GSM 多维变量X服从高斯分布时,它的概率密度函数PDF为: x是维度为d的列向量,u是模型期望,Σ是模型方差.在实际应用中u通常用样本均值来代替,Σ通常用样本方差来代替.很容易判断一个样x本是否属于类别C.因为每个类别都有自己的u和Σ,把x代入(1)式,当概率大于一定阈值时我们就认为x属于C类

统计学习方法c++实现之八 EM算法与高斯混合模型

EM算法与高斯混合模型 前言 EM算法是一种用于含有隐变量的概率模型参数的极大似然估计的迭代算法.如果给定的概率模型的变量都是可观测变量,那么给定观测数据后,就可以根据极大似然估计来求出模型的参数,比如我们假设抛硬币的正面朝上的概率为p(相当于我们假设了概率模型),然后根据n次抛硬币的结果就可以估计出p的值,这种概率模型没有隐变量,而书中的三个硬币的问题(先抛A然后根据A的结果决定继续抛B还是C),这种问题中A的结果就是隐变量,我们只有最后一个硬币的结果,其中的隐变量无法观测,所以这种无法直接根

【无监督学习】高斯混合模型

高斯混合模型 本博客根据 百面机器学习,算法工程师带你去面试 一书总结归纳,公式图片均出自该书. 本博客仅为个人总结学习,非商业用途,侵删. 网址 http://www.ptpress.com.cn 高斯混合模型(Gaussian Mixed Model, GMM) 是一种常见的聚类算法,与K均值算法类似,同样使用了EM算法进行迭代计算. 高斯混合模型假设每个簇的数据都是符合高斯分布(又叫正态分布) 的, 当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果. 下面是一个高斯混合分布得例子,如