1. 程式人生 > >ViBe演算法原理和程式碼解析

ViBe演算法原理和程式碼解析

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

描述

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

  • An independant evaluation is available in S. Brutzer, B. Hoferlin, and G. Heidemann.  In IEEE International Conference on Computer Vision and Pattern Recognition (CVPR), pages 1937-1944, Colorado Spring, USA, June 2011. 
    In their conclusions, they claim: "Considering these aspects, Barnich is a strong favorite, since it is simple and almost parameterless."