相关滤波之开篇Mosse原理及代码详解
相關(guān)濾波之開(kāi)篇Mosse原理及代碼詳解
- 相關(guān)濾波(Correlation Filter )介紹
- 代碼解讀
- 程序框圖
本文主要介紹相關(guān)濾波算法開(kāi)篇——mosse具體原理及其python代碼實(shí)現(xiàn)流程
相關(guān)濾波(Correlation Filter )介紹
相關(guān)濾波(CF)源于信號(hào)處理領(lǐng)域,有這么一句話(huà)“兩個(gè)信號(hào)越相似,其相關(guān)值越高。在跟蹤,就是找到與跟蹤目標(biāo)響應(yīng)最大的項(xiàng)” 貫穿了整個(gè)相關(guān)濾波算法的根本。
2010年CVPR,David S.Bolme在文章《visual object tracking using adaptive correlation filters》中首次將相關(guān)濾波用在了跟蹤領(lǐng)域,在其文章的基礎(chǔ)之上,很多改進(jìn)的算法相繼出現(xiàn),跟蹤的效果也越來(lái)越好。
兩個(gè)信號(hào)之間的相關(guān)為,
(f?g)(τ)=∫∞?∞f?(t)g(t+τ)dt(f\otimes g)(\tau)=\int_\infty^{-\infty}f^*(t)g(t+\tau)dt (f?g)(τ)=∫∞?∞?f?(t)g(t+τ)dt(f?g)(n)=∑?∞∞f?[m]g(m+n)(f\otimes g)(n)=\sum_{-\infty}^\infty f^*[m]g(m+n) (f?g)(n)=?∞∑∞?f?[m]g(m+n) 其中f?表示f的復(fù)共軛。correlation的直觀解釋就是衡量?jī)蓚€(gè)函數(shù)在某個(gè)時(shí)刻相似程度。
在圖像中相關(guān)濾波意思就是輸入圖像(框選的目標(biāo))跟濾波器之間做一個(gè)相關(guān)操作,相關(guān)操作類(lèi)似卷積操作(卷積需要反轉(zhuǎn),相關(guān)不用),相關(guān)操作如下圖所示。
這里要注意輸入圖像f,濾波器h,及相應(yīng)輸出g的大小是完全一樣的。
相關(guān)濾波意思就是現(xiàn)在在第一幀圖像中框選了一個(gè)目標(biāo),然后對(duì)這個(gè)目標(biāo)訓(xùn)練一個(gè)濾波器(大小相同)使得其輸出響應(yīng)g(大小相同)在中間值最大。其中輸入圖像給定,響應(yīng)圖也是可以直接生成的。一般都是用高斯函數(shù),中間值最大,旁邊逐漸降低。
然后濾波器的值推導(dǎo)過(guò)程類(lèi)似于機(jī)器學(xué)習(xí)的線(xiàn)性回歸
minH?=∑i=1m∣H?Fi?Gi∣2min_{H^*}=\sum _{i=1}^m|H^*F_i-G_i|^2 minH??=i=1∑m?∣H?Fi??Gi?∣2
就是要找一個(gè)濾波器H*使得其上式的結(jié)果最小,其實(shí)也就是找到一個(gè)濾波器,使得其響應(yīng)在中間的值最大,這就是利用了相關(guān)濾波器的原理。
然后根據(jù)數(shù)學(xué)求導(dǎo),各種計(jì)算規(guī)則(有興趣的可以看下原來(lái)論文,步驟很詳細(xì),這里就不展示了),最終可以得到
Hwv=∑iFiwvGiwv?∑iFiwvFiwv?H_{wv}={\sum _i F_{iwv}G^*_{iwv}\over \sum _i F_{iwv}F^*_{iwv} }Hwv?=∑i?Fiwv?Fiwv??∑i?Fiwv?Giwv???上面得到是H中每個(gè)元素的值,最后得到H為:
H=∑iFi?Gi?∑iFi?Fi?H={\sum _iF_i\cdot G^*_i \over \sum _iF_i\cdot F^*_i }H=∑i?Fi??Fi??∑i?Fi??Gi???上式就是濾波器的模型公式。
其中的G為高斯函數(shù)矩陣的傅里葉變換,F為輸入目標(biāo)圖矩陣的傅里葉變換,都是用的快速傅里葉變換(FFT),這塊不懂的可以查看快速傅里葉變換
然后為了具有更好的魯棒性,濾波器采用迭代的方法Ht=AtBtH_t={A_t\over B_t}Ht?=Bt?At??At=ηFt?Gt?+(1?η)At?1A_t=\eta F_t \cdot G^*_t +(1-\eta)A_{t-1}At?=ηFt??Gt??+(1?η)At?1?Bt=ηFt?Ft?+(1?η)Bt?1B_t=\eta F_t \cdot F^*_t +(1-\eta)B_{t-1}Bt?=ηFt??Ft??+(1?η)Bt?1?更新參數(shù)為η,每一幀的濾波器都與上一幀的取值有關(guān)。
至此,第一幀圖像目標(biāo)框選之后就得到了一個(gè)設(shè)計(jì)好的濾波器,然后對(duì)第二幀圖像提取目標(biāo)區(qū)域?qū)ζ渑c剛才的濾波器先進(jìn)行傅里葉變換進(jìn)行卷積之后逆向傅里葉變換找最大響應(yīng)值,這個(gè)響應(yīng)值的位置就是第二幀圖像的待追蹤目標(biāo)的中心。
每一步目標(biāo)圖像在傅里葉變換前還要進(jìn)行一些預(yù)處理
(1)FFT卷積算法需要將圖像和濾波器映射到拓?fù)浣Y(jié)構(gòu)上,邊界采用循環(huán)圖像的方式填充,即將圖像的左邊緣連接到右側(cè)邊緣,將頂部連接到底部。
(2)采用點(diǎn)乘余弦窗處理,使圖像邊緣慢慢變成零。
在代碼中都有所體現(xiàn)
接下來(lái)講代碼,附上GitHub鏈接
是python代碼(因?yàn)閷?duì)python比較熟悉)
項(xiàng)目根目錄下主要有
datasets文件夾(用于存放跟蹤圖片集)
examples文件夾(用于存放gif動(dòng)圖,可不用)
demo.py (主程序,用于初始化參數(shù),及運(yùn)行各個(gè)函數(shù))
mosse.py(跟蹤算法的實(shí)現(xiàn))
utils.py(一些圖像處理操作)
代碼解讀
接下來(lái)分別介紹下各個(gè)具體模塊的代碼首先是主程序demo.py
from mosse import mosse import argparseparse = argparse.ArgumentParser() parse.add_argument('--lr', type=float, default=0.125, help='the learning rate') parse.add_argument('--sigma', type=float, default=100, help='the sigma') parse.add_argument('--num_pretrain', type=int, default=128, help='the number of pretrain') parse.add_argument('--rotate', action='store_true', help='if rotate image during pre-training.') parse.add_argument('--record', action='store_true', help='record the frames')if __name__ == '__main__':args = parse.parse_args()img_path = 'datasets/surfer/'tracker = mosse(args, img_path)tracker.start_tracking()其中下半部分為主程序,進(jìn)行參數(shù)的賦值,圖像路徑的賦值,跟蹤器的設(shè)計(jì),開(kāi)始跟蹤
上半部分為參數(shù)的賦值,為python自帶模塊argparse 的使用。
其次是
mosse.py
這里定義了一個(gè)mosse類(lèi) 用于mosse算法的實(shí)現(xiàn)
主要就是一個(gè)方法
整個(gè)流程基本與mosse算法原理一致,對(duì)照著原理,把這個(gè)推導(dǎo)一遍,會(huì)更加好理解這個(gè)算法基本原理
utils.py里面主要就是對(duì)圖像進(jìn)行一些預(yù)處理比如圖像線(xiàn)性映射,進(jìn)行點(diǎn)乘余弦窗處理,使圖像邊緣慢慢變成零,圖像反轉(zhuǎn)操作等。
程序框圖
以上就是整個(gè)mosse算法的原理及代碼流程,最后附上一張流程框圖,結(jié)合去看,會(huì)理解的更加深入。
先寫(xiě)到這里,第一次寫(xiě)博客,很多不是很完善,之后慢慢改。。
總結(jié)
以上是生活随笔為你收集整理的相关滤波之开篇Mosse原理及代码详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vagrant,流浪汉,我又来啦。
- 下一篇: Junit4常用注解