背景建模算法比较与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可以自適應地根據統計方差來調整。但是統計方差是一個時間維度上的平均,和幀率、背景像素個數有關。這在一些場景中是不適用的,比如遠程聯網的相機,其幀率是由帶寬決定的。這導致模型的更新方法不是非常合理,無法像想象中那么理想地實現自適應的效果。
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代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TDA2x软件框架分析
- 下一篇: python snap7 plc_基于S