基于高斯混合模型的目标检测算法matlab仿真

article/2025/10/12 8:38:43

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。 对图像背景建立高斯模型的原理及过程:图像灰度直方图反映的是图像中某个灰度值出现的频次,也可以以为是图像灰度概率密度的估计。如果图像所包含的目标区域和背景区域相差比较大,且背景区域和目标区域在灰度上有一定的差异,那么该图像的灰度直方图呈现双峰-谷形状,其中一个峰对应于目标,另一个峰对应于背景的中心灰度。对于复杂的图像,尤其是医学图像,一般是多峰的。通过将直方图的多峰特性看作是多个高斯分布的叠加,可以解决图像的分割问题。 在智能监控系统中,对于运动目标的检测是中心内容,而在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要。而建模正是背景目标提取的一个重要环节。

        混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个 像素点 的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定, 对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性 。由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立 背景图像 并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。

       到这里为止,混合高斯模型的建模基本完成,我在归纳一下其中的流程,首先初始化预先定义的几个高斯模型,对高斯模型中的参数进行初始化,并求出之后将要用到的参数。其次,对于每一帧中的每一个像素进行处理,看其是否匹配某个模型,若匹配,则将其归入该模型中,并对该模型根据新的像素值进行更新,若不匹配,则以该像素建立一个高斯模型,初始化参数,代理原有模型中最不可能的模型。最后选择前面几个最有可能的模型作为背景模型,为背景目标提取做铺垫。

        混合高斯模型法是背景提取领域中比较常用的一种算法,这种方法通过对每一个像素点的亮度用若干个高斯模型来建模,使该方法在进行背景提取的时候具有一定的场景适应能力,可以克服其他背景提取算法(如:多帧平均法,统计中值法等)无法适应环境变化的缺点.对于多峰高斯分布模型,图像的每一个像素点按不同权值的多个高斯分布的叠加来建模,每种高斯分布对应一个可能产生像素点所呈现颜色的状态,各个高斯分布的权值和分布参数随时间更新。

       当处理彩色图像时,假定图像像素点R、G、B三色通道相互独立并具有相同的方差。对于随机变量X的观测数据集{x1,x2,…,xN},xt=(rt,gt,bt)为t时刻像素的样本,则单个采样点xt其服从的混合高斯分布概率密度函数:

       所谓单高斯模型,就是用多维高斯分布概率来进行模式分类,其中μ用训练样本均值代替,Σ用样本方差代替,X为d维的样本向量。通过高斯概率公式就可以得出类别C属于正(负)样本的概率。而混合高斯模型(GMM)就是数据从多个高斯分布中产生的。每个GMM由K个高斯分布线性叠加而 P(x)=Σp(k)*p(x|k) 相当于对各个高斯分布进行加权(权系数越大,那么这个数据属于这个高斯分布的可能性越大)而在实际过程中,我们是在已知数据的前提下,对GMM进行参数估计,具体在这里即为图片训练一个合适的GMM模型。那么在前景检测中,我们会取静止背景(约50帧图像)来进行GMM参数估计,进行背景建模。分类域值官网取得0.7,经验取值0.7-0.75可调。这一步将会分离前景和背景,输出为前景二值掩码。 

二、核心程序

