目标跟踪 MOSSE(Visual Object Tracking using Adaptive Correlation Filters)
文章標題:《Visual Object Tracking using Adaptive Correlation Filters》
文章地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.294.4992&rep=rep1&type=pdf
文章代碼:(python)https://github.com/opencv/opencv/blob/master/samples/python/mosse.py
?????(C++)https://github.com/opencv/opencv_contrib/blob/master/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp
2010年CVPR的一篇的文章
Abstract
相關(guān)濾波器(correlation filters)雖然用得不多,但是在物體被旋轉(zhuǎn)、遮擋或者有其它干擾的復雜情況下實施跟蹤,速度要比當前的先進技術(shù)快 202020 倍。最古老、最簡單的相關(guān)濾波器使用了簡單的模板,實際跟蹤時不太好用。ASEF 和 UMACE 等現(xiàn)代一點的方法性能好一點,但是它們的訓練需求不太適應用于跟蹤。視覺跟蹤任務要求從單幀圖像訓練出魯棒的濾波器,并且在跟蹤過程中,根據(jù)目標外觀的變化進行動態(tài)調(diào)整。
本文提出了一種新型相關(guān)濾波器:MOSSE(Minimum Output Sum of Squared Error),我們在初始化的時候,從一幀圖像中產(chǎn)生穩(wěn)定的相關(guān)濾波器。基于MOSSE濾波器的跟蹤器以每秒 669669669 幀的速度運行,對光照、比例、姿態(tài)和非剛性變形的變化具有魯棒性。跟蹤的時候根據(jù)峰值與旁瓣比(peak-to-sidelobe ratio,PSR)判斷是否發(fā)生遮擋,以此決定是否暫停跟蹤,等物體重新出現(xiàn)時恢復跟蹤。
具體做法
獲取選區(qū):
首先把輸入圖像轉(zhuǎn)為灰度圖,選取跟蹤區(qū)域。修改選區(qū)框的尺寸,使得該尺寸是做離散傅里葉變換的最佳尺寸。
然后根據(jù)選區(qū)創(chuàng)建漢寧窗(HanningWindow),它用于突出圖像中心區(qū)域,減弱圖像邊緣區(qū)域。(這個后面用到)
把它裁剪出來,得到輸入數(shù)據(jù) fff:
預處理:
常規(guī)操作。把輸入圖像 fff 的數(shù)據(jù)取對數(shù),使數(shù)據(jù)無偏,符合正態(tài)分布。對數(shù)效果示意圖:
然后減均值,除以方差,把數(shù)據(jù)標準化(Normaization)。
最后乘以漢寧窗。
建立求解目標:
設置我們對該選區(qū)的期望輸出響應 ggg。它是一個中間值很大,四周值很小的矩形圖片,尺寸和選區(qū)尺寸一樣大。
可視化如下:
(具體做法可以看代碼)
我們希望訓練得到一個相關(guān)過濾器 h\color{red}hh,使 f☆h=gf ☆ h = gf☆h=g :
其中符號 ☆☆☆ 表示做 “相關(guān)” 運算。
“相關(guān)” 運算和 “卷積” 運算很像,二維情況下,對卷積核關(guān)于 222 個軸先后旋轉(zhuǎn) 180°180^{\circ}180°,再做卷積,就是 “相關(guān)”。
所以主要是 “核” 不同。 具體去網(wǎng)上查資料或者看岡薩雷斯的《數(shù)字圖像處理》(第四版) p101。
如果訓練良好,這個相關(guān)過濾器 hhh 大概長這樣:
怎樣找到 hhh 呢?
我們知道在傅里葉域做乘法相當于在空間域做卷積,于是先通過快速傅里葉變換 (FFTFFTFFT) 把數(shù)據(jù)從圖像空間域轉(zhuǎn)到傅里葉域,然后在傅里葉域進行操作,這樣可以減少計算量。我們用對應的大寫字母表示傅里葉域的數(shù)據(jù):
?????輸入圖像: F=F(f)F = \mathcal{F}(f)F=F(f) , 相關(guān)過濾器:H=F(h)H= \mathcal{F}(h)H=F(h) ,輸出響應:G=F(g)G= \mathcal{F}(g)G=F(g)。
于是相關(guān)運算在傅里葉域表示為: F⊙H?=G(1)F \; \odot \; H^* = G \tag{1} F⊙H?=G(1)
其中符號 ⊙\odot⊙ 表示逐個元素的相乘,符號 ?*? 表示復共軛,也就是虛部取相反的符號。
這個運算的速度主要取決于傅里葉變換和傅里葉逆變換,時間復雜度上限是 O(PlogP)O(PlogP)O(PlogP),PPP 是選區(qū)的像素數(shù)量。
求解:
在初始化的時候,我們有 iii 組數(shù)據(jù),對于輸入圖像數(shù)據(jù) FiF_iFi?,我們期望輸出的響應為 GiG_iGi?。
通過求解以下最小化問題,“訓練” 出我們期望的相關(guān)核 HHH:min?H?∑i∣Fi⊙H??Gi∣2(3)\min_{H^*} \sum^{}_{i} | F_i \odot H^* - G_i |^2 \tag{3}H?min?i∑?∣Fi?⊙H??Gi?∣2(3)
這叫做最小化平方誤差和(Sum of Squared Error,SSE),文章的標題和跟蹤器的名字由此而來。
作者在文章的附錄中給出了求解公式。作者表示這是一個凸的,使偏導為 000 得到求解公式:H?=∑iGi⊙Fi?∑iFi⊙Fi?(4)H^* = \frac{\sum_i G_i \odot F_i^*} {\sum_i F_i \odot F_i^*} \tag{4} H?=∑i?Fi?⊙Fi??∑i?Gi?⊙Fi???(4)
這 iii 組數(shù)據(jù)怎么來? 代碼中 i=128i=128i=128,在初始化的時候,對輸入圖像 fff 做 128128128 次隨機仿射變換(旋轉(zhuǎn)、拉伸等)得到一系列圖:
每張圖片輸出響應 GiG_iGi? 不變,依舊是用(圖1)那個 ggg 的傅里葉逆變換 GiG_iGi?。將 FiF_iFi? ,GiG_iGi? 代入式 (4) 求得 HHH。
不做仿射變換,只用一張原圖也可以,但是這樣得到的濾波器太精確,會過擬合這幅圖像,當應用到新圖像 (下一幀) 的時候容易跟蹤失敗。
這種對數(shù)據(jù)增強然后求平均的方法,可以產(chǎn)生一個更具泛化能力的濾波器。
(對弱分類器的輸出進行平均,從而產(chǎn)生一個強得多的分類器)。
另外,我們還對圖片加入了白噪聲 ?\epsilon? ,具有正則化的效果??梢缘玫骄哂懈玫脑肼暼萑棠芰Φ臑V波器。
在兩個地方加,一個是圖片預處理的時候加,一個是在式 (4) 中加:Fi⊙Fi?+?F_i \odot F_i^* +\epsilonFi?⊙Fi??+? 。
初始化完畢后,就得到了濾波器模板 HHH。
在線更新:(選區(qū)框)
在跟蹤問題中,目標不總是居中的。
例如當下一幀數(shù)據(jù)來到的時候,我們的選區(qū)(目標框)還處于原來的位置,但是里面的目標已經(jīng)移動了。
在 fff 中峰值會隨著目標的移動而移動。用目前的濾波器 HHH 做相關(guān)時,得到的響應也會發(fā)生變化:
通過計算響應峰值點的相對位移,來更新跟蹤框的坐標,使目標仍處于跟蹤框中心。
值得注意的是,目標框的大小沒有得到更新,這也是 MOSSE 算法的不足之一。
在線更新:(濾波器)
在跟蹤的過程中,目標通常會發(fā)生旋轉(zhuǎn)、縮放、姿態(tài)、光照的變化,甚至外觀發(fā)生非剛性形變,所以濾波器需要隨之適應和更新。
記 H1=∑iGi⊙Fi?H_1 = \sum_i G_i \odot F_i^*H1?=∑i?Gi?⊙Fi?? , H2=∑iFi⊙Fi?H_2 = \sum_i F_i \odot F_i^*H2?=∑i?Fi?⊙Fi??
則式 (4) 簡寫為:H?=H1H2H^* = \frac{H_1}{H_2} H?=H2?H1??
下一幀數(shù)據(jù) FnF_{n}Fn? 來到的時候,通過以下式子更新 HHH:H1new=(1?η)H1+ηG⊙Fn?H2new=(1?η)H2+ηFn⊙Fn?H_1^{new} = \textcolor{red}{(1-\eta)}\;H_1 + \textcolor{red}{ \eta }\; G \odot F_{n}^* \\[1em] H_2^{new} = \textcolor{red}{(1-\eta)}\;H_2 + \textcolor{red}{ \eta }\; F_{n} \odot F_{n}^* H1new?=(1?η)H1?+ηG⊙Fn??H2new?=(1?η)H2?+ηFn?⊙Fn??
即:
H?=(1?η)H1+ηG⊙Fn?(1?η)H2+ηFn⊙Fn?H^* = \frac{ \textcolor{red}{(1-\eta)}\;H_1 + \textcolor{red}{ \eta }\; G \odot F_{n}^*} {\textcolor{red}{(1-\eta)}\;H_2 + \textcolor{red}{ \eta }\; F_{n} \odot F_{n}^*} H?=(1?η)H2?+ηFn?⊙Fn??(1?η)H1?+ηG⊙Fn???
η\etaη 稱為學習率,實際中取 η=0.125\eta = 0.125η=0.125 效果較好。
得到新的過濾器和新的選區(qū),就可以進行下一幀的跟蹤了。不斷迭代這個過程。
失敗判定與PSR:
我們用 PSR(Peak to Sidelobe Ratio)度量響應尖峰的強度。
對于相關(guān)輸出 ggg,我們找出峰值點 gmaxg_{\text{max}}gmax?,以峰值點為中心建立 11×1111\times 1111×11 的矩形框。
計算這個矩形區(qū)域的均值 μs1\mu_{\text{s1}}μs1? 和標準差 σs1\sigma_{\text{s1}}σs1?,則 PSR=gmax?μs1σs1\text{PSR} = \frac{g_{\text{max}} - \mu_{\text{s1}}}{\sigma_{\text{s1}}} PSR=σs1?gmax??μs1??
實驗發(fā)現(xiàn),對于正常跟蹤的情況下,PSR 值大致處于 20.020.020.0 到 60.060.060.0 之間。
當 PSR 降到大概 7.07.07.0 左右時,表示目標被遮擋或者跟蹤失敗了。
在應用實現(xiàn)中,PSR 處于 3.03.03.0 到 10.010.010.0 時對于更新目標框是沒什么用的。
python代碼
鏈接:https://pan.baidu.com/s/1eAE9fJJBkh50oMaRfCI8AA
提取碼:1234
總結(jié)
以上是生活随笔為你收集整理的目标跟踪 MOSSE(Visual Object Tracking using Adaptive Correlation Filters)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 752. Open the Lock
- 下一篇: [Leetcode][第404题][JA