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

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

高斯混合模型概述

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

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

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

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

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

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

2 理论说明部分

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

源码

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');
摘自: http://wolfsky2002.blog.163.com/blog/static/10343152010112610221540/

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 高斯混合模型GMM)是一种概率模型,常用于数据聚类和分布建模。路径规划是指在给定环境地图和起点终点信息的情况下,确定机器人或车辆的移动路径。将GMM应用于路径规划仿真可以更好地模拟实际环境中的不确定性和动态变化。 首先,通过使用GMM来对环境进行建模,可以从地图数据中提取出环境的特征,并将其表示为一组高斯分布。每个高斯分布代表一个可能的障碍物或特征。这样建模可以更真实地反映环境中的障碍物分布和变化情况。 其次,在路径规划的过程中,机器人或车辆需要避免障碍物,并找到一条安全的路径。传统的路径规划算法可能会困难地处理环境的不确定性和障碍物的动态变化。而使用GMM可以根据环境中高斯分布的权重和方差信息,预测出障碍物的可能位置和运动趋势。 最后,在仿真中,可以将预测到的障碍物信息与机器人或车辆的当前位置、速度等信息结合起来,使用优化算法,例如贪婪算法或遗传算法,来生成最佳路径。通过不断迭代和优化,机器人或车辆可以在环境中找到一条安全且高效的路径。 总的来说,将GMM应用于路径规划仿真可以更好地考虑环境的不确定性和动态变化,从而使得路径规划更加真实和可靠。这种方法可以广泛应用于无人车、自动驾驶、智能机器人等领域,对于提高智能化交通和智能化运输的效率和安全性具有重要意义。 ### 回答2: 高斯混合模型(Gaussian Mixture Model,GMM)是一种统计模型,用于描述多个高斯分布叠加而成的数据分布。在路径规划仿真中,利用GMM进行路径规划可以帮助我们找到最优的路径。 首先,我们将路径规划的问题建模为一个优化问题,目标是找到一条最优路径来满足特定的条件。通过采集实际环境中的数据,我们可以得到一组样本点,这些样本点可以表示不同位置的特征信息。 然后,我们使用GMM对这些样本点进行建模。GMM假设这些样本点是由多个高斯分布混合而成的,每个高斯分布表示一个可能的路径。通过对样本点进行聚类,我们可以获得每个高斯分布的均值和协方差矩阵。 接下来,我们可以使用路径搜索算法,比如A*算法,来搜索最优路径。在每一步中,我们会计算当前位置到各个高斯分布均值点的距离,并基于距离和高斯分布的权重进行路径更新。这样,我们就可以逐步找到一条最优路径。 最后,我们通过仿真来验证我们的路径规划算法。在仿真环境中,我们可以根据实际情况设定起点和终点,并观察GMM路径规划算法是否能够找到一条最优路径。仿真结果将有助于评估算法的效果,并对算法进行改进优化。 总之,利用GMM进行路径规划仿真可以帮助我们找到最优的路径。通过建模样本点、使用GMM聚类、路径搜索和仿真验证,我们可以得到一条适应实际环境的最优路径。这样的路径规划算法可以应用于自动驾驶、机器人导航等领域,提高路径规划的准确性与效率。 ### 回答3: 高斯混合模型(Gaussian Mixture Model,GMM)是一种常用的概率模型,能够将一个复杂的分布模型表示为多个简单的高斯分布的线性叠加。GMM在路径规划中的应用是通过对环境的建模,对机器人的最佳路径进行规划。 首先,使用传感器获取环境的感知信息,例如激光雷达、摄像头等。然后,将这些感知信息输入到GMM中进行建模。GMM可以将每个高斯分布看作是环境中的一个障碍物或者目标点,通过高斯分布的均值来表示障碍物或者目标点的位置,通过方差来表示不确定性。在路径规划中,可以将机器人的起点和终点分别设定为高斯分布的均值,并选取方差较小的高斯分布表示机器人的期望路径。 接下来,使用GMM进行路径规划的仿真。通过对GMM模型进行采样,得到一系列的路径样本。对每个路径样本进行评估,计算其通过环境的概率。在评估阶段,可以应用机器学习算法(例如最大似然估计)来学习GMM中的参数,从而使路径样本的评估更加准确。 最后,根据路径样本的评估结果,选择通过概率最高的路径作为机器人的最佳路径。在实际应用中,路径规划算法还需要考虑机器人的动力学约束、环境的不确定性以及实时性等因素。 总之,高斯混合模型在路径规划中的仿真可以通过建模环境、对路径样本进行评估和选择最佳路径三个步骤来实现。这种方法能够有效地处理环境中的不确定性,并生成符合机器人能力和环境要求的最佳路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值