前景检测算法_3(GMM)

本文介绍了一种基于GMM(混合高斯模型)的前景检测算法,该算法利用Opencv实现,具备良好的动态背景鲁棒性。通过对视频背景进行训练,算法能够自适应地选择最优的高斯模型数量,并有效检测出行人等前景对象。

摘要

 

  本文通过opencv来实现一种前景检测算法——GMM,算法采用的思想来自论文[1][2][4]。在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应。然后在测试阶段,对新来的像素进行GMM匹配,如果该像素值能够匹配其中一个高斯,则认为是背景,否则认为是前景。由于整个过程GMM模型在不断更新学习中,所以对动态背景有一定的鲁棒性。最后通过对一个有树枝摇摆的动态背景进行前景检测,取得了较好的效果。

 

关键字:GMM,opencv,前景检测

 

前言

 

  前景检测主要分为帧差法,平均背景法,光流法,前景建模法,背景非参数估计,背景建模法等。而本文要实现的方法属于背景建模法中的一种——GMM,也称混合高斯模型。

  混合高斯模型最早在计算机视觉中的应用是Stauffer et al.[1],作者将其用来做前景检测,主要是用于视频监控领域,这个系统和稳定且有自学能力,能在户外环境跑16个多月。KaewTraKulPong et al.[2]将GMM的训练过程做了改进,将训练过程分为2步进行,前L帧采用EM算法进行权值,均值,方差更新,后面的过程就采用[1]中的方法进行更新,取得了更好的检测效果。Zivkovic et al.在[3]中对GMM理论做了全面的论述,使得GMM理论的使用不仅金限于计算机视觉领域。并且该作者在[4]将该理论进一步具体到背景减图的前景检测中来,即加入了参数估计的先验知识,取得了很好的效果和稳定性。

  最近几年陆续有学者对GMM的背景见图中的应用做了更深一步的研究,其代表性贡献见论文[5][6]。

 

  实现过程

 

  本文中主要是根据[2][4]中提出的算法,采用其中的更新方差来根性模型中的3个参数,最后结合用opencv基本底层函数实现该算法。其主要过程如下:

  1. 首先将每个高斯的均值,方差,权值都设置为0,即初始化个模型矩阵参数。
  2. 采用视频中的T帧用来训练GMM模型。对每一个像素而言,建立其模型个数最大GMM_MAX_COMPONT个高斯的GMM模型。当第一个像素来,单独为其在程序中设置好其固定的初始均值,方差,并且权值设置为1。
  3. 非第一帧训练过程中,当后面来的像素值时,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则任务属于该高斯。此时用如下方程进行更新:

    

  4. 当到达训练的帧数T后,进行不同像素点GMM个数自适应的选择。首先用权值除以方差对各个高斯进行从大到小排序,然后选取最前面B个高斯,使

  

  这样就可以很好的消除训练过程中的噪声点。

  5. 在测试阶段,对新来像素点的值与B个高斯中的每一个均值进行比较,如果其差值在2倍的方差之间的话,则认为是背景,否则认为是前景。并且只要其中有一个高斯分量满足该条件就认为是前景。前景赋值为255,背景赋值为0。这样就形成了一副前景二值图。

  6. 由于前景二值图中含有很多噪声,所以采用了形态学的开操作将噪声缩减到0,紧接着用闭操作重建由于开操作丢失的边缘部分的信息。消除了不连通的小噪声点。

  上面是该算法实现的大概流程,但是当我们在具体编程时,还是有很多细节的地方需要注意,比如有些参数值的选择。在这里,经过试验将一些常用的参数值声明如下:

  1. 3个参数的值的更新方差中,取其中的学习率为0.005。也就是说T等于200。
  2. 定义每个像素的最大混合高斯个数取7。
  3. 取视频的前200帧进行训练。
  4. 取Cf为0.3。即满足权值大于0.7的个数为自适应高斯的个数B。
  5. 训练过程中,需要新建立一个高斯时,其权值取值设为与学习率大小值相等,即0.005。
  6. 训练过程中,需要新建立一个高斯时,取该高斯的均值为该输入像素值大小本身。方差为15。
  7. 训练过程中,需要新建立一个高斯时,取该高斯的方差15。

 

   程序流程框图

 

  该工程的流程框图如下图所示:

                                        

                          

                                                  

                                      试验结果

 

  本次试验的数据为摇摆的树枝作为背景,Waving Trees,其来源网址为:http://research.microsoft.com/en-us/um/people/jckrumm/WallFlower/TestImages.htm 由于该数据是286张bmp格式的图片,所以用的前200张图片来作为GMM参数训练,后186张作为测试。训练的过程中树枝被很大幅度的摆动,测试过程中有行人走动,该行人是需要迁就检测的部分。

  下图为训练过程中动态背景截图

  

 

  由上图可以看出,树枝在不断摇摆,可见其背景是动态的。

  没有形态学处理的结果如下:

   

     下图是有简单形态学的试验结果:

   

      (上面2幅图的左边为测试原始图片,右图为检测效果图)

 

