相关滤波目标追踪一:鼻祖Mosse算法的matlab解析
一些自己的見解,如有不同觀點,可以一起討論。
github地址:https://github.com/Ronales/Mosse_Tracking_matlab
補充:說一下mosse的更新策略:
1. "論文目標就是找到一個濾波器h,使其在輸入圖像上,跟蹤的目標上的位置響應值最大。f表示訓練圖像,g表示響應輸出,h表示濾波器,F,G,H對應其頻域值(均為傅里葉變換后的值)。"這句話誰都能懂,落到實處就是:
(1)初始狀態(第一幀),我們首先框選一副圖像的某一個人的位置,則按照人體目標框選位置裁剪出來的局部圖像就是f有了。
(2)由于mosse是一個在線更新的階段,即響應輸出g得到的坐標位置應當作為下一幀更新的輸入提供位置裁切參考。這樣一來初始狀態沒有同時具有f和g的條件。(初值狀態只有手動框選的一個目標位置),則就無法初始化濾波器h。
這里需要將裁剪出來的局部圖像f進行仿射變換,得到128張圖像fi。模擬不穩定狀態下的請情況,此時這128次仿射變化得到的響應圖g最終結果應當為手動框選的那一張局部圖f產生的響應值。這樣在初始狀態下,就能極大情況的模擬各種情況濾波器的情況,構造一個較強的h,以便后續幀進行在線更新。
############################## 響應圖的解釋:##############################
(3)按照公式,我們還需要一個響應輸出G(傅里葉變換g后得到)。這個G怎么來呢。在作者的代碼中的實現為:
center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%獲得矩形框的中心點縱,橫坐標(高 寬)即第一幀圖像的中心點 sigma = 100;gsize = size(im); %獲取第一幀圖片的尺寸:高 寬 3通道 [R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高維矩陣,參數1代表縱向/參數二代表橫向 %ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279 %產生高斯形狀的理想響應g g = gaussC(R,C, sigma, center); %調用高斯函數,得到高斯圖怎么解釋呢?我們得到的第一幀的圖片尺寸,先建立起一個二維矩陣,這個二維矩陣的R和C分別代表橫坐標和縱坐標。通過左右兩個矩陣的值(比如R矩陣取2,C矩陣取10).則映射到這一幀圖像每個坐標點(的“候選樣本”的目標中心點坐標)。(相當于R,C提供索引值確定數組對應位置的值一樣。)
(4)于是我們就按照R,C的索引,將得到的第一幀圖像輸入到高斯函數中,而center作為目標中心點,也傳入進去。最終得到了當前幀所有坐標點的一個響應值輸出g(因為一張圖里有很多個坐標點,所有坐標點得到的響應值即組成了一張響應值圖,多個目標則有多個峰值)。(頂峰就代表那一個坐標點對應的其實就是目標中心點的響應值輸出g)
############################## 響應圖的解釋:##############################
(5)根據第一幀初始狀態的仿射變換與相關計算,,通過最小化該函數,求得初始化后的H。此外,大寫字母(F H G)均為傅里葉變化后的對應(f h g),目的是為了加速運算。
所以我們就得到了當前幀求得的濾波器H。這樣也就方便該濾波器和下一幀圖片進行計算,最終得出最大響應值。即為下一幀的目標中心點。獲得了下一幀的目標中心點后,我們則可按照上述求解濾波器的方法對H進行更新。依次循環(這是對G/F=H這個公式的理解;它的目的是找到一個濾波器可以通過上一幀找到這一幀的目標中心點)
TIPS:
按照這個思想,mosse算法提出的和這個大同小異。也用到了響應圖輸出G和F。因為Ai-1和Bi-1在第一幀沒有數值,所以就設為0,以此來初始化Ai和Bi。
(6)在后續在線更新過程中,則會根據前一幀的響應值輸出g將會求出對應的坐標值(響應值即為目標中心點,寬高不變,通過中心點的變化,動態求的bbox坐標),這也將作為下一幀的輸入,用于裁減對應區域的對應圖像。持續更新濾波器h。在整個跟蹤過程中,通過不斷更新濾波器h,不斷調整局部區域內目標的中心點位置,進而持續調整下一幀裁切的局部區域,從而達到跟蹤的目的。這里需要注意的是,mosse相關濾波并不是在全圖進行處理,而是基于寬高不變的初始框選區域,在不斷迭代更新的該區域進行目標中心點峰值點的一個查找。
Mosse.m主代碼:
% get images from source directory datadir = '../data/'; dataset = 'Surfer'; path = [datadir dataset]; img_path = [path '/img/']; D = dir([img_path, '*.jpg']); seq_len = length(D(not([D.isdir]))); %獲取圖片序列長度 if exist([img_path num2str(1, '%04i.jpg')], 'file'), %num2str將數字轉換為字符數組/img_files = num2str((1:seq_len)', [img_path '%04i.jpg']); %得到所有對應的圖片%disp(img_files); elseerror('No image files found in the directory.'); end% select target from first frame im = imread(img_files(1,:)); %讀取第一幀的圖片 %[X,map]=imread('forest.png') 則代表X為圖像顏色值,map代表色素(通道) f = figure('Name', 'Select object to track'); imshow(im); %figure表示彈出框名稱/imshow表示在彈出窗口顯示第一幀圖片 rect = getrect; %getrect函數即用鼠標指定矩形 %其中rect返回值為選定矩形以此為:左下角的坐標,寬度,高度 close(f); clear f; center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%獲得矩形框的中心點縱,橫坐標(高 寬)即第一幀圖像的中心點% plot gaussian sigma = 100; gsize = size(im); %獲取第一幀圖片的尺寸:高 寬 3通道 [R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高維矩陣,參數1代表縱向/參數二代表橫向 %ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279 %產生高斯形狀的理想響應g g = gaussC(R,C, sigma, center); %調用高斯函數 g = mat2gray(g);%把一個double類的任意數組轉換成值范圍在[0,1]的歸一化double類數組% randomly warp original image to create training set if (size(im,3) == 3) %size(A,n),size將返回矩陣的行數或列數img = rgb2gray(im); %將RGB圖像或彩色圖轉換為灰度圖像 end %imcrop表示按第一幀選擇的矩形大小裁剪圖片 img = imcrop(img, rect); %按選定的矩形框裁剪第一幀灰度圖大小 %imcrop : https://blog.csdn.net/llxue0925/article/details/80431508 g = imcrop(g, rect); % G = fft2(g); %二維快速傅里葉變換,將響應輸出g變成G height = size(g,1); %height=179 width = size(g,2); %width=130 %f表示輸入圖像 fi = preprocess(imresize(img, [height width])); %重新設置裁剪后的圖片尺寸,再調用preprocess函數對圖像數據進行標準化處理 Ai = (G.*conj(fft2(fi))); %conj函數用于計算"復數"x的共軛值。即F*--》F的共軛 Bi = (fft2(fi).*conj(fft2(fi))); %按照求和公式計算第一個H N = 128; for i = 1:Nfi = preprocess(rand_warp(img));Ai = Ai + (G.*conj(fft2(fi)));Bi = Bi + (fft2(fi).*conj(fft2(fi))); end% % MOSSE online training regimen eta = 0.125; %官方推薦的eta值0.125 fig = figure('Name', 'MOSSE'); mkdir(['results_' dataset]); for i = 1:size(img_files, 1) %遍歷所有圖片%size(img_files, 1) 表示圖片總數量img = imread(img_files(i,:)); %讀取第i張圖片im = img;if (size(img,3) == 3) %若通道為3img = rgb2gray(img); %轉成灰度圖endif (i == 1) %當為第一張圖時Ai = eta.*Ai;Bi = eta.*Bi;elseHi = Ai./Bi; %不是第一張圖的時候,求解濾波H*fi = imcrop(img, rect); %再按指定矩形大小進行裁剪2-376的對應圖片fi = preprocess(imresize(fi, [height width])); %預處理得到輸出gi = uint8(255*mat2gray(ifft2(Hi.*fft2(fi)))); %得到響應值輸出 轉換成值范圍在[0,1]的歸一化double類數組 maxval = max(gi(:)); %得到最大響應值[P, Q] = find(gi == maxval); %找到最大響應值所對應的gidx = mean(P)-height/2;dy = mean(Q)-width/2;rect = [rect(1)+dy rect(2)+dx width height]; %更新中心點坐標fi = imcrop(img, rect); %按新更新的rect目標點進行裁剪圖片 fi = preprocess(imresize(fi, [height width]));%最后更新Ai和BiAi = eta.*(G.*conj(fft2(fi))) + (1-eta).*Ai;Bi = eta.*(fft2(fi).*conj(fft2(fi))) + (1-eta).*Bi;end% visualizationtext_str = ['Frame: ' num2str(i)]; %每一張圖片代表一幀box_color = 'green';position=[1 1];result = insertText(im, position,text_str,'FontSize',15,'BoxColor',...box_color,'BoxOpacity',0.4,'TextColor','white');result = insertShape(result, 'Rectangle', rect, 'LineWidth', 3); %繪制矩形 寬為3%imwrite(result, ['results_' dataset num2str(i, '/%04i.jpg')]);%imwrite(result, ['results_temp' dataset num2str(i, '/%04i.jpg')]);imshow(result); end總結
以上是生活随笔為你收集整理的相关滤波目标追踪一:鼻祖Mosse算法的matlab解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] 前端中的MVC
- 下一篇: matlab2008报错,simulin