目录
1. 基本原理
1.1 基本原理概述
高斯混合模型(后面本文中将使用他的缩写 GMM)听起来很复杂,其实他的工作原理和 KMeans 非常相似,甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。因为KMeans的限制很多,比如: 它假设簇是球形的并且大小相同,这在大多数现实世界的场景中是无效的。并且它是硬聚类方法,这意味着每个数据点都分配给一个集群,这也是不现实的。
基于高斯混合模型(Gaussian Mixture Model,简称GMM)的视频背景提取和目标跟踪算法是一种常用的计算机视觉技术,用于从视频序列中提取背景信息并跟踪运动的目标。
GMM 用作聚类算法的思想很简单:假设样本数据服从混合高斯分布,根据样本数据集推出混合高斯分布的各个参数,以及各个样本最可能属于哪个高斯分布,这样,GMM 的 K ( K 值往往由用户提供)个成分对应于聚类任务中的 K 个簇,每个样本划到最可能的高斯分布所对应的簇中。 如何根据样本数据求出混合高斯分布的各个参数是关键所在,后面将介绍求解参数的具体过程假设视频中的每个像素由一个高斯混合模型表示,其中每个高斯分量代表背景或前景中的一个可能分布。背景分量表示静止的部分,而前景分量表示可能移动的目标。算法的目标是通过对每个像素的建模来识别背景和前景,并根据像素值的变化进行目标跟踪。
GMM的基本公式是高斯概率密度函数的线性组合:
1.2 算法步骤
通过Gaussian Mixture Model(GMM)模型提取视频背景涉及多个步骤,主要包括初始化、学习和背景提取。以下是详细介绍如何通过GMM模型提取视频背景的步骤:
-
初始化:
- 对于每个像素,初始化一个GMM,通常包括一个或多个高斯分量。
- 初始时,一个分量通常被设定为背景分量,表示像素初始时被认为是静止的。
-
学习(Expectation-Maximization算法):
- 对于每个视频帧的每个像素,使用EM算法逐步更新GMM参数。这包括分量的均值、协方差和权重。
- EM算法的E步骤(Expectation)计算每个分量生成当前像素值的概率,以及每个分量对像素的贡献。
- EM算法的M步骤(Maximization)更新每个分量的参数,以最大化似然函数。
- 通过多次迭代,逐步调整模型以适应视频帧中的背景和前景变化。
-
背景建模:
- 对于每个像素,根据GMM的分量参数,选择权重最大的分量作为背景分量。
- 背景分量的均值和协方差表示该像素的背景模型。
- 可以根据实际需求选择使用多个分量来表示背景。
-
背景提取:
- 对于每个视频帧的每个像素,将其值与背景模型进行比较。
- 如果像素值与背景模型的匹配度较高(可以基于阈值进行判断),则将该像素视为背景。
- 如果像素值与背景模型的匹配度较低,则将该像素视为前景。
-
更新背景模型:
- 随着视频的播放,背景可能会发生变化,例如光照变化、动态背景等。
- 可以通过不断更新背景模型来适应这些变化。当像素被认为是背景时,可以使用新的像素值来更新对应的背景分量。
-
后处理(可选):
- 提取的背景可能包含噪声或伪影。可以应用一些后处理技术,如中值滤波或形态学操作,来平滑背景图像并去除噪声。
需要注意的是,GMM方法的性能受到参数设置的影响,如高斯分量数量、阈值等。通常需要根据实际情况进行调整。此外,GMM方法可能在复杂场景(如遮挡、光照变化等)下表现较差,因此在实际应用中可能需要结合其他技术来处理这些情况。
1.3 算法优势
- 自适应性: GMM可以自适应地对不同的背景和前景变化建模,适应光照变化、背景运动等情况。
- 多模态建模: GMM能够使用多个高斯分量来建模不同的像素分布,适用于复杂的背景和前景场景。
- 实时性: 简单的GMM实现可以在实时性要求不高的情况下实现目标检测和跟踪。
- 背景更新: 算法可以在不断学习和更新的过程中对新的背景变化进行建模,适应长时间的视频流。
然而,也需要注意的是,GMM在处理复杂的场景(如遮挡、光照变化等)时可能存在一些挑战,同时在处理大尺寸高分辨率视频时可能会消耗较大的计算资源。近年来,深度学习方法在视频背景提取和目标跟踪领域也取得了显著的进展,它们在处理复杂情况下可能具有更好的性能。
2.算法核心程序
.........................................................................
%%
%参数初始化
RR = 240;%处理视频大小
CC = 320;
K = 3; %组件
Alpha = 0.005; %适应权重速度
Rho = 0.01; %适应权重速度协方差
Deviation_sq = 49; %阈值用于查找匹配
Variance = 2; %初始方差为新放置组件
Props = 0.00001; %最初为新放置
Back_Thresh = 0.8; %体重的比例必须占背景模型
Comp_Thresh = 10; %滤掉连接组件的较小的尺寸
SHADOWS =[0.7,0.25,0.85,0.95]; %设置阴影去除门限值
%%
%我们这里设计了一个算法,就是能够读取压缩后的AVI视频,从而使仿真速度更快
disp('正在读取视频...');
FileName_AVI = 'SampleVideo.avi';
[Obj,frameNum_Original] = get_AVI(FileName_AVI);
[pixel_original,pixel_gray] = vedio_op(Obj,frameNum_Original);
clear Obj;
for i = 1:frameNum_Original
pixel_gray2(:,:,i) = imresize(pixel_gray(:,:,i),[RR,CC]);
pixel_original2(:,:,:,i) = imresize(pixel_original(:,:,:,i),[RR,CC]);
end
clear pixel_gray pixel_original;
disp('读取视频完毕...');
disp('正在进行高斯混合模型的仿真...');
[image_sequence,Images0] = func_Mix_Gauss_Model(pixel_original2,frameNum_Original,RR,CC,K,Alpha,Rho,Deviation_sq,Variance,Props,Back_Thresh,Comp_Thresh,SHADOWS);
disp('高斯混合模型的仿真完毕...');
disp('正在显示效果...');
figure;
for tt = 1:frameNum_Original
tt
subplot(121)
imshow(image_sequence(:,:,:,tt));
title('原始图像');
subplot(122)
imshow(Images0(:,:,tt));
title('运动目标检测');
pause(0.001);
end
disp('显示效果完毕...');
up2192
3.仿真测试结果