背景建模算法比较与ViBe算法论文解读与python代码

 

目录

背景建模方法需要考虑的3个问题

基于统计方法建模的缺陷

其他背景建模方法的不足

VIBE算法的巧妙之处

VIBE算法详解

初始化方法

模型更新方法

参考资料

ViBe的Python代码


在运动目标检测领域,抛开最近热火朝天的深度学习方法,最经典、可靠、传统的方法还是基于图像差分的方法。在这类方法中,往往会用到背景差分法。背景建模的优劣决定了目标检测结果的好坏,因此选择一个合适的背景建模方法非常重要。

背景建模方法需要考虑的3个问题

1)采用什么样的模型及其机理(——这个相当于废话。看下面吧。)

2)模型如何初始化?

3)模型如何实时更新?

基于统计方法建模的缺陷

背景建模方法中,最经典的莫过于基于统计学模型的方法。而这类方法中的代表作就是GMM(混合高斯模型)了(如果你还对大名鼎鼎、用烂掉了的GMM不了解,就看一篇综述快速了解一下吧。见本文参考资料。)

VIBE算法的作者Olivier Barnich在他的论文中从理论上对基于统计的方法提出了一些缺陷:

1、GMM的自我更新方法不太合理。见下节。

2、本质上讲,像素点并没有分布规律,所以用概率密度函数(probability density function, pdf)来估计像素点是缺乏道理的。其实,只要能够达到相关背景分割的目标,就没有必要去计算pdf。计算那么多像素的分布规律,显然很耗时。

3、统计方法是一个全局过程,很容易受离群点的影响。且基于假设模型的方法带来的偏差是十分常见的。

其他背景建模方法的不足

其他建模方法中也存在一些通病,比如:

1、初始化方法比较模糊。初始化方法对背景建模的快速响应十分重要,比如用第一帧当作初始化的背景还是用前N帧再弄个平均之类得到一个背景,这对建模速度和准确度都是不一样的。

2、模型及其更新方法缺乏联系。例如,在基于统计的方法中,在限定的阈值T范围内把当前像素p和背景模型中的像素点做比较,然后阈值T可以自适应地根据统计方差\sigma来调整。但是统计方差是一个时间维度上的平均,和帧率、背景像素个数有关。这在一些场景中是不适用的,比如远程联网的相机,其帧率是由带宽决定的。这导致模型的更新方法不是非常合理,无法像想象中那么理想地实现自适应的效果。

VIBE算法的巧妙之处

将背景建模视为一个分类问题,而不是一个统计问题。

将新值与背景样本集合进行比较,应该是接近某些样本值,而不是所有值的大多数。这个思想就是,估计具有少量近似值的背景像素的统计分布比使用大量样本更可靠。(这有点类似于忽略pdf的末端,或者通过阈值化来仅考虑底层pdf的中心部分)。VIBE就是基于这样的思想,只和样本集合中的少数值进行比较。

保守的背景更新方法,只用到时间维度上的像素点的统计分布特征。而VIBE中兼顾了空间信息的利用。即认为像素点邻域的像素点会服从相似的分布,并基于此来更新背景模型。

从理论的角度来看,作者认为样本值保留在样本集内的概率单调衰减更为合适。 像素模型应包含来自像素的最近过去的样本,但不一定要丢弃较旧的样本。因此,根据均匀概率密度函数选择随机丢弃样本,而不是系统地从像素模型中删除最旧的样本。

VIBE算法详解

讲了这么多,让我们深入来看一下VIBE算法到底是怎么一回事儿。这里尽量以最简单最通俗的方法、严格遵循原文文献的翻译来解释。

首先,用v(x)表示在x位置处的像素点的值,那么随着时间推移,该处的背景像素点可以可以构成一个集合M(x):

以当前值v(x)为圆心,R为半径,构造一个圆球。这个球体和M(x)的交集的元素数目记为#:

用图表示如下图:

背景建模算法比较与ViBe算法论文解读与python代码_第1张图片

人为设定一个阈值#,如果上式中的#超过#,即前文提到的思想:从已有的背景样本中取得一些值和当前值足够接近了,那么当前值v(x)就记为背景值,存入M(x)中。

根据经验,唯二决定当前值是否为背景的参数R和#可以分别取20(单色图片情形下)和2。

它们俩合并成一个叫“灵敏度”的因子:

初始化方法

根据前文所述,统计模型的缺点就是要用很多的帧通过一些运算得到背景模型,这样对时效性的要求可能无法满足;还有一种方法是直接用单一帧作为背景,但这样若存在光照突变,背景模型也会随之突变。VIBE也是用单帧获取背景,而且希望在第二帧时就能算出背景。

由于单帧中没有时间信息,作者假设相邻像素有相似的时间分布。这允许我们在每个像素的空间邻域中找到的值来填充像素模型。 更确切地说,用第一帧中随机拍摄的值填充它们。需要选择邻域的大小,使其足够大以包含足够数量的不同样本,同时记住不同位置的值之间的统计相关性随着邻域的大小增加而减小。作者实验证明,在每个像素的8连通邻域中随机选取样本,对于640×480像素的图像是令人满意的。

