目标跟踪之MOSSE算法(C++版本配置及原理简介)
MOSSE算法(Minimum Output Sum of Squared Error)是相關濾波用于目標跟蹤的鼻祖,可以說是目標跟蹤入門學習的第一步。由于作者沒有給出C代碼,所以網上的C代碼五花八門,本文參考博客,對其寫的C代碼進行編譯,并推導MOSSE跟蹤的相關公式,及對MOSSE跟蹤流程進行介紹。
操作平臺:Ubuntu14.04
推薦C++源碼:https://github.com/mint-deeplearning/mosse_tracker
論文及推薦Matlab源碼(本文不做介紹):https://github.com/xingqing45678/Mosse_CF
一、代碼運行
代碼相當簡潔,令人舒適,在Linux底下,直接輸入sudo cmake .進行編譯,再輸入sudo make進行編譯生成可執行文件mosse,輸入./mosse save.avi(注意將需要跟蹤的視頻save.avi放在可執行文件的同一級目錄下),在第一幀使用鼠標右鍵畫出目標跟蹤框,即可實現跟蹤。
二、原理簡介
2.1相關概念
相關是用來衡量兩個信號相似程度的概念,兩個信號越相似,相關值越大。因此,在目標跟蹤的過程中,以當前幀訓練一個模板(濾波器),并與下一幀進行相關運算,相關值最大的位置即下一幀目標的位置。
相關公式:
卷積公式
兩者關系如下
可以發現卷積和相關在公式上相差一個負號,由于卷積定理(空域卷積在傅里葉變換下可以變成頻域點乘),為簡化計算量,在相關濾波中,我們常借用卷積公式來實現相關計算,但切記,兩者物理意義相差巨大,只是公式相似可以相互表示。
如何簡化計算?----將卷積變換到頻域
簡寫為
其中F(h(?n))=H?F(h(-n))=H^{*}F(h(?n))=H?,?\bigodot?表示點乘,*表示復共軛;由此可見,空域中復雜的相關運算變成頻域中的點乘,通過反傅里葉變換便可以得到響應分布,極大提高了計算速度,降低了計算量(降為O(PlogP)O(PlogP)O(PlogP),P為跟蹤窗內的像素數量)。
2.2MOSSE算法跟蹤流程
2.2.1預處理
預處理主要包括:
1. 引入log函數,解決低照度照明的情況;
由于自然條件復雜,光照亮暗對圖像像素值有極大的影響,引入log主要是提高對比度
2. 引入余弦窗,抑制邊緣效應。
由于我們產生的濾波器的大小與我們檢測圖像的大小一致,只要稍微偏移就會超出,因此我們進行周期卷積時會對輸入數據邊界進行周期填補(如下圖,該圖來自博客CVPR2010跟蹤算法MOSSE原理及代碼解析),但同時也引入一些artifacts,而加余弦窗有利于突出中心,減少邊緣效應(邊緣效應主要是人為對邊界填充的時候帶來的)
注:
FFT卷積算法的一個問題是圖像和濾波器被映射到圓環的拓撲結構上。換句話說,它將圖像的左邊緣連接到右邊緣,將頂部連接到底部。在卷積過程中,圖像在環形空間中旋轉,而不是像在空間域中那樣平移。人為地連接圖像的邊界會引入一個影響相關輸出的偽影。
2.2.2濾波器模板訓練
首先,濾波器模板H?H^{*}H?與目標區域FFF進行相關運算,將在目標位置處得到最大響應值,如何表示這個響應值?作者引入高斯響應GGG,即理想情況下,相關運算將以目標位置為中心,形成一個高斯響應圖GGG。
濾波器模板H?H^{*}H?計算公式為:
但是濾波器模板的訓練只用一張圖片肯定是不夠的(通俗點可以理解為不可能從一個點來求出一條曲線,需要多次采樣,得到許多張訓練樣本,及使用多個點來確定曲線----濾波器模板),實際應用中常常在目標位置附近進行大量的隨機采樣,通過最小二乘法來最小化誤差的平方(Minimum Output Sum of Squared Error名字的由來)來得到濾波器模板H?H^{*}H?。下面公式中,i對應第i張訓練樣本圖像,每個訓練樣本都有對應的理想高斯輸出
通過最小化濾波器與訓練樣本相關輸出與理想高斯輸出的差,得到最佳的濾波器模板H?H^{*}H?
推導過程
?\bigodot?表示點乘,在此處省略,另外H?、FH^{*}、FH?、F尺寸一樣,H?F=FH?H^{*}F=FH^{*}H?F=FH?
minH?=∑i=1m∣H?F?Gi∣2min_{H^{*}}=\sum_{i=1}^{m}{|H^{*}F-G_{i}|^{2}}minH??=i=1∑m?∣H?F?Gi?∣2
將公式寫為每個像素點格式
minHwv?=∑i=1m∣Hwv?Fwvi?Gwvi∣2min_{{H_{wv}}^{*}}=\sum_{i=1}^{m}{|H_{wv}^{*}F_{wvi}-G_{wvi}|^{2}}minHwv???=i=1∑m?∣Hwv??Fwvi??Gwvi?∣2
欲使求出最佳的H?H^{*}H?使上式子取得最小值,可以將整個式子對H?H^{*}H?進行求導,使偏導等于零的H?H^{*}H?即最佳模板。
0=δδHwv?∑i∣Hwv?Fwvi?Gwvi∣20=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{|H_{wv}^{*}F_{wvi}-G_{wvi}|^{2}}0=δHwv??δ?i∑?∣Hwv??Fwvi??Gwvi?∣2
0=δδHwv?∑i(Hwv?Fwvi?Gwvi)(Hwv?Fwvi?Gwvi)?0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{(H_{wv}^{*}F_{wvi}-G_{wvi})(H_{wv}^{*}F_{wvi}-G_{wvi})^{*}}0=δHwv??δ?i∑?(Hwv??Fwvi??Gwvi?)(Hwv??Fwvi??Gwvi?)?
0=δδHwv?∑i(Hwv?Fwvi)(Hwv?Fwvi)??(Hwv?Fwvi)Gwvi??Gwvi(Hwv?Fwvi)?+GwviGwvi?0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{(H_{wv}^{*}F_{wvi})(H_{wv}^{*}F_{wvi})^{*}-(H_{wv}^{*}F_{wvi})G_{wvi}^{*}-G_{wvi}(H_{wv}^{*}F_{wvi})^{*}+G_{wvi}G_{wvi}^{*}}0=δHwv??δ?i∑?(Hwv??Fwvi?)(Hwv??Fwvi?)??(Hwv??Fwvi?)Gwvi???Gwvi?(Hwv??Fwvi?)?+Gwvi?Gwvi??
0=δδHwv?∑iHwv?FwviHwvFwvi??Hwv?FwviGwvi??GwviHwvFwvi?+GwviGwvi?0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{H_{wv}^{*}F_{wvi}H_{wv}F_{wvi}^{*}-H_{wv}^{*}F_{wvi}G_{wvi}^{*}-G_{wvi}H_{wv}F_{wvi}^{*}+G_{wvi}G_{wvi}^{*}}0=δHwv??δ?i∑?Hwv??Fwvi?Hwv?Fwvi???Hwv??Fwvi?Gwvi???Gwvi?Hwv?Fwvi??+Gwvi?Gwvi??
由于第3、4項不包含Hwv?H_{wv}^{*}Hwv??,對其求導為0,故求導后:
0=∑i[FwviHwvFwvi??FwviGwvi?]0=\sum_{i}^{}{[F_{wvi}H_{wv}F_{wvi}^{*}-F_{wvi}G_{wvi}^{*}]}0=i∑?[Fwvi?Hwv?Fwvi???Fwvi?Gwvi??]
Hwv=∑i=1FwviGwvi?∑iFwviFwvi?H_{wv}=\frac{\sum_{i=1}^{}F_{wvi}G_{wvi}^{*}}{\sum_{i}^{}{F_{wvi}F_{wvi}^{*}}}Hwv?=∑i?Fwvi?Fwvi??∑i=1?Fwvi?Gwvi???
簡寫為:
Hwv=∑iFiGi?∑iFiFi?H_{wv}=\frac{\sum_{i}^{}F_{i}G_{i}^{*}}{\sum_{i}^{}{F_{i}F_{i}^{*}}}Hwv?=∑i?Fi?Fi??∑i?Fi?Gi???
2.2.3跟蹤過程中濾波器模板的更新
由于目標運動過程中存在遮擋,如果每幀都以上一幀目標所在位置進行更新有可能會將模板玷污,作者引入了學習率,使之前幀對模板的影響隨著時間逐漸衰減,能在一定程度上抑制遮擋帶來的問題。
更新公式如下:
跟蹤完成!
參考博客
CVPR2010跟蹤算法MOSSE原理及代碼解析
相關濾波跟蹤(MOSSE)
mosse跟蹤算法c++實現
相關濾波跟蹤·MOSSE算法的梳理
總結
以上是生活随笔為你收集整理的目标跟踪之MOSSE算法(C++版本配置及原理简介)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堡垒机CrazyEye安装脚本
- 下一篇: 790. Domino and Trom