相关滤波跟踪·MOSSE算法的梳理
相關濾波跟蹤是當前目標檢測與跟蹤領域的一個研究熱點,ICCV2010的這篇MOSSE算法可以說是入門必看,鎮圈神作了。
一、目的:跟蹤
一開始分不清跟蹤和目標檢測有什么不同,所以查了一些資料,以下只是我自己的理解:
區別于目標檢測,跟蹤最大的特點是處理的圖像序列具有時效性(temporal data)。
跟蹤的過程一般是在首幀進行目標識別(indentify)定位(locate),在后序的幀進行目標匹配(找到最相似的目標),再定位;目標檢測方法是這個過程中的一種選擇。此外,跟蹤還有處理一些旋轉、尺度變化等問題的功能,并具有一定的預判能力(比如:掃地機器人溜進桌子下面不見了,跟蹤也能定位出一個大致的位置)。
不負責任地來說,檢測是跟蹤的基礎,跟蹤是高于檢測的。
二、原理:相關濾波
接觸相關濾波的時候我最容易搞混的地方就是各種空域 頻域的轉換,所以整理的時候我會特別把在空域還是頻域特別標注出來。
2.1 濾波
濾波是一個圖像處理,尤其圖像增強時常用的方法(比如低通濾波器:把低頻部分的信息保留,高頻部分的信息濾掉)。很明顯,濾波 是一個頻域里的概念,但考慮到MOSSE的相關性從空域的角度比較好理解,因此需要暫時把頻域濾波轉換到空域濾波。
通過卷積模板,可以實現從頻域到空域的轉換,所以在空域中,濾波基本上通過一個矩陣模板(窗)來實現。簡單講,就是把濾波看做領域操作算子,利用 給定圖像像素 周圍像素的值 決定 此像素 最終的輸出值。也就是說,輸入圖像與輸出結果在像素上是一一對應的關系,濾波器只是一個操作算子。
2.2 相關
相關一開始是信號處理領域的一個概念,用來描述兩個信號的相似程度。
空域里的相關公式:
g=f?hg=f\bigotimes hg=f?h
g(i,j)=∑f(i+k,j+l)?h(k,l)g(i,j)=\sum f(i+k,j+l)\cdot h(k,l)g(i,j)=∑f(i+k,j+l)?h(k,l)
(其中fff是輸入信號,hhh是相關核/濾波器,ggg是空域里的響應圖。)
步驟:
(1)滑動核,使其中心位于輸入圖像的$f(i,j)$像素上(2)利用上式求和,得到輸出圖像的$g(i,j)$像素值(3)充分上面操縱,直到求出輸出圖像的所有像素值這里參考了(https://blog.csdn.net/qq_17783559/article/details/82254996)的解釋。
很明顯,輸入信號與響應之間在像素值上是一一對應的,輸入信號的信息與核越相似,響應值就越高。
因此,只要在下一幀里利用hhh找到響應值最高的位置就可以定位實現跟蹤了,但問題在于:這樣的方法計算太慢了。
考慮將空域的相關轉化到頻域提高運算速度。
三、算法:Minimum Output Sum of Squared Error (MOSSE) 濾波器
3.1 引入卷積算子
為了使空域的相關濾波轉換到頻域濾波以提高運算速度,引入卷積算子(注意:這里的卷積算子并沒有什么實際的物理意義,可以看做一個把空域相關濾波轉到頻域的橋梁)。
卷積公式:
g=f?hg=f\ast hg=f?h
g(i,j)=∑f(i?k,j?l)?h(k,l)g(i,j)=\sum f(i-k,j-l)\cdot h(k,l)g(i,j)=∑f(i?k,j?l)?h(k,l)
很明顯,相關運算是把hhh旋轉了180°的卷積運算,所以g=f?h=f?h?g=f\bigotimes h=f\ast h^*g=f?h=f?h?
通過卷積定理:函數卷積的傅立葉變換是函數傅立葉變換的乘積,上式可以變換為FFT(g)=FFT(f)?FFT(h?)FFT(g)=FFT(f)\cdot FFT(h^*)FFT(g)=FFT(f)?FFT(h?)
表示為G=F?H?G=F\cdot H^*G=F?H?
但實際中很難通過H?=GFH^*=\frac{G} {F}H?=FG?得到濾波器HHH
3.2 引入最小二乘法
最小二乘法是曲線擬合時的一種方法,通過最小化誤差的平方來尋找數據的最佳函數配比。
在MOSSE中通過最小化實際輸出的卷積和期望輸出卷積之間的方差來得到合適的濾波器(minimizes the sum of squared error between the actual output of the convolution and the desired output of the convolution),即求解
min?H?∑i∣Fi?H??Gi∣2\min_{H^*}\sum_{i}\left | F_{i}\cdot H^*-G_{i} \right |^{2}H?min?i∑?∣Fi??H??Gi?∣2
(其中iii 表示第iii個訓練樣本)
為了優化運算(element-wise),將上式轉化為
min?H?∑i∣Fiων?Hων??Giων∣2\min_{H^*}\sum_{i}\left | F_{i\omega\nu}\cdot H_{\omega\nu}^*-G_{i\omega\nu} \right |^{2}minH??∑i?∣Fiων??Hων???Giων?∣2
(其中下標 表示第iii 個樣本的ω\omegaω行ν\nuν列)
min?H?∑i∣Fiων?Hων??Giων∣2\min_{H^*}\sum_{i}\left | F_{i\omega\nu}\cdot H_{\omega\nu}^*-G_{i\omega\nu} \right |^{2}minH??∑i?∣Fiων??Hων???Giων?∣2
=min?H?∑i[(Fiων?Hων??Giων)?(Fiων?Hων??Giων)?]=\min_{H^*}\sum_{i}\left [ \left(F_{i\omega\nu}\cdot H_{\omega\nu}^*-G_{i\omega\nu} \right )\cdot \left(F_{i\omega\nu}\cdot H_{\omega\nu}^*-G_{i\omega\nu} \right )^*\right ]=minH??∑i?[(Fiων??Hων???Giων?)?(Fiων??Hων???Giων?)?]
=min?H?∑i[(FiωνHων?)(FiωνHων?)??GiωνFiων?Hων?FiωνHων?Giων?+GiωνGiων?]=\min_{H^*}\sum_{i}\left [ \left(F_{i\omega\nu} H_{\omega\nu}^*\right ) \left(F_{i\omega\nu}H_{\omega\nu}^*\right )^*-G_{i\omega\nu} F_{i\omega\nu}^*H_{\omega\nu}-F_{i\omega\nu}H_{\omega\nu}^*G_{i\omega\nu}^*+G_{i\omega\nu} G_{i\omega\nu} ^*\right ]=minH??∑i?[(Fiων?Hων??)(Fiων?Hων??)??Giων?Fiων??Hων??Fiων?Hων??Giων??+Giων?Giων??]
=min?H?∑i[FiωνFiων?(Hων?)2?GiωνFiων?Hων?FiωνHων?Giων?+GiωνGiων?]=\min_{H^*}\sum_{i}\left [ F_{i\omega\nu}F_{i\omega\nu}^*\left( H_{\omega\nu}^*\right )^{2} -G_{i\omega\nu} F_{i\omega\nu}^*H_{\omega\nu}-F_{i\omega\nu}H_{\omega\nu}^*G_{i\omega\nu}^*+G_{i\omega\nu} G_{i\omega\nu} ^*\right ]=minH??∑i?[Fiων?Fiων??(Hων??)2?Giων?Fiων??Hων??Fiων?Hων??Giων??+Giων?Giων??]
求和號內是一個關于H?H^*H?的開口向上的一元二次函數,其一階導數等于0的解即H?H^*H?的最小值。
??H?min?H?∑i[FiωνFiων?(Hων?)2?GiωνFiων?Hων?FiωνHων?Giων?+GiωνGiων?]=0\frac{\partial }{\partial H^*}\min_{H^*}\sum_{i}\left [ F_{i\omega\nu}F_{i\omega\nu}^*\left( H_{\omega\nu}^*\right )^{2} -G_{i\omega\nu} F_{i\omega\nu}^*H_{\omega\nu}-F_{i\omega\nu}H_{\omega\nu}^*G_{i\omega\nu}^*+G_{i\omega\nu} G_{i\omega\nu} ^*\right ]=0?H???H?min?i∑?[Fiων?Fiων??(Hων??)2?Giων?Fiων??Hων??Fiων?Hων??Giων??+Giων?Giων??]=0
∑i[FiωνFiων?Hων?FiωνGiων?]=0\sum_{i}\left [ F_{i\omega\nu}F_{i\omega\nu}^*H_{\omega\nu} -F_{i\omega\nu}G_{i\omega\nu}^*\right ]=0i∑?[Fiων?Fiων??Hων??Fiων?Giων??]=0
FiωνFiων?Hων?FiωνGiων?=0F_{i\omega\nu}F_{i\omega\nu}^*H_{\omega\nu} -F_{i\omega\nu}G_{i\omega\nu}^*=0Fiων?Fiων??Hων??Fiων?Giων??=0
得到封閉解
Hων=∑FiωνGiων?∑FiωνFiων?H_{\omega\nu}=\frac {\sum F_{i\omega\nu}G_{i\omega\nu}^*}{ \sum F_{i\omega\nu}F_{i\omega\nu}^*}Hων?=∑Fiων?Fiων??∑Fiων?Giων???
H=∑Fi⊙Gi?∑Fi⊙Fi?H=\frac {\sum F_{i}\odot G_{i}^*}{ \sum F_{i}\odot F_{i}^*}H=∑Fi?⊙Fi??∑Fi?⊙Gi???
3.3 引入學習效率η\etaη
考慮到防止濾波器過擬合,使濾波器能夠較快的適應旋轉、遮擋、尺度變化等問題,引入一個學習效率(learning rate)的參量η\etaη表示不同時序的幀的權重,所以濾波器公式表示為:
Hi=AiBiH_{i}=\frac{A_{i}}{B_{i}}Hi?=Bi?Ai??
Ai=ηGi⊙Fi?+(1?η)Ai?1A_{i}=\eta G_{i}\odot F_{i}^*+(1-\eta )A_{i-1}Ai?=ηGi?⊙Fi??+(1?η)Ai?1?
Bi=ηFi⊙Fi?+(1?η)Bi?1B_{i}=\eta F_{i}\odot F_{i}^*+(1-\eta )B_{i-1}Bi?=ηFi?⊙Fi??+(1?η)Bi?1?
學習效率參量使得時序離當前幀越近的幀所占權重越大,之前的幀的學習結果隨時間呈指數遞減。
四、流程:濾波器的初始化和在線更新
4.1 預處理
通常都會對特征提取的圖像信息進行一些預處理:
(1)用log函數對像素值進行處理,降低對比度(contrasting lighting situation)。
(2)進行平均值為0,范數為1的歸一化。
(3)用余弦窗口進行濾波,降低邊緣的像素值。
4.2 流程圖
上半部分是濾波器初始化的過程,第一幀的特征提取f1f_{1}f1?和高斯分布的理想置信圖(相應)gi+1g_{i+1}gi+1?已知,自然地,可以得到初始化的濾波器模板h0h_{0}h0?,為了避免過擬合,對濾波器的初始化模板進行了一些處理。
下半部分是濾波器更新的過程,mosse算法的優越之處就在于濾波器模板能夠利用定制的置信圖gig_{i}gi?進行訓練并在線更新,減少了目標丟失的可能性。
一次訓練包含兩次采樣,第一次采樣是在當前幀(i+1i+1i+1)中定位上一幀(iii)目標位置進行采樣,通過濾波器得到響應,為了便于理解,我暫時把這個響應稱為過渡響應,它的傅里葉變換即回歸模型中的GiG_{i}Gi?。
利用過渡響應得到當前幀中響應最大的像素定位,對當前幀進行第二次采樣,此時,目標位于采樣框中心。采樣結果的傅里葉變換即模型中的FiF_{i}Fi?。
由此,模型中的輸入值全部確定,min?H?∑i∣Fi?H??Gi∣2\min_{H^*}\sum_{i}\left | F_{i}\cdot H^*-G_{i} \right |^{2}minH??∑i?∣Fi??H??Gi?∣2
利用以上模型進行訓練,得到新的濾波器hi+1h_{i+1}hi+1?,對濾波器模板進行更新,進入下一幀。
以上,就是MOSSE算法的大致過程,歡迎討論。(●’?’●)
[分割線181105]
%修改了幾個理解錯誤
總結
以上是生活随笔為你收集整理的相关滤波跟踪·MOSSE算法的梳理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除文件夹里的图片,打印删除日志
- 下一篇: vi编辑器选项