总结

 

  通过本次试验,不仅学习到了GMM的相关理论知识,以及背景减图法在前景检测中的应用。更重要的时,对opencv在计算机视觉中的使用更进一步的熟悉了。另外对于目标检测的难点有了更深一层的理解。

 

参考文献

 

  1. Stauffer, C. and W. E. L. Grimson (1999). Adaptive background mixture models for real-time tracking, IEEE.
  2. KaewTraKulPong, P. and R. Bowden (2001). An improved adaptive background mixture model for real-time tracking with shadow detection.
  3. Zivkovic, Z. and F. van der Heijden (2004). "Recursive unsupervised learning of finite mixture models." Pattern Analysis and Machine Intelligence, IEEE Transactions on 26(5): 651-656.
  4. Zivkovic, Z. and F. van der Heijden (2006). "Efficient adaptive density estimation per image pixel for the task of background subtraction." Pattern recognition letters 27(7): 773-780.
  5. Bouzerdoum, A., A. Beghdadi, et al. (2010). "On the analysis of background subtraction techniques using Gaussian mixture models."
  6. Lin, H. H., J. H. Chuang, et al. (2011). "Regularized background adaptation: a novel learning rate control scheme for Gaussian mixture modeling." Image Processing, IEEE Transactions on 20(3): 822-836.

 

