相关滤波目标追踪一:鼻祖Mosse算法的matlab解析
一些自己的見解,如有不同觀點(diǎn),可以一起討論。
github地址:https://github.com/Ronales/Mosse_Tracking_matlab
補(bǔ)充:說一下mosse的更新策略:
1. "論文目標(biāo)就是找到一個(gè)濾波器h,使其在輸入圖像上,跟蹤的目標(biāo)上的位置響應(yīng)值最大。f表示訓(xùn)練圖像,g表示響應(yīng)輸出,h表示濾波器,F,G,H對(duì)應(yīng)其頻域值(均為傅里葉變換后的值)。"這句話誰都能懂,落到實(shí)處就是:
(1)初始狀態(tài)(第一幀),我們首先框選一副圖像的某一個(gè)人的位置,則按照人體目標(biāo)框選位置裁剪出來的局部圖像就是f有了。
(2)由于mosse是一個(gè)在線更新的階段,即響應(yīng)輸出g得到的坐標(biāo)位置應(yīng)當(dāng)作為下一幀更新的輸入提供位置裁切參考。這樣一來初始狀態(tài)沒有同時(shí)具有f和g的條件。(初值狀態(tài)只有手動(dòng)框選的一個(gè)目標(biāo)位置),則就無法初始化濾波器h。
這里需要將裁剪出來的局部圖像f進(jìn)行仿射變換,得到128張圖像fi。模擬不穩(wěn)定狀態(tài)下的請(qǐng)情況,此時(shí)這128次仿射變化得到的響應(yīng)圖g最終結(jié)果應(yīng)當(dāng)為手動(dòng)框選的那一張局部圖f產(chǎn)生的響應(yīng)值。這樣在初始狀態(tài)下,就能極大情況的模擬各種情況濾波器的情況,構(gòu)造一個(gè)較強(qiáng)的h,以便后續(xù)幀進(jìn)行在線更新。
############################## 響應(yīng)圖的解釋:##############################
(3)按照公式,我們還需要一個(gè)響應(yīng)輸出G(傅里葉變換g后得到)。這個(gè)G怎么來呢。在作者的代碼中的實(shí)現(xiàn)為:
center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%獲得矩形框的中心點(diǎn)縱,橫坐標(biāo)(高 寬)即第一幀圖像的中心點(diǎn) sigma = 100;gsize = size(im); %獲取第一幀圖片的尺寸:高 寬 3通道 [R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高維矩陣,參數(shù)1代表縱向/參數(shù)二代表橫向 %ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279 %產(chǎn)生高斯形狀的理想響應(yīng)g g = gaussC(R,C, sigma, center); %調(diào)用高斯函數(shù),得到高斯圖怎么解釋呢?我們得到的第一幀的圖片尺寸,先建立起一個(gè)二維矩陣,這個(gè)二維矩陣的R和C分別代表橫坐標(biāo)和縱坐標(biāo)。通過左右兩個(gè)矩陣的值(比如R矩陣取2,C矩陣取10).則映射到這一幀圖像每個(gè)坐標(biāo)點(diǎn)(的“候選樣本”的目標(biāo)中心點(diǎn)坐標(biāo))。(相當(dāng)于R,C提供索引值確定數(shù)組對(duì)應(yīng)位置的值一樣。)
(4)于是我們就按照R,C的索引,將得到的第一幀圖像輸入到高斯函數(shù)中,而center作為目標(biāo)中心點(diǎn),也傳入進(jìn)去。最終得到了當(dāng)前幀所有坐標(biāo)點(diǎn)的一個(gè)響應(yīng)值輸出g(因?yàn)橐粡垐D里有很多個(gè)坐標(biāo)點(diǎn),所有坐標(biāo)點(diǎn)得到的響應(yīng)值即組成了一張響應(yīng)值圖,多個(gè)目標(biāo)則有多個(gè)峰值)。(頂峰就代表那一個(gè)坐標(biāo)點(diǎn)對(duì)應(yīng)的其實(shí)就是目標(biāo)中心點(diǎn)的響應(yīng)值輸出g)
############################## 響應(yīng)圖的解釋:##############################
(5)根據(jù)第一幀初始狀態(tài)的仿射變換與相關(guān)計(jì)算,,通過最小化該函數(shù),求得初始化后的H。此外,大寫字母(F H G)均為傅里葉變化后的對(duì)應(yīng)(f h g),目的是為了加速運(yùn)算。
所以我們就得到了當(dāng)前幀求得的濾波器H。這樣也就方便該濾波器和下一幀圖片進(jìn)行計(jì)算,最終得出最大響應(yīng)值。即為下一幀的目標(biāo)中心點(diǎn)。獲得了下一幀的目標(biāo)中心點(diǎn)后,我們則可按照上述求解濾波器的方法對(duì)H進(jìn)行更新。依次循環(huán)(這是對(duì)G/F=H這個(gè)公式的理解;它的目的是找到一個(gè)濾波器可以通過上一幀找到這一幀的目標(biāo)中心點(diǎn))
TIPS:
按照這個(gè)思想,mosse算法提出的和這個(gè)大同小異。也用到了響應(yīng)圖輸出G和F。因?yàn)锳i-1和Bi-1在第一幀沒有數(shù)值,所以就設(shè)為0,以此來初始化Ai和Bi。
(6)在后續(xù)在線更新過程中,則會(huì)根據(jù)前一幀的響應(yīng)值輸出g將會(huì)求出對(duì)應(yīng)的坐標(biāo)值(響應(yīng)值即為目標(biāo)中心點(diǎn),寬高不變,通過中心點(diǎn)的變化,動(dòng)態(tài)求的bbox坐標(biāo)),這也將作為下一幀的輸入,用于裁減對(duì)應(yīng)區(qū)域的對(duì)應(yīng)圖像。持續(xù)更新濾波器h。在整個(gè)跟蹤過程中,通過不斷更新濾波器h,不斷調(diào)整局部區(qū)域內(nèi)目標(biāo)的中心點(diǎn)位置,進(jìn)而持續(xù)調(diào)整下一幀裁切的局部區(qū)域,從而達(dá)到跟蹤的目的。這里需要注意的是,mosse相關(guān)濾波并不是在全圖進(jìn)行處理,而是基于寬高不變的初始框選區(qū)域,在不斷迭代更新的該區(qū)域進(jìn)行目標(biāo)中心點(diǎn)峰值點(diǎn)的一個(gè)查找。
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將數(shù)字轉(zhuǎn)換為字符數(shù)組/img_files = num2str((1:seq_len)', [img_path '%04i.jpg']); %得到所有對(duì)應(yīng)的圖片%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函數(shù)即用鼠標(biāo)指定矩形 %其中rect返回值為選定矩形以此為:左下角的坐標(biāo),寬度,高度 close(f); clear f; center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%獲得矩形框的中心點(diǎn)縱,橫坐標(biāo)(高 寬)即第一幀圖像的中心點(diǎn)% plot gaussian sigma = 100; gsize = size(im); %獲取第一幀圖片的尺寸:高 寬 3通道 [R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高維矩陣,參數(shù)1代表縱向/參數(shù)二代表橫向 %ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279 %產(chǎn)生高斯形狀的理想響應(yīng)g g = gaussC(R,C, sigma, center); %調(diào)用高斯函數(shù) g = mat2gray(g);%把一個(gè)double類的任意數(shù)組轉(zhuǎn)換成值范圍在[0,1]的歸一化double類數(shù)組% randomly warp original image to create training set if (size(im,3) == 3) %size(A,n),size將返回矩陣的行數(shù)或列數(shù)img = rgb2gray(im); %將RGB圖像或彩色圖轉(zhuǎn)換為灰度圖像 end %imcrop表示按第一幀選擇的矩形大小裁剪圖片 img = imcrop(img, rect); %按選定的矩形框裁剪第一幀灰度圖大小 %imcrop : https://blog.csdn.net/llxue0925/article/details/80431508 g = imcrop(g, rect); % G = fft2(g); %二維快速傅里葉變換,將響應(yīng)輸出g變成G height = size(g,1); %height=179 width = size(g,2); %width=130 %f表示輸入圖像 fi = preprocess(imresize(img, [height width])); %重新設(shè)置裁剪后的圖片尺寸,再調(diào)用preprocess函數(shù)對(duì)圖像數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理 Ai = (G.*conj(fft2(fi))); %conj函數(shù)用于計(jì)算"復(fù)數(shù)"x的共軛值。即F*--》F的共軛 Bi = (fft2(fi).*conj(fft2(fi))); %按照求和公式計(jì)算第一個(gè)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) 表示圖片總數(shù)量img = imread(img_files(i,:)); %讀取第i張圖片im = img;if (size(img,3) == 3) %若通道為3img = rgb2gray(img); %轉(zhuǎn)成灰度圖endif (i == 1) %當(dāng)為第一張圖時(shí)Ai = eta.*Ai;Bi = eta.*Bi;elseHi = Ai./Bi; %不是第一張圖的時(shí)候,求解濾波H*fi = imcrop(img, rect); %再按指定矩形大小進(jìn)行裁剪2-376的對(duì)應(yīng)圖片fi = preprocess(imresize(fi, [height width])); %預(yù)處理得到輸出gi = uint8(255*mat2gray(ifft2(Hi.*fft2(fi)))); %得到響應(yīng)值輸出 轉(zhuǎn)換成值范圍在[0,1]的歸一化double類數(shù)組 maxval = max(gi(:)); %得到最大響應(yīng)值[P, Q] = find(gi == maxval); %找到最大響應(yīng)值所對(duì)應(yīng)的gidx = mean(P)-height/2;dy = mean(Q)-width/2;rect = [rect(1)+dy rect(2)+dx width height]; %更新中心點(diǎn)坐標(biāo)fi = imcrop(img, rect); %按新更新的rect目標(biāo)點(diǎn)進(jìn)行裁剪圖片 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總結(jié)
以上是生活随笔為你收集整理的相关滤波目标追踪一:鼻祖Mosse算法的matlab解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] 前端中的MVC
- 下一篇: matlab2008报错,simulin