ViBe - a powerful technique for background detection and subtraction in video sequences

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


描述

ViBe是一种像素级视频背景建模或前景检测的算法,效果优于所熟知的几种算法,对硬件内存占用也少。ViBe是一种像素级的背景建模、前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新。在无法确定像素变化的模型时,随机的更新策略,在一定程度上可以模拟像素变化的不确定性。

  • 背景差方法实现运动物体检测面临的挑战主要有:

  • 可直接应用在产品中,软硬件兼容性好;

  • 必须适应环境的变化(比如光照的变化造成图像色度的变化);

  • 相机抖动引起画面的抖动(比如手持相机拍照时候的移动);

  • 图像中密集出现的物体(比如树叶或树干等密集出现的物体,要正确的检测出来);

  • 必须能够正确的检测出背景物体的改变(比如新停下的车必须及时的归为背景物体,而有静止开始移动的物体也需要及时的检测出来)。


  • 物体检测中往往会出现Ghost区域,Ghost区域也就是指当一个原本静止的物体开始运动,背静差检测算法可能会将原来该物体所覆盖的区域错误的检测为运动的,这块区域就成为Ghost,当然原来运动的物体变为静止的也会引入Ghost区域,Ghost区域在检测中必须被尽快的消除。一个Ghost区域的实例如图Fig.1,在图中可以发现相比于原图,检测的结果中错误的多出现了两个人的形状,这就是Ghost。

    Fig 1

    ViBe算法详解:

    ViBe检测方法

    ViBe是本篇论文中所提出的一个检测方法,相比于其他方法它有很多的不同和优点。具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。该模型主要包括三个方面:模型的工作原理;模型的初始化方法;模型的更新策略。

    模型的工作原理

    背景物体就是指静止的或是非常缓慢的移动的物体,而前景物体就对应移动的物体。所以我们可以把物体检测看出一个分类问题,也就是来确定一个像素点是否属于背景点。在ViBe模型中,背景模型为每个背景点存储了一个样本集,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。可以知道如果一个新的观察值属于背景点那么它应该和样本集中的采样值比较接近。

    具体的讲,我们记v(x):x点处的像素值;M(x)={V1,V2,…VN}为x处的背景样本集(样本集大小为N);SR(v(x)):以x为中心R为半径的区域,如果M(x) [{SR(v(x))∩ {v1,v2, . . . , vN}}]大于一个给定的阈值#min,那么就认为x点属于背景点。

    背景模型的初始化

      初始化是建立背景模型的过程,一般的检测算法需要一定长度的视频序列学习完成,影响了检测的实时性,而且当视频画面突然变化时,重新学习背景模型需要较长时间。

      ViBe算法主要是利用单帧视频序列初始化背景模型,对于一个像素点,结合相邻像素点拥有相近像素值的空间分布特性,随机的选择它的邻域点的像素值作为它的模型样本值。ViBe的初始化仅仅通过一帧图像即可完成。ViBe初始化就是填充像素的样本集的过程但是由于在一帧图像中不可能包含像素点的时空分布信息,我们利用了相近像素点拥有相近的时空分布特性,具体来讲就是:对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。M0(x) = {v0(y | y ∈NG(x))},t=0初始时刻,NG(x)即为邻居点 。这种初始化方法优点是对于噪声的反应比较灵敏,计算量小速度快,可以很快的进行运动物体的检测,缺点是容易引入Ghost区域。

      优点:不仅减少了背景模型建立的过程,还可以处理背景突然变化的情况,当检测到背景突然变化明显时,只需要舍弃原始的模型,重新利用变化后的首帧图像建立背景模型。

      缺点:由于可能采用了运动物体的像素初始化样本集,容易引入拖影(Ghost)区域。

    前景检测过程

      背景模型为每个背景点存储一个样本集,然后每个新的像素值和样本集比较判断是否属于背景。

      计算新像素值和样本集中每个样本值的距离,若距离小于阈值,则近似样本点数目增加。

      如果近似样本点数目大于阈值,则认为新的像素点为背景。

      检测过程主要由三个参数决定:样本集数目N,阈值#min和距离相近判定的阈值R,一般具体实现,参数设置为N=20,#min=2,R=20。

      

    背景模型的更新策略

    背景模型的更新就是使得背景模型能够适应背景的不断变化,比如光照的变化,背景物体的变更等等。保守的更新策略:前景点永远不会被用来填充背景模型,会引起死锁,比如初始化的时候如果一块静止的区域被错误的检测为运动的,那么在这种策略下它永远会被当做运动的物体来对待;Blind策略:对死锁不敏感,前景背景都可以来更新背景模型,缺点是缓慢移动的物体会融入背景中无法被检测出来。在本方法中采用的更新策略是保守的更新策略+前景点计数方法。前景点计数:对像素点进行统计,如果某个像素点连续N次被检测为前景,则将其更新为背景点。

    随机的子采样:在每一个新的视频帧中都去更新背景模型中的每一个像素点的样本值是没有必要的,当一个像素点被分类为背景点时,它有1/ φ的概率去更新背景模型。

    具体的更新方法:每一个背景点有1/ φ的概率去更新自己的模型样本值,同时也有1/ φ的概率去更新它的邻居点的模型样本值。更新邻居的样本值利用了像素值的空间传播特性,背景模型逐渐向外扩 散,这也有利于Ghost区域的更快的识别。同时当前景点计数达到临界值时将其变为背景,并有1/ φ的概率去更新自己的模型样本值。

    在选择要替换的样本集中的样本值时候,我们是随机选取一个样本值进行更新,这样可以保证样本值的平滑的生命周期由于是随机的更新,这样一个样本值在时刻t不被更新的概率是 (N-1)/N,假设时间是连续的,那么在dt的时间过去后,样本值仍然保留的概率是

    也可以写作, 

    这就表明一个样本值在模型中是否被替换与时间t无关 ,随机策略是合适的。

    1).无记忆更新策略

      每次确定需要更新像素点的背景模型时,以新的像素值随机取代该像素点样本集的一个样本值。

    2).时间取样更新策略

      并不是每处理一帧数据,都需要更新处理,而是按一定的更新率更新背景模型。当一个像素点被判定为背景时,它有1/rate的概率更新背景模型。rate是时间采样因子,一般取值为16。

    3).空间邻域更新策略

      针对需要更新像素点,随机的选择一个该像素点邻域的背景模型,以新的像素点更新被选中的背景模型。

    ViBe的改进

      

    1).距离计算方法

      以圆椎模型代替原来的几何距离计算方法

      

      以自适应阈值代替原来固定的距离判定阈值,阈值大小与样本集的方差成正比,样本集方差越大,说明背景越复杂,判定阈值应该越大。

      

    2).分离updating mask和segmentation mask

      引入目标整体的概念,弥补基于像素级前景检测的不足。针对updating mask和segmentation mask采用不同尺寸的形态学处理方法,提高检测准确率。

    3).抑制邻域更新

      在updating mask里,计算像素点的梯度,根据梯度大小,确定是否需要更新邻域。梯度值越大,说明像素值变化越大,说明该像素值可能为前景,不应该更新。

    4).检测闪烁像素点

      引入闪烁程度的概念,当一个像素点的updating label与前一帧的updating label不一样时,blinking level增加15,否则,减少1,然后根据blinking level的大小判断该像素点是否为闪烁点。闪烁像素主要出现在背景复杂的场景,如树叶、水纹等,这些场景会出现像素背景和前景的频繁变化,因而针对这些闪烁应该单独处理,可以作为全部作为背景。

    5).增加更新因子

      ViBe算法中,默认的更新因子是16,当背景变化很快时,背景模型无法快速的更新,将会导致前景检测的较多的错误。因而,需要根据背景变化快慢程度,调整更新因子的大小,可将更新因子分多个等级,如rate = 16,rate = 5,rate = 1。

    ViBe实验结果

    在实验中,我们和其他的一些检测算法在检测准确率和算法的计算量方面都进行了比较,实验表明我们的方法检测效果明显要好很多,对于光照的变化和相机抖动等的效果都十分稳定,而且计算量非常小,内存占用较少,这就使得该方法能够用于嵌入手持照相机中。一些具体的实验效果和数据如下

    Fig.2检测效果对比

    Fig.3相机的移动

    Fig.4 Ghost区域消融,图中的光亮的地板

      

    Fig.5检测正确率                                                                             Fig.6算法处理速度

    总结

    在这片文章中,我们提出了一个新的背静差算法-ViBe,和以前相比它具有三个不同点。首先,我们提出了一个新的分类模型。其次,我们介绍了ViBe如何初始化,它只需要一帧图像即可完成初始化,而其他的算法通常需要等待数秒去完成初始化,这对于嵌入照相机中的要求实时性比较高的和一些比较短的视频序列很有帮助。 最后,我们提出了自己的更新策略,相比于其他算法将样本值在模型中保存一个固定的时间,我们采用随机的替换更新样本值,经过证明这样可以保证样本值的一个指数衰减的平滑生命周期,并且可以使得背景模型很好的适应视频场景的变化,从而达到更好的检测效果。

    通过一系列实验表明ViBe方法相比于其他的一些检测算法具有计算量小、内存占用少、处理速度快、检测效果好、有更快的Ghost区域消融速度和应对噪声稳定可靠的特点,并且非常适合嵌入照相机等要求计算量小和内存占用少的情境中。

    效果图:

    Code

    算法执行效率测试程序,windows和Linux操作系统下的程序和c/c++文件都可以在作者官网下载,如下:

  • Windows and Linux users: a benchmarking program to evaluate the time needed by ViBe on your platform and on your own sequences! Download an archive zip archive [15 MB] to evaluate the time needed by ViBe on your platform (Windows or Linux [Wine]), and on your own sequences.
  • A program for Windows and Linux. Download an archive zip archive [16 MB] to use ViBe on Windows (or under Wine in Linux).
    The program allows you to: (1) save the result for your own images, (2) change the few parameters of ViBe to experiment with, and (3) reproduce our results.
  • Linux: link a C/C++ object file to your own code. We provide the object (compiled) code of ViBe for non-commercial applications. Under Linux, download the32 bits zip file, or the 64 bits zip file. Details on this page.
  • 在使用ViBe算法时应该遵循算法官网的License。
  • 算法的主要优势:
  • 内存占用少,一个像素需要作一次比较,占用一个字节的内存;
  • 无参数法;

    性能优于混合高斯,参数化方法,SACON等;

    像素级算法,视频处理中的预处理关键步骤;

    背景模型及时初始化;

    具有较好的抗噪能力。

    参考文献:

    Performance

    对应的Code下载地址:http://pan.baidu.com/share/link?shareid=409860&uk=3373051938                                               代码解析参考:http://blog.csdn.net/kezunhai/article/details/9190923

