OpenCV中背景建模⽅法mog2——AdaptiveGMM算法⼩结 GMM是⽹上到处可见且⽤得最多的背景建模算法,论⽂上很多相关概率公式,⼜看了很多博客对于GMM的解释,直到现在还总是觉得很难理解其中的真谛,从各⽅⾯整理⼀下⽬前⾃⼰所理解的内容,如果有理解偏差,欢迎指正。
Mog2⽤的是⾃适应的⾼斯混合模型(Adaptive GMM,Gaussian Mixture Model),在OpenCV中开源了的⼏种背景提取算法MOG,MOG2,GMG的测试程序结果中,MOG2确实在前景连续性及运算时间上都脱颖⽽出,后⾯会给出⽐较结果。下⾯就结合OpenCV2.4.9的mog2源码和源码⽂档中指出的04年Zoran Zivkovic的三篇论⽂,简要串⼀串GMM的理论基础,MOG2的⼤致原理,在代码实现上的结构及MOG2 API的⽤法。
背景建模的思想由来
在监控系统中,拍摄背景通常是变化较少的固定场景。通常我们假定没有⼊侵物体的静态场景具有⼀些常规特性,可以⽤⼀个统计模型描述。GMM就是⽤⾼斯模型,⽽且是多个⾼斯模型的加权和混合在⼀起来模拟背景的特性。这样⼀旦已知这个背景模型,⼊侵物体就能通过标出场景图像中不符合这⼀背景模型的部分来检测到。这⼀过程被称为背景减除(Backgroundsubtraction),我猜OpenCV中各种背景建模⽅法的基类称
作“BackgroundSubtractor”也源于此吧。
GMM模型参数估计的通常思路——GMM参数的EM估计
⼀旦背景以⾼斯混合模型来模拟了,现在确定这个模型变成了解出⾼斯混合模型公式中的⼀系列参数,在解参数时通常⽤的是EM演算法,EM演算法分两步:E-step和M-step。
,链接的这个博客阐述的⾮常详细。
, EM算法理解上很有难度,涉及到最⼤似然估计上⾯链接也可以作为参考。
adaptiveMog2建模过程及各可调参数意义
上⾯说到GMM是⽤多个⾼斯模型的加权和来表⽰,假定是M个⾼斯分量,讨论M的取值是MOG2的作者研究的⼀个重点:在他之
前Stauffer & Grimson取固定个数的⾼斯分量(M=4), Zoran则根据不同输⼊场景⾃动选择分量的个数。这样做的好处是在较简单的场景下,将只选出⼀个较重要的⾼斯分量,节省了后期更新背景时选属于哪⼀分量的时间,提⾼了速度。有两个测试结果为证:⼀是⽤OpenCV 中测试程序对同⼀简单场景测试视频跑不同算法得到的运⾏时间如下表,明显mog2快很多;
mog mog2 gmg
电脑1 26904 14386 25533
电脑2 26947 14578 28834
⼆是Zoran在讲背景更新的论⽂ 的三个测试视频结果(图1, 摘⾃[1]中Fig.1第1,2列), 图中Traffic场景作为⼀个较简单的场景,背景变化不⼤,第⼆⾏中纯⿊背景表⽰背景只⽤⼀个⾼斯分量,速度13ms较固定四个分量的19ms快了很多,⽽测试的Trees场景背景中包含树影晃动,背景浅灰⾊部分表⽰有多个⾼斯分量在更新,在这种场景⾃适应⽅法并没有优势。
对于整个图像的每个像素点都建⽴了⼀个GMM模型,建模过程中运⽤EM算法来求解参数组,⼀旦模型建⽴,后⾯每新来⼀帧都可以根据是否符合已建⽴的北京模型判断FG/BG,并会按论⽂中的参数更新公式更新GMM的所有参数。
OpenCV代码实现结构梳理
OpenCV中,各背景建模⽅法类继承关系如下图,BackgroundSubtractor是基类。
也给出⼀个博客,。
在mog2的使⽤中,初始化后,operator()函数是执⾏背景更新的主要函数,operator()内部实现主要是OpenCV的⼀个并⾏框架parallel_for_(),再深⼊实际是MOG2Invoker类的operator()实现了背景更新的具体数学运算。具体实现可以查看。
Mog2.operator()
Parallel_for_()
Invoker.operator()
MOG2 API⽤法(how to use)
Mog,mog2,gmg的整体框架都⼀样,⽤法也很简单,可以根据来看。
Efficient adaptivedensity estimation per image pixel for the task of background subtraction.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论