目录

背景建模方法需要考虑的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可以自适应地根据统计方差来调整。但是统计方差是一个时间维度上的平均,和帧率、背景像素个数有关。这在一些场景中是不适用的,比如远程联网的相机,其帧率是由带宽决定的。这导致模型的更新方法不是非常合理,无法像想象中那么理想地实现自适应的效果。

VIBE算法的巧妙之处

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

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

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

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

VIBE算法详解

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

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

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

用图表示如下图:

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

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

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

初始化方法

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

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

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

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

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

模型更新方法

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

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

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

   或

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

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

为了进一步扩展固定大小的像素模型所覆盖的时间窗口的大小,我们采用随机时间子采样。 这个想法是因为在许多实际情况中,没有必要为每个新帧更新每个背景像素模型。 为了减少背景更新,减少运算量,我们人为地延长了背景模型中元素的寿命(但是,在存在周期性或伪周期性背景运动的情况下,使用固定的子采样间隔可能会阻止背景模型适当地适应这些运动)。 VIBE算法使用“随机子采样策略”即当像素值已被分类为属于背景时,由一个随机过程确定该值是否用于更新相应的像素模型。这里,VIBE算法定义了一个=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算法论文解读与python代码相关推荐

  1. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  2. 数学建模——一维、二维插值模型详解Python代码

    数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...

  3. OpenCV中背景建模方法mog2——Adaptive GMM算法小结

    GMM是网上到处可见且用得最多的背景建模算法,论文上很多相关概率公式,又看了很多博客对于GMM的解释,直到现在还总是觉得很难理解其中的真谛,从各方面整理一下目前自己所理解的内容,如果有理解偏差,欢迎指 ...

  4. OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGSOC的使用示例代码及运行效果

    关于类cv::bgsegm::BackgroundSubtractorCNT的大概情况,我已在博文https://blog.csdn.net/wenhao_ir/article/details/125 ...

  5. k近邻回归算法python_K近邻算法用作回归的使用介绍(使用Python代码)

    介绍 在我遇到的所有机器学习算法中,KNN是最容易上手的.尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样). 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更 ...

  6. python实现冒泡排序算法的非递归版本_冒泡排序以及python代码实现(递归+非递归)...

    一.冒泡排序 比较简单的排序算法,适合小规模数据集,效率较低. 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面. 每进行一趟排序,就会少比较一个数 python代码(非递归): fro ...

  7. python图像融合算法_图像融合质量评价方法的python代码实现——MS-SSIM

    图像融合质量评价方法的python代码实现--MS-SSIM 图像融合质量评价方法的python代码实现--MS-SSIM 文章目录 1 前言 2 MS-SSIM介绍 2 MS-SSIM的代码 2.1 ...

  8. 基于BAS算法实现复杂网络社区发现问题——附python代码

    基于智能优化算法的复杂网络社区发现问题 第一章 基于天牛须算法求解复杂网络社区发现问题 文章目录 基于智能优化算法的复杂网络社区发现问题 前言 一.基本天牛须算法 二.关于社区发现 基本问题 总结 前 ...

  9. 【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现

    文章目录 一.贝叶斯简介 二.贝叶斯公式推导 三.拼写纠正案例 四.垃圾邮件过滤案例 4.1 问题描述 4.2 朴素贝叶斯引入 五.基于朴素贝叶斯的垃圾邮件过滤实战 5.1 导入相关库 5.2 邮件数 ...

  10. knn算法python理解与预测_K近邻算法用作回归的使用介绍(使用Python代码)

    介绍 在我遇到的所有机器学习算法中,KNN是最容易上手的.尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样). 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更 ...

最新文章

  1. 赛门铁克开启“容灾即服务”时代
  2. jquery选中checkbox
  3. css匹配title,解决css中的匹配问题
  4. 【SQLAlchemy】MySQL server has gone away 原因分析、解决方法
  5. 给准保研生/调剂生的几个简历制作的建议
  6. 前端Http协议缓存初解
  7. 百度地图手机和电脑不一致_你可能不知道的电脑手机冷知识
  8. Object-c 中字符串与数组的处理
  9. Hive之 hive的三种使用方式(CLI、HWI、Thrift)
  10. ECSHOP的订单状态在数据库中的表现(order_status, shipping_status, pay_status)
  11. table与tr td样式重叠 table样式边框变细
  12. 为啥mysql的load这么快_【MySQL】浅谈MySQL的LOAD DATA
  13. 浅聊||高速PCB过孔设计需要注意这些问题
  14. Ubuntu14.04 用 CrossOver 安装 TMQQ2013
  15. (default-compile) on project datasource-demo: Fatal error compiling
  16. C++:实现量化exchangerate汇率测试实例
  17. Cairngorm开发框架
  18. Cf252中子发射能谱模型
  19. 计算多项式的值(秦九昭算法,clock()函数的使用)
  20. 拥抱组件化开发,手淘项目内部架构分享

热门文章

  1. 数据库连接池Spring JDBC(JdbcTemplate)
  2. C语言 饭卡管理系统
  3. 实对称矩阵的特征值求法_特征值的最大值与最小值
  4. ae遮罩路径图形扭曲插件BAO Boa
  5. 算法设计与分析——prim算法
  6. 决策树识别MNIST数据集
  7. rgba 透明度转换十六进制
  8. 教育数据开放平台-雄文
  9. 基于OpenCv的人脸识别(Python完整代码)
  10. 软件项目管理的重点知识