<think>首先,用户的问题是:“基于GMM前景检测算法”,意思是“基于GMM前景检测算法”。我需要用中文回答问题。 GMM指的是高斯混合模型(Gaussian Mixture Model),用于前景检测的背景建模中,比如在图像处理或视频监控中分离前景和背景。 我的回答应该包括: - 解释基于GMM前景检测算法是什么。 - 简要描述其原理和步骤。 - 可能提供一个简单的伪代码或代码示例,类似于示例中给出的快速排序代码。 之后,我必须在回答末尾提出3-5个相关问题。这些问题必须以“§§相关问题§§”开头,并且这是第一行。问题不能换行分散,意思是要在一行输出这个标题,然后列出问题,每个问题一行,用数字或点号。 相关问题的格式在示例中是: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,我需要输出“§§相关问题§§”作为第一行,然后换行列出3-5个问题。 内容必须符合规则,否则无效。 现在,构建我的回答: 1. **介绍算法**:解释基于GMM前景检测。在计算机视觉中,前景检测通常用于运动检测,其中GMM用于建模背景像素的颜色分布。背景像素被建模为多个高斯分布的组合,表示不同颜色的变化。新像素如果不符合这些分布,就被视为前景。 2. **关键步骤**: - 初始化GMM参数。 - 对于每个像素,维护一个GMM。 - 更新模型:根据新帧更新高斯分布的参数(均值、方差、权重)。 - 检测前景:计算像素值属于背景模型的概率;如果低于阈值,则视为前景3. **代码示例**:提供一个简单的Python伪代码或代码片段,类似于示例。示例用了Python代码块,所以我应该用类似格式。例如: ```python import numpy as np # 伪代码或简化实现 class GMMBackgroundModel: def __init__(self, ...): # 初始化 def update(self, frame): # 更新模型 def detect_foreground(self, frame): # 检测前景 ``` 确保代码相关且简要。 4. **提出问题**:在末尾,输出“§§相关问题§§”,然后列出3-5个基于我的回答和用户问题的相关问题。相关问题应该激发进一步思考或学习。 - 例如: 1. GMM模型中高斯分布的数量如何选择? 2. 如何优化基于GMM前景检测算法以提高实时性? 3. GMM与其他背景建模方法(如KNN)相比有哪些优缺点? 4. 在光照变化较大的场景中,GMM算法的表现如何? 5. 如何调整GMM的参数(如学习率、阈值)以获得更好的检测效果? 确保总回答用中文。 结构回答: - 先回答问题。 - 然后代码块(如果需要)。 - 最后是相关问题部分。 计算问题数量:3-5个;我准备4个。 最终回答大纲: - 段落解释算法。 - 代码示例。 - §§相关问题§§ 1. ... 2. ... 3. ... 4. ... </think>基于GMM(高斯混合模型)的前景检测算法是计算机视觉中常用的一种背景建模方法,用于分离视频或图像序列中的前景对象(如运动物体)和背景。其核心思想是:将每个像素的背景颜色分布建模为多个高斯分布的加权组合(GMM),通过学习像素颜色的统计特性(均值、方差和权重),动态更新模型以适应背景变化(如光照变化)。新帧中的像素若不属于任何高斯分布的概率较低(或基于Mahalanobis距离计算的阈值),则被标记为前景。典型的步骤包括: 1. **初始化**:为每个像素初始化K个高斯分布(例如K=3-5),设置初始参数。 2. **模型更新**:对每个新帧的像素值,判断其是否匹配现有分布;若不匹配,则用新值替换权重最小的分布,并更新所有分布的均值、方差和权重(使用学习率控制更新速度)。 3. **前景检测**:计算像素值属于背景模型的概率(或排序分布按权重/方差比),若低于阈值则判定为前景。 4. **后处理**:通常结合形态学操作(如开运算)去除噪声。 以下是该算法的简化Python伪代码实现(基于OpenCV等库的思路): ```python import numpy as np class GMMForegroundDetector: def __init__(self, num_gaussians=3, learning_rate=0.01, threshold=0.7): self.K = num_gaussians # 高斯分布数量 self.alpha = learning_rate # 学习率 self.threshold = threshold # 前景判断阈值 self.models = {} # 存储每个像素的GMM参数:例如,每个元素为[权重, 均值, 方差] def initialize(self, frame): # 初始化模型:对每个像素,随机初始化K个高斯分布 height, width = frame.shape[:2] for y in range(height): for x in range(width): pixel_value = frame[y, x] self.models[(y, x)] = [] for _ in range(self.K): weight = 1.0 / self.K mean = pixel_value.copy() variance = np.ones_like(pixel_value) * 100 # 初始方差 self.models[(y, x)].append([weight, mean, variance]) def update_and_detect(self, frame): foreground_mask = np.zeros(frame.shape[:2], dtype=np.uint8) for y in range(frame.shape[0]): for x in range(frame.shape[1]): pixel = frame[y, x] distributions = self.models.get((y, x), []) matched = False # 检查像素是否匹配现有分布 for i, (weight, mean, var) in enumerate(distributions): distance = np.sum((pixel - mean)**2 / np.maximum(var, 1e-6)) # Mahalanobis距离简化 if distance < 2.5 * np.sum(var): # 匹配阈值 matched = True # 更新匹配分布的权重、均值和方差 weight_new = (1 - self.alpha) * weight + self.alpha mean_new = (1 - self.alpha) * mean + self.alpha * pixel var_new = (1 - self.alpha) * var + self.alpha * (pixel - mean)**2 distributions[i] = [weight_new, mean_new, var_new] break if not matched: # 替换权重最小的分布 min_index = np.argmin([w for w, _, _ in distributions]) distributions[min_index] = [self.alpha, pixel, np.ones_like(pixel) * 100] # 归一化权重并排序 total_weight = sum(w for w, _, _ in distributions) distributions = sorted(distributions, key=lambda x: x[0] / np.sqrt(x[2]), reverse=True) # 判断前景:计算前B个分布的累积权重(B由阈值决定) cum_weight = 0 for i, (weight, _, _) in enumerate(distributions): cum_weight += weight / total_weight if cum_weight > self.threshold: background_likely = True break foreground_mask[y, x] = 255 if not background_likely else 0 return foreground_mask # 使用示例:detector = GMMForegroundDetector(); detector.initialize(first_frame); foreground = detector.update_and_detect(new_frame) ``` 此算法在OpenCV中常用作`createBackgroundSubtractorMOG2`的基础,适合实时视频监控等应用,但对光照剧烈变化或高速运动场景可能需优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值