.............................................................................% Now update the weights. Increment weight for the selected Gaussian (if any),% and decrement weights for all other Gaussians.   Weights = (1 - ALPHA) .* Weights + ALPHA .* matched_gaussian;% Adjust Mus and Sigmas for matching distributions.for kk = 1:Kpixel_matched = repmat(matched_gaussian(:, kk), 1, C);pixel_unmatched = abs(pixel_matched - 1); % Inverted and mutually exclusiveMu_kk = reshape(Mus(:, kk, :), D, C);Sigma_kk = reshape(Sigmas(:, kk, :), D, C);Mus(:, kk, :) = pixel_unmatched .* Mu_kk + ...pixel_matched .* (((1 - RHO) .* Mu_kk) + ...(RHO .* double(image)));% Get updated Mus; Sigmas is still unchangedMu_kk = reshape(Mus(:, kk, :), D, C); Sigmas(:, kk, :) = pixel_unmatched .* Sigma_kk + ...pixel_matched .* (((1 - RHO) .* Sigma_kk) + ...repmat((RHO .* sum((double(image) - Mu_kk) .^ 2, 2)), 1, C));       end% Maintain an indicator matrix of those components that were replaced because no component matched. replaced_gaussian = zeros(D, K); % Find those pixels which have no Gaussian that matchesmismatched = find(sum(matched_gaussian, 2) == 0);% A method that works well: Replace the component we            % are least confident in. This includes weight in the choice of % component.        for ii = 1:length(mismatched)[junk, index] = min(Weights(mismatched(ii), :) ./ sqrt(Sigmas(mismatched(ii), :, 1)));% Mark that this Gaussian will be replacedreplaced_gaussian(mismatched(ii), index) = 1;% With a distribution that has the current pixel as meanMus(mismatched(ii), index, :) = image(mismatched(ii), :);% And a relatively wide varianceSigmas(mismatched(ii), index, :) = ones(1, C) * INIT_VARIANCE;% Also set the weight to be relatively smallWeights(mismatched(ii), index) = INIT_MIXPROP;  end% Now renormalise the weights so they still sum to 1Weights = Weights ./ repmat(sum(Weights, 2), 1, K);active_gaussian = matched_gaussian + replaced_gaussian;%----------------------------------------------------------------------%--------------------------background Segment--------------------------% Find maximum weight/sigma per row. [junk, index] = sort(Weights ./ sqrt(Sigmas(:, :, 1)), 2, 'descend');% Record indeces of those each pixel's component we are most confident% in, so that we can display a single background estimate later. While % our model allows for a multi-modal background, this is a useful% visualisation when something goes wrong. best_background_gaussian = index(:, 1);linear_index = (index - 1) * D + repmat([1:D]', 1, K);weights_ordered = Weights(linear_index);for kk = 1:Kaccumulated_weights(:, kk) = sum(weights_ordered(:, 1:kk), 2);endbackground_gaussians(:, 2:K) = accumulated_weights(:, 1:(K-1)) < BACKGROUND_THRESH;background_gaussians(:, 1) = 1;            % The first will always be selected% Those pixels that have no active background Gaussian are considered forground. background_gaussians(linear_index) = background_gaussians;active_background_gaussian = active_gaussian & background_gaussians;foreground_pixels = abs(sum(active_background_gaussian, 2) - 1);foreground_map = reshape(sum(foreground_pixels, 2), HEIGHT, WIDTH);foreground_with_map_sequence(:, :, tt) = foreground_map;   %----------------------------------------------------------------------%---------------------Connected components-----------------------------objects_map = zeros(size(foreground_map), 'int32');object_sizes = [];object_positions = [];new_label = 1;[label_map, num_labels] = bwlabel(foreground_map, 8);for label = 1:num_labels object = (label_map == label);object_size = sum(sum(object));if(object_size >= COMPONENT_THRESH)%Component is big enough, mark itobjects_map = objects_map + int32(object * new_label);object_sizes(new_label) = object_size;[X, Y] = meshgrid(1:WIDTH, 1:HEIGHT);    object_x = X .* object;object_y = Y .* object;object_positions(:, new_label) = [sum(sum(object_x)) / object_size;sum(sum(object_y)) / object_size];new_label = new_label + 1;endendnum_objects = new_label - 1;%---------------------------Shadow correction--------------------------% Produce an image of the means of those mixture components which we are most% confident in using the weight/stddev tradeoff.index = sub2ind(size(Mus), reshape(repmat([1:D], C, 1), D * C, 1), ...reshape(repmat(best_background_gaussian', C, 1), D * C, 1), repmat([1:C]', D, 1));background = reshape(Mus(index), C, D);background = reshape(background', HEIGHT, WIDTH, C); background = uint8(background);background_sequence(:, :, :, tt) = background;background_hsv = rgb2hsv(background);image_hsv = rgb2hsv(image_sequence(:, :, :, tt));for i = 1:HEIGHTfor j = 1:WIDTH      if (objects_map(i, j)) && (abs(image_hsv(i,j,1) - background_hsv(i,j,1)) < 0.7)...&& (image_hsv(i,j,2) - background_hsv(i,j,2) < 0.25)...&& (0.85 <=image_hsv(i,j,3)/background_hsv(i,j,3) <= 0.95)shadow_mark(i, j) = 1;  elseshadow_mark(i, j) = 0;  end               end    endforeground_map_sequence(:, :, tt) = objects_map;
%     objecs_adjust_map = objects_map & (~shadow_mark);objecs_adjust_map = shadow_mark;foreground_map_adjust_sequence(:, :, tt) = objecs_adjust_map;    %----------------------------------------------------------------------
end
%--------------------------------------------------------------------------% -----------------------------Result display-------------------------------
figure;
while 1
for tt = 1:T
%   tt = 30;subplot(2,2,1),imshow(image_sequence(:, :, :, tt));title('original image');subplot(2,2,2),imshow(uint8(background_sequence(:, :, :, tt)));title('background image');subplot(2,2,3),imshow(foreground_map_sequence(:, :, tt)); title('foreground map without shadow removing');
%   subplot(2,2,4),imshow(uint8(background_sequence(:, :, :, tt)));subplot(2,2,4),imshow(foreground_map_adjust_sequence(:, :, tt));title('foreground map with shadow removing');drawnow;pause(0.1);
end
end
up141

三、仿真结论


http://chatgpt.dhexx.cn/article/DybDuLZZ.shtml

相关文章

高斯混合模型 GMM 的详细解释

高斯混合模型&#xff08;后面本文中将使用他的缩写 GMM&#xff09;听起来很复杂&#xff0c;其实他的工作原理和 KMeans 非常相似&#xff0c;你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

高斯混合模型学习笔记

高斯混合模型学习笔记 根据师兄&#xff08;王延凯的博客&#xff09;以及其他博主大佬的总结学习高斯混合模型&#xff0c;自己也作一下学习记录。 目录 高斯混合模型学习笔记1、模型介绍2、模型求解步骤举个栗子通用背景模型UBM[\[2\]](https://blog.csdn.net/weixin_44278…

机器学习笔记之高斯混合模型(一)模型介绍

机器学习笔记之高斯混合模型——模型介绍 引言高斯混合模型介绍示例介绍从几何角度观察高斯混合模型从混合模型的角度观察 概率混合模型的引出从概率生成模型的角度观察高斯混合模型 引言 上一系列介绍了EM算法&#xff0c;本节将介绍第一个基于EM算法求解的概率生成模型——高…

图像处理之高斯混合模型

一、高斯混合模型 现有的图像中目标的分类常用深度学习模型处理&#xff0c;但是深度学习需要大量模型处理。对于明显提取的目标&#xff0c;常常有几个明显特征&#xff0c;利用这几个明显特征使用少量图片便可以完成图像目标分类工作。这里介绍使用高斯混合模型GMM处理图像。…

机器学习 高斯混合模型

高斯混合模型 前言高斯混合模型高斯分布混合模型高斯模型单高斯模型高斯混合模型高斯混合模型训练EM算法 应用图像背景的高斯混合模型智能监控系统 参考 前言 之前在一次技术讨论当中&#xff0c;针对文本处理的时候被问到高斯混合模型。当时我对“高斯混合模型”都是比较懵圈…

高斯混合模型GMM

1. 高斯混合模型概念 高斯混合模型&#xff08;Gaussian Mixture Model&#xff09;是一种聚类算法&#xff0c;它是多个高斯分布函数的线性组合&#xff0c;通常用于解决同一集合下的数据包含多种不同的分布情况。 2.高斯混合模型的一个例子 在校园里随机抽取2000个学生&#…

高斯混合模型

一、什么是高斯混合模型&#xff08;GMM&#xff09; 高斯混合模型&#xff08;Gaussian Mixed Model&#xff09;指的是多个高斯分布函数的线性组合&#xff0c;通常用于解决同一集合下的数据包含多个不同的分布的情况&#xff0c;如解决分类情况 如下图&#xff0c;明显分成两…

【技术分享】高斯混合模型

本文原作者&#xff1a;尹迪&#xff0c;经授权发布。 原文链接&#xff1a;https://cloud.tencent.com/developer/article/1480731 导语&#xff1a;现有的高斯模型有单高斯模型&#xff08;SGM&#xff09;和高斯混合模型&#xff08;GMM&#xff09;两种。从几何上讲&#…

高斯混合模型(GMM)

高斯混合模型 k-means 聚类模型非常简单并且易于理解&#xff0c;但是它的简单性也为实际应用带 来了挑战。特别是在实际应用中&#xff0c;k-means 的非概率性和它仅根据到簇中心点的距离来指 派簇的特点将导致性能低下。这一节将介绍高斯混合模型&#xff0c;该模型可以被看…

机器学习笔记 - 什么是高斯混合模型(GMM)?

1、高斯混合模型概述 高斯混合模型 (GMM) 是一种机器学习算法。它们用于根据概率分布将数据分类为不同的类别。高斯混合模型可用于许多不同的领域,包括金融、营销等等!这里要对高斯混合模型进行介绍以及真实世界的示例、它们的作用以及何时应该使用GMM。 高斯混合模型 (GMM) …

机器学习算法(二十九):高斯混合模型(Gaussian Mixed Model,GMM)

目录 1 混合模型&#xff08;Mixture Model&#xff09; 2 高斯模型 2.1 单高斯模型 2.2 高斯混合模型 3 模型参数学习 3.1 单高斯模型 3.2 高斯混合模型 4 高斯混合模型与K均值算法对比 1 混合模型&#xff08;Mixture Model&#xff09; 混合模型是一个可以用来表示在总…

重启虚拟机异常:Unmount and run xfs_repair

重启虚拟机异常&#xff1a;Unmount and run xfs_repair 解决办法&#xff1a; 原因&#xff1a;看出来应该是sda3分区损坏&#xff0c;修复就可以了 1&#xff1a;启动虚拟机E进入单用户模式 2&#xff1a;在linux16开头的哪一行后面添加rd.break&#xff0c;ctrlx进入救援模式…

Unmount and run xfs_repair

开启虚拟机报错&#xff1a;Unmount and run xfs_repair 从错误可以查看到是vda3错误。 解决办法&#xff1a; 1、umount /dev/vda3 2、xfs_repair -L /dev/vda3 3、reboot 就ok了。

Linux mount/unmount命令

开机自动挂载 如果我们想实现开机自动挂载某设备&#xff0c;只要修改/etc/fstab文件即可。 文件挂载的配置文件&#xff1a;/etc/fstab 查看此文件可知 每行定义一个要挂载的文件系统&#xff1b; 其每行的格式如下 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项…

android.permission.MOUNT_UNMOUNT_FILESYSTEMS添加权限报错

<!--这是在sd卡内创建和删除文件权限--> <uses-permission android:name"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name"android.permission.WRITE_SETTINGS" /> 出现报错有两种解决方法&#xff1…

Centos7 虚拟机非法关机导致系统无法启动报Unmount and run xfs_repair的解决方法

1&#xff0c;电脑不正常启动导致我的虚拟机无法启动&#xff0c;报以下错误Unmount and run xfs_repair&#xff0c;大概意思是xfs文件系统出现问题了&#xff0c;导致无法挂载&#xff0c;需要使用xfs_repair进行修复。 2&#xff0c;执行如下命令 xfs_repair /dev/mapper/c…

linux下unmount了移动硬盘之后,硬盘灯还是常亮并且硬盘还在一直转动

linux下unmount了移动硬盘之后&#xff0c;硬盘灯还是常亮并且硬盘还在一直转动 ​ 参考:https://www.zhihu.com/question/23362385 希捷2T移动硬盘 在windows下卸载硬盘之后硬盘灯就不亮了&#xff0c;手摸也没有震动感。 在ubuntu下卸载硬盘之后&#xff0c;硬盘灯仍然常…

centos7异常断电,重启提示Unmount and run xfs_repair

周末服务器由于阵列卡问题&#xff0c;异常重启&#xff0c;重启后前台异常报错&#xff0c;提示磁盘元数据问题&#xff0c;需要修复 如故障图所示&#xff0c;sdb1&#xff0c;sdf1&#xff0c;sdi1 3块磁盘出现问题&#xff0c; 下面的解决办法&#xff1a; 解决办法&…

Android/C/C++ 中解决 USB UnMount(禁止USB端口)

引&#xff1a;因为某些特殊需求&#xff0c;需要在某些设备接入车机的时候&#xff0c;动态UnMount USB设备&#xff0c;因为代码其中有一些方法是自定义过的&#xff0c;所以该文章仅供思路参考。 &#xff08;20200319 更新&#xff09;&#xff1a;在后续跟进中&#xff0…

linux移动硬盘unmount报错处理

备份数据用的移动硬盘unmount时报&#xff1a; 通过fuser命令来kill掉设备进程&#xff0c;再unmount移动设备 先看fuser命令帮助信息&#xff1a; [rootathenadb2 ~]# fuser -helpUsage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME... [ - ] [ -n SPAC…