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');
paper 62:高斯混合模型(GMM)参数优化及实现的更多相关文章
- 贝叶斯来理解高斯混合模型GMM
最近学习基础算法<统计学习方法>,看到利用EM算法估计高斯混合模型(GMM)的时候,发现利用贝叶斯的来理解高斯混合模型的应用其实非常合适. 首先,假设对于贝叶斯比较熟悉,对高斯分布也熟悉. ...
- 4. EM算法-高斯混合模型GMM详细代码实现
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 EM ...
- 3. EM算法-高斯混合模型GMM
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 GM ...
- EM算法和高斯混合模型GMM介绍
EM算法 EM算法主要用于求概率密度函数参数的最大似然估计,将问题$\arg \max _{\theta_{1}} \sum_{i=1}^{n} \ln p\left(x_{i} | \theta_{ ...
- 高斯混合模型GMM与EM算法的Python实现
GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...
- 6. EM算法-高斯混合模型GMM+Lasso详细代码实现
1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...
- 5. EM算法-高斯混合模型GMM+Lasso
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...
- Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- 高斯混合模型 GMM
本文将涉及到用 EM 算法来求解 GMM 模型,文中会涉及几个统计学的概念,这里先罗列出来: 方差:用来描述数据的离散或波动程度. \[var(X) = \frac{\sum_{i=1}^N( X_ ...
- 高斯混合模型(GMM) - 混合高斯回归(GMR)
http://www.zhihuishi.com/source/2073.html 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲 ...
随机推荐
- vs2013 RTM 激活码
BWG7X-J98B3-W34RT-33B3R-JVYW9
- pod》error:The dependency `` is not used in any concrete target
内容提要: podfile升级之后到最新版本,pod里的内容必须明确指出所用第三方库的target,否则会出现The dependency `` is not used in any concrete ...
- 探讨mvc下linq多表查询使用viewModel的问题
最近在开发mvc3的时候发现了一个问题,就是如何在view页面显示多表查询的数据,最简单的办法就是使用viewmodel了,以下本人使用viewmodel来实现多表查询的3中方法, 先贴代码再说: 1 ...
- margin负值
一列li并排的时候,需要一些间距的时候,又不需要最右边或者最左边有间距. <!DOCTYPE html> <html lang="zh-CN"> <h ...
- C++经典编程题#1:含k个3的数
总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除, ...
- oracle语句随笔
oracle语句随笔 dmp数据的导入. ; --创建用户 GRANT CONNECT,RESOURCE,DBA TO memsspc; --赋值权限 --cmd 中导入命令 IMP memsspc@ ...
- Linux命令行–更多bash shell命令(转)
4.1.1 探查程序 ps 命令 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户进程的进程 显示的当前进程的项目 进程号 运行在哪个终端(tty) 进程占用的CPU时间 Linux系统支 ...
- 微信公众平台开发(110) 微信连Wi-Fi
关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html 微信连Wi- ...
- 线上Linux服务器运维安全策略经验分享
线上Linux服务器运维安全策略经验分享 https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&a ...
- RFS_点击button按钮之后,RFS出现卡死的问题
[html代码] <html> <head> <title> 主窗口 </title> </head> <body> <d ...