背景模型像素集合如下式:

M的右上角t,表示第t时刻帧。N_{G}(x)是x的邻域。故y是x的邻域中的某个位置。v(y)则表示这个位置的像素值(value)。这个式子表达的意思就是,第0时刻(初始时刻)时从x邻域中选一个像素值放到背景集合里面。

事实证明,这一策略是成功的。 唯一的缺点是在第一帧中存在移动物体时,将引入“鬼影”。 在随后的帧中,对象移动并揭示真实的背景,这将通过常规模型更新过程逐步学习,使鬼魂随着时间的推移而逐渐消失。 

模型更新方法

1)无记忆更新策略,确保存储在背景像素模型中的样本像素点具有平滑衰减的寿命。

在更新像素模型之后保留模型中存在的样本的概率为:(N-1)/N。M(x)中的N是个定值。

则在t+dt的任意时刻,此概率可以根据独立重复事件原理表示为:

背景建模算法比较与ViBe算法论文解读与python代码_第2张图片   或

该表达式表明模型的任何样本值的预期剩余寿命呈指数衰减。且保留的像素点与时刻t无关,可以理解为过去对现在、未来没有影响,所有像素都是平等地随时间衰减、被筛选,所以称为无记忆。

2)随机时间子采样以扩展背景像素模型覆盖的时间窗口。

为了进一步扩展固定大小的像素模型所覆盖的时间窗口的大小,我们采用随机时间子采样。 这个想法是因为在许多实际情况中,没有必要为每个新帧更新每个背景像素模型。 为了减少背景更新,减少运算量,我们人为地延长了背景模型中元素的寿命(但是,在存在周期性或伪周期性背景运动的情况下,使用固定的子采样间隔可能会阻止背景模型适当地适应这些运动)。 VIBE算法使用“随机子采样策略”即当像素值已被分类为属于背景时,由一个随机过程确定该值是否用于更新相应的像素模型。这里,VIBE算法定义了一个\phi=16,表示背景像素值有1/16几率被选中来更新其像素模型。这个值可以根据我们期望的时间窗口保留长度来微调:值越小,更新几率越高,那么旧的像素被替换的频率就越高。

3)在空间上传播背景像素样本以确保空间一致性,并允许适应由前景掩盖的背景像素模型。 

一种流行的方法是使用“检测支持图”,其计算像素被分类为前景的连续次数。 如果该数量达到特定像素位置的给定阈值,则将该位置处的当前像素值插入到背景模型中。但是这种方法只能延缓,不能完全阻止运动缓慢的前景目标被纳为背景。

VIBE算法让被前景遮挡的背景将不时使用来自相邻像素位置的背景样本进行更新。这允许关于背景进化的信息的空间扩散,其依赖于仅被分类为背景的样本。 因此,VIBE背景模型能够适应不断变化的照明和结构演变(添加或移除背景物体),同时依赖于严格的保守更新方案。由于像素模型包含许多样本,因此可能意外插入邻居模型的不相关信息不会影响检测的准确性。 此外,在无法进一步传播之前需要匹配观测值,从而阻止了无关信息的错误传播。 这种自然限制抑制了误差的扩散。

ViBe不对视频流帧速率或色彩空间做出任何假设,也不对场景内容、背景本身或其随时间的变化做出任何假设。 因此,我们将其称为通用方法。

参考资料

混合高斯模型算法的综述:Goyal K , Singhai J . Review of background subtraction methods using Gaussian mixture model for video surveillance systems[J]. Artificial Intelligence Review, 2017.

VIBE算法原始文献:Barnich O, Van Droogenbroeck M. ViBe: a universal background subtraction algorithm for video sequences.[J]. IEEE Transactions on Image Processing, 2011, 20(6):1709-1724.

VIBE算法官网:http://www.telecom.ulg.ac.be/research/vibe/

检测支持图:I. Haritaoglu, D. Harwood, and L. Davis, “? : Real-time surveillance of people and their activities,” IEEE Trans. Pattern Anal. Mach. Intell., vol. 22, no. 8, pp. 809–830, Aug. 2000.

值得参考:

《背景提取算法——帧间差分法、背景差分法、ViBe背景提取算法》

《论文翻译:ViBe+算法(ViBe算法的改进版本)》

《Background Subtraction: Experiments and Improvements for ViBe》

ViBe的Python代码

在网上搜罗了一些ViBe的Python版代码,都有些错误或运行不了。于是自己编写了ViBe-python代码,自己论文中使用,亲测可行,需要的同学可联系我(等论文发了之后吧hh)。

或直接使用作者公开的C++代码。

 

你可能感兴趣的:(机器视觉/计算机视觉,Vibe,背景建模,GMM)