ViBe算法核心思想
ViBe算法:ViBe - a powerful technique for background detection and subtraction in video sequences
算法官网:http://www2.ulg.ac.be/telecom/research/vibe/
描述:
ViBe是一种像素级视频背景建模或前景检测的算法,效果优于所熟知的几种算法,对硬件内存占用也少。
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等;
像素级算法,视频处理中的预处理关键步骤;
背景模型及时初始化;
具有较好的抗噪能力。
参考文献:
- O. Barnich and M. Van Droogenbroeck. ViBe: A universal background subtraction algorithm for video sequences. In IEEE Transactions on Image Processing, 20(6):1709-1724, June 2011. Also available on the University site in PDF format: , and HTML format. This paper contains a very detailed pseudo-code description of the complete algorithm.
- M. Van Droogenbroeck and O. Paquot. Background Subtraction: Experiments and Improvements for ViBe. In Change Detection Workshop (CDW), Providence, Rhode Island, June 2012. Available on the University site in PDF format: , and HTML format.
- O. Barnich and M. Van Droogenbroeck. ViBe: a powerful random technique to estimate the background in video sequences. In International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2009), pages 945-948, April 2009. Available as a IEEE publication or on the University site.
- Patent description at the "freepatentsonline" web site
Performance
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初始化就是填充像素的样本集的过程但是由于在一帧图像中不可能包含像素点的时空分布信息,我们利用了相近像素点拥有相近的时空分布特性,具体来讲就是:对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。M0(x) = {v0(y | y ∈NG(x))},t=0初始时刻,NG(x)即为邻居点 。这种初始化方法优点是对于噪声的反应比较灵敏,计算量小速度快,可以很快的进行运动物体的检测,缺点是容易引入Ghost区域。
模型的更新策略
背景模型的更新就是使得背景模型能够适应背景的不断变化,比如光照的变化,背景物体的变更等等。保守的更新策略:前景点永远不会被用来填充背景模型,会引起死锁,比如初始化的时候如果一块静止的区域被错误的检测为运动的,那么在这种策略下它永远会被当做运动的物体来对待;Blind策略:对死锁不敏感,前景背景都可以来更新背景模型,缺点是缓慢移动的物体会融入背景中无法被检测出来。在本方法中采用的更新策略是保守的更新策略+前景点计数方法。前景点计数:对像素点进行统计,如果某个像素点连续N次被检测为前景,则将其更新为背景点。
随机的子采样:在每一个新的视频帧中都去更新背景模型中的每一个像素点的样本值是没有必要的,当一个像素点被分类为背景点时,它有1/ φ的概率去更新背景模型。
具体的更新方法:每一个背景点有1/ φ的概率去更新自己的模型样本值,同时也有1/ φ的概率去更新它的邻居点的模型样本值。更新邻居的样本值利用了像素值的空间传播特性,背景模型逐渐向外扩 散,这也有利于Ghost区域的更快的识别。同时当前景点计数达到临界值时将其变为背景,并有1/ φ的概率去更新自己的模型样本值。
在选择要替换的样本集中的样本值时候,我们是随机选取一个样本值进行更新,这样可以保证样本值的平滑的生命周期由于是随机的更新,这样一个样本值在时刻t不被更新的概率是 (N-1)/N,假设时间是连续的,那么在dt的时间过去后,样本值仍然保留的概率是
也可以写作,
这就表明一个样本值在模型中是否被替换与时间t无关 ,随机策略是合适的。
ViBe实验结果
在实验中,我们和其他的一些检测算法在检测准确率和算法的计算量方面都进行了比较,实验表明我们的方法检测效果明显要好很多,对于光照的变化和相机抖动等的效果都十分稳定,而且计算量非常小,内存占用较少,这就使得该方法能够用于嵌入手持照相机中。一些具体的实验效果和数据如下
Fig.2检测效果对比
Fig.3相机的移动
Fig.4 Ghost区域消融,图中的光亮的地板
Fig.5检测正确率 Fig.6算法处理速度
总结
在这片文章中,我们提出了一个新的背静差算法-ViBe,和以前相比它具有三个不同点。首先,我们提出了一个新的分类模型。其次,我们介绍了ViBe如何初始化,它只需要一帧图像即可完成初始化,而其他的算法通常需要等待数秒去完成初始化,这对于嵌入照相机中的要求实时性比较高的和一些比较短的视频序列很有帮助。 最后,我们提出了自己的更新策略,相比于其他算法将样本值在模型中保存一个固定的时间,我们采用随机的替换更新样本值,经过证明这样可以保证样本值的一个指数衰减的平滑生命周期,并且可以使得背景模型很好的适应视频场景的变化,从而达到更好的检测效果。
通过一系列实验表明ViBe方法相比于其他的一些检测算法具有计算量小、内存占用少、处理速度快、检测效果好、有更快的Ghost区域消融速度和应对噪声稳定可靠的特点,并且非常适合嵌入照相机等要求计算量小和内存占用少的情境中。
效果图:
ViBe算法核心思想相关推荐
- 基于深度学习的图像分类算法核心思想与算法优化总结(深度学习与图像分析-李松斌)
深度学习-图像分类算法 小卷积核应用-VGGNet 最优局部稀疏结构-Inception 恒等映射残差单元-ResNet 多层密集连接-DenseNet 特征通道重标定-SENet 通道压缩与扩展-S ...
- 【算法特训总结】计算机经典算法的核心思想及独特角度的解读
计算机经典算法的核心思想及独特角度的解读 在1月1日新年之日开始的"算法特训"(一月一日~二月十日)终于结束了,对于这本<<算法竞赛经典>>,除了第十章(在 ...
- 回溯算法:从电影蝴蝶效应中学习回溯算法的核心思想
回溯算法:从电影<蝴蝶效应>中学习回溯算法的核心思想 数独.八皇后.0-1背包.图的着色.旅行商问题.全排列问题都能用到 理解"回溯算法" 回溯的思想,类似枚举搜索,枚 ...
- SHA1 算法加密技术核心思想
SHA1 算法加密技术核心思想 一.认知 1.在我们的平时生活中,经常会接触到一些密码,通过这些密码,能对我们的一些资产和隐私的东西做到保护作用,比如: 古墓密码锁 暗号:天王盖地虎,..... 美国 ...
- kmeans算法的核心思想和实现逻辑流程
1 概述 K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大. 该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且 ...
- 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?
主成分分析(Principle Component Analysis)PCA的核心思想是什么?增量PCA模型, 随机PCA, 模型. 核化PCA分别是什么?使用时如何选择? 主成分分析(Princip ...
- 极客时间——数据结构与算法(39) 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
转载地址:https://time.geekbang.org/column/article/74287 我们在第 31 节提到,深度优先搜索算法利用的是回溯算法思想.这个算法思想非常简单,但是应用却非 ...
- 算法设计思想(5)— 递归法
1. 递归概念 递归 Recursion是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己. 递归有两层含义: 递归问题必须可以分解为若干个规模较小.与原问题形式相同的子问 ...
- 卡尔曼算法笔记---思想和实际应用物理含义的理解
此片blog的目的是理解卡尔曼算法的思想和实际应用的物理含义,想法很好,却只能理解冰山一角,先记下这一角 另本blog参考卡尔曼滤波 -- 从推导到应用和徐亦达卡尔曼推导视频 首先认识卡尔曼算法在数学 ...
- 背景建模--Vibe 算法改进
背景建模--Vibe 算法改进 一.概述 针对鬼影问题,提出一种了基于前景区域与邻域背景区域直方图相似性度量的判别方法,检测并消除鬼影:针对静止目标问题,改进了Vibe背景模型的更新策略,有效抑制静止 ...
最新文章
- 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第一讲)
- mybatis plus 中 EntityWrapper源码解读
- 初识Tcl(七):Tcl 字符串
- java伪装成mysql从节点_开发时java项目启动时需要连mysql等,有没有什么工具可以mock连接使得启动顺利不报错?...
- SVN提示:由于目标机器积极拒绝,无法连接 的解决方法
- 抓住县域消费者的“胃”,淘特凭什么?
- 匆匆那年之Java程序员之最近两周的面试总结:
- C语言超级玛丽菜单模块源码
- 对比特币勒索病毒进行批量安装永恒之蓝补丁
- ‘UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte‘成功解决
- idea运行android usb调试,android-Intellij Idea不允许在真实设备上运行应...
- docs和src_《编写Docs波特兰2017》中的提示和顶级演示
- ndk c调用java_使用NDK将Android转换为C,然后在C中调用Java函数
- CString 是一种很有用的数据类型
- three.js中文文档下载_threejs基础学习一
- Netty框架入门案例,代码示例
- 线段树(updata+query)
- 海量数据挖掘MMDS week6: MapReduce算法(进阶)
- 软件测试过程的四个阶段(单元测试、集成测试、系统测试、验收测试)
- “硬件极客”:树莓派Raspberrypi安装Kali Linux保姆教程(通过树莓派安装ARM Kali教程)
热门文章
- 计算机毕业设计ssm飞机售票管理系统63z52系统+程序+源码+lw+远程部署
- Android 实例子源代码文件下载地址380个合集
- 大神总结的图像处理学习路线
- JSON cannot be resolved 解决方法
- 快手直播怎么下载?一键轻松下载直播
- 基于单片机的倒车雷达/超声波测距系统设计(#0510)
- 信息系统项目管理师-学习笔记与复习资料
- 计算机中职基础试题及答案,中职类计算机应用基础试题「附答案」
- java代码定义窗口_代码窗口九种方式实现 javascripts 弹出对话框窗口代码
- web的UI自动化实现步骤