日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

相关滤波之开篇Mosse原理及代码详解

發布時間:2023/12/10 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相关滤波之开篇Mosse原理及代码详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相關濾波之開篇Mosse原理及代碼詳解

  • 相關濾波(Correlation Filter )介紹
  • 代碼解讀
  • 程序框圖

本文主要介紹相關濾波算法開篇——mosse具體原理及其python代碼實現流程

相關濾波(Correlation Filter )介紹

相關濾波(CF)源于信號處理領域,有這么一句話“兩個信號越相似,其相關值越高。在跟蹤,就是找到與跟蹤目標響應最大的項” 貫穿了整個相關濾波算法的根本。

2010年CVPR,David S.Bolme在文章《visual object tracking using adaptive correlation filters》中首次將相關濾波用在了跟蹤領域,在其文章的基礎之上,很多改進的算法相繼出現,跟蹤的效果也越來越好。

兩個信號之間的相關為,
(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的復共軛。correlation的直觀解釋就是衡量兩個函數在某個時刻相似程度。
在圖像中相關濾波意思就是輸入圖像(框選的目標)跟濾波器之間做一個相關操作,相關操作類似卷積操作(卷積需要反轉,相關不用),相關操作如下圖所示。

這里要注意輸入圖像f,濾波器h,及相應輸出g的大小是完全一樣的。


相關濾波意思就是現在在第一幀圖像中框選了一個目標,然后對這個目標訓練一個濾波器(大小相同)使得其輸出響應g(大小相同)在中間值最大。其中輸入圖像給定,響應圖也是可以直接生成的。一般都是用高斯函數,中間值最大,旁邊逐漸降低。

然后濾波器的值推導過程類似于機器學習的線性回歸
minH?=∑i=1m∣H?Fi?Gi∣2min_{H^*}=\sum _{i=1}^m|H^*F_i-G_i|^2 minH??=i=1m?H?Fi??Gi?2
就是要找一個濾波器H*使得其上式的結果最小,其實也就是找到一個濾波器,使得其響應在中間的值最大,這就是利用了相關濾波器的原理。
然后根據數學求導,各種計算規則(有興趣的可以看下原來論文,步驟很詳細,這里就不展示了),最終可以得到
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中每個元素的值,最后得到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為高斯函數矩陣的傅里葉變換,F為輸入目標圖矩陣的傅里葉變換,都是用的快速傅里葉變換(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?更新參數為η,每一幀的濾波器都與上一幀的取值有關。
至此,第一幀圖像目標框選之后就得到了一個設計好的濾波器,然后對第二幀圖像提取目標區域對其與剛才的濾波器先進行傅里葉變換進行卷積之后逆向傅里葉變換找最大響應值,這個響應值的位置就是第二幀圖像的待追蹤目標的中心。

每一步目標圖像在傅里葉變換前還要進行一些預處理
(1)FFT卷積算法需要將圖像和濾波器映射到拓撲結構上,邊界采用循環圖像的方式填充,即將圖像的左邊緣連接到右側邊緣,將頂部連接到底部。
(2)采用點乘余弦窗處理,使圖像邊緣慢慢變成零。
在代碼中都有所體現

接下來講代碼,附上GitHub鏈接
是python代碼(因為對python比較熟悉)
項目根目錄下主要有
datasets文件夾(用于存放跟蹤圖片集)
examples文件夾(用于存放gif動圖,可不用)
demo.py (主程序,用于初始化參數,及運行各個函數)
mosse.py(跟蹤算法的實現)
utils.py(一些圖像處理操作)

代碼解讀

接下來分別介紹下各個具體模塊的代碼首先是主程序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()

其中下半部分為主程序,進行參數的賦值,圖像路徑的賦值,跟蹤器的設計,開始跟蹤
上半部分為參數的賦值,為python自帶模塊argparse 的使用。

其次是
mosse.py
這里定義了一個mosse類 用于mosse算法的實現
主要就是一個方法

def start_tracking(self):# 得到圖像的第一幀init_img = cv2.imread(self.frame_lists[0])init_frame = cv2.cvtColor(init_img, cv2.COLOR_BGR2GRAY)init_frame = init_frame.astype(np.float32)# 在第一幀中框選中需要的目標區域init_gt = cv2.selectROI('demo', init_img, False, False)init_gt = np.array(init_gt).astype(np.int64)# 得到當前的高斯響應response_map = self._get_gauss_response(init_frame, init_gt)# 得到目標圖像大小的高斯響應圖g = response_map[init_gt[1]:init_gt[1]+init_gt[3], init_gt[0]:init_gt[0]+init_gt[2]]#原始圖像fi = init_frame[init_gt[1]:init_gt[1]+init_gt[3], init_gt[0]:init_gt[0]+init_gt[2]]#進行傅里葉變換G = np.fft.fft2(g)# 預處理Ai, Bi = self._pre_training(fi, G)# 開始跟蹤for idx in range(len(self.frame_lists)):current_frame = cv2.imread(self.frame_lists[idx])frame_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)frame_gray = frame_gray.astype(np.float32)if idx == 0:Ai = self.args.lr * AiBi = self.args.lr * Bipos = init_gt.copy()clip_pos = np.array([pos[0], pos[1], pos[0]+pos[2], pos[1]+pos[3]]).astype(np.int64)else:Hi = Ai / Bifi = frame_gray[clip_pos[1]:clip_pos[3], clip_pos[0]:clip_pos[2]]fi = pre_process(cv2.resize(fi, (init_gt[2], init_gt[3])))Gi = Hi * np.fft.fft2(fi)gi = linear_mapping(np.fft.ifft2(Gi))# 找到最大的響應點,這就是第二幀的目標位置max_value = np.max(gi)max_pos = np.where(gi == max_value)dy = int(np.mean(max_pos[0]) - gi.shape[0] / 2)dx = int(np.mean(max_pos[1]) - gi.shape[1] / 2)# 更新位置信息pos[0] = pos[0] + dxpos[1] = pos[1] + dy# trying to get the clipped position [xmin, ymin, xmax, ymax]clip_pos[0] = np.clip(pos[0], 0, current_frame.shape[1])clip_pos[1] = np.clip(pos[1], 0, current_frame.shape[0])clip_pos[2] = np.clip(pos[0]+pos[2], 0, current_frame.shape[1])clip_pos[3] = np.clip(pos[1]+pos[3], 0, current_frame.shape[0])clip_pos = clip_pos.astype(np.int64)# get the current fi..fi = frame_gray[clip_pos[1]:clip_pos[3], clip_pos[0]:clip_pos[2]]fi = pre_process(cv2.resize(fi, (init_gt[2], init_gt[3])))# online update...Ai = self.args.lr * (G * np.conjugate(np.fft.fft2(fi))) + (1 - self.args.lr) * AiBi = self.args.lr * (np.fft.fft2(fi) * np.conjugate(np.fft.fft2(fi))) + (1 - self.args.lr) * Bi#可視化跟蹤序列圖像cv2.rectangle(current_frame, (pos[0], pos[1]), (pos[0]+pos[2], pos[1]+pos[3]), (255, 0, 0), 2)cv2.imshow('demo', current_frame)cv2.waitKey(100)# if record... save the frames..if self.args.record:frame_path = 'record_frames/' + self.img_path.split('/')[1] + '/'if not os.path.exists(frame_path):os.mkdir(frame_path)cv2.imwrite(frame_path + str(idx).zfill(5) + '.png', current_frame)

整個流程基本與mosse算法原理一致,對照著原理,把這個推導一遍,會更加好理解這個算法基本原理

utils.py里面主要就是對圖像進行一些預處理比如圖像線性映射,進行點乘余弦窗處理,使圖像邊緣慢慢變成零,圖像反轉操作等。

程序框圖

以上就是整個mosse算法的原理及代碼流程,最后附上一張流程框圖,結合去看,會理解的更加深入。

先寫到這里,第一次寫博客,很多不是很完善,之后慢慢改。。

總結

以上是生活随笔為你收集整理的相关滤波之开篇Mosse原理及代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。