ViBe算法原理和代码解析相关推荐

  1. java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析

    FFT与DFT关系: 快速傅里叶变换(Fast Fourier Transform)是离散傅里叶(DFT)变换的一种快速算法,简称FFT,通过FFT可以将一个信号从时域变换到频域:FFT(快速傅里叶变 ...

  2. 视觉SLAM开源算法ORB-SLAM3 原理与代码解析

    来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...

  3. ICCV2017跟踪算法BACF原理及代码解析

    文章和代码下载地址: Galoogahi H K, Fagg A, Lucey S. Learning Background-Aware Correlation Filters for Visual ...

  4. TPAMI2015跟踪算法KCF原理及代码解析

    文章和代码下载地址: http://www.robots.ox.ac.uk/~joao/circulant/ 一.基础公式的由来 相关滤波跟踪器可以表示为最小化的岭回归问题: 表示期望相应,表示正则系 ...

  5. DBNet++(TPAMI) 原理与代码解析

    paper:Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion code ...

  6. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  7. YOLOv3原理及代码解析

    博主完整翻译了YOLOV1和YOLOV3的论文:请移步查看: YOLOV1:https://blog.csdn.net/taifengzikai/article/details/81988891 YO ...

  8. HoughCircle(霍夫圆)算法原理及代码实现

      此算法建立在Canny算法的基础上,对Canny算法检测出的边缘图像进行拟合,因此要用到Canny算法返回的边缘图像及梯度方向矩阵.Canny算法相关内容详见上一篇博客:Canny边缘检测算法原理 ...

  9. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

最新文章

  1. Ponemon:2018年度数据泄露成本分析报告
  2. 程序员,你得一条道走到黑!
  3. [转载]关于Android ProGuard混淆学习记录
  4. UITabBar背景、icon图标颜色、被选中背景设置以及隐藏UITabBar的两种方式
  5. Python对QQ音乐进行爬取并进行数据分析
  6. 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
  7. LeetCode677. 键值映射(Trie树)
  8. python中函数的可变参数解析
  9. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)
  10. 基于JAVA+Swing+MYSQL的进销存管理系统
  11. ShardingSphere源码解析 初步准备
  12. 【一天一个C++小知识】005. C++中的句柄类(智能指针)
  13. Web 字体简介: TTF, OTF, WOFF, EOT SVG
  14. python统计pdf字数_Python统计字数的思路详解
  15. sourceinsight界面中的英文解释
  16. SUN进入RFID中间件市场 Linux版本今秋发售
  17. 不同范数下的余弦定理_平行四边形法则与勾股定理–内积与范数
  18. HC Bridge容器网络模式分享
  19. hand crafted feature:histogram(直方图)
  20. 拉普拉斯方程和泊松方程的MATLAB可视化

热门文章

  1. OpenCV3.0.0下的视频稳像代码,效果不错哦
  2. 大学生学习c语言方法,针对在校大学生的C语言入门学习——函数
  3. c语言 amp 位与 什么意思,C语言中amp;是什么意思?--龙方网络
  4. 用git发patch
  5. MyBatis构建sql时动态传入表名以及字段名
  6. Kubernetes Pod的生命周期(Lifecycle)
  7. acwing算法题--混合背包问题
  8. leetcode算法题--推多米诺
  9. linux内核单独安装,Linux内核编译与安装
  10. Filter学习(一)