視頻圖像跟蹤算法的評估經常須要計算重疊率(Overlap Rate)、像素偏差(Pixel Error)還有AUC(Area Under Curve)。這些技術指標都比較好理解,若是不理解的話能夠參見我以前的博客。這篇博客主要就是貼上Matlab的代碼,使用Matlab計算這些參數,並繪製出曲線圖。算法
若是你是想放在Paper中的話,能夠下載Visual Track BenchMark中提供的代碼,能夠畫出和Paper上同樣的樣式,這篇博客只是博主對單個視頻本身寫的小demo,便於本身分析實驗的,若是要在Paper使用還須要作樣式的修改。sublime-text
關於各個指標,以前博客已經介紹過了,這裏就簡單講一下app
重疊率 = 重疊區域面積/(預測矩形的面積+真實矩形的面積-重疊區域的面積)ide
像素偏差 = 真實中心和預測中心的歐式距離函數
成功率圖的曲線下面積spa
變量說明:code
數據文件爲Object Tracker BenchMark中的數據格式存放在./results_TRE_CVPR13/文件夾中,圖像序列(只用到了groundtruth.txt的真實值)存儲在F:\Data\sequence\,這個兩個量均可以在代碼中修改。orm
video_set: 圖像數據集名稱視頻
method_set: 方法名稱blog
line_style: 要和method_set的大小相等,每種線條樣式method相對應
close all; clear all; video_set = {'Shaking'}; %video_set = {'BlurCar2','Car2','Car4','Car24','Doll','Human6','RedTeam','Singer1','Walking','Walking2'}; method_set = {'FMT', 'kcf_hog8'}; line_style = {'--r', '--g'}; base_path = 'F:\Data\sequence\'; results_path = './results_TRE_CVPR13/'; precision{numel(video_set), numel(method_set)} = 0; auc_table{numel(video_set)+1, numel(method_set)+1} = 0; auc_table{1,1}=0; for i = 1:numel(video_set) auc_table{i+1,1}=video_set{i}; % read groundtruth varlist = {'gt','gt_center','gt_rect','gt_area','center','boxes,res_rect','res_area',... 'overlap_rect','overlap_area','overlap_rate','mask','pixel_error','er'}; clear(varlist); gt_file = fopen([base_path video_set{i} '\groundtruth_rect.txt']); try groundtruth_roi = textscan(gt_file, '%f,%f,%f,%f', 'ReturnOnError', false); gt(:,1)=groundtruth_roi{1}; gt(:,2)=groundtruth_roi{2}; gt(:,3)=groundtruth_roi{3}; gt(:,4)=groundtruth_roi{4}; catch %#ok, try different format (no commas) frewind(gt_file); groundtruth_roi = textscan(gt_file, '%f %f %f %f'); gt(:,1)=groundtruth_roi{1}; gt(:,2)=groundtruth_roi{2}; gt(:,3)=groundtruth_roi{3}; gt(:,4)=groundtruth_roi{4}; end gt_center(:,1) = gt(:,1) + gt(:,3)/2; gt_center(:,2) = gt(:,2) + gt(:,4)/2; gt_rect(:,1) = gt(:,1); gt_rect(:,2) = gt(:,2); gt_rect(:,3) = gt(:,1) + gt(:,3); gt_rect(:,4) = gt(:,2) + gt(:,4); gt_area = gt(:,3).*gt(:,4); % caculate different method precision for ii = 1:numel(method_set) auc_table{1,ii+1}=method_set{ii}; clear('fig','boxes','center','er','pixel_error','res_rect','overlap_rect','mask',... 'overlap_rate','overlap_area','xx','yy'); %read results (標準格式) r = load([results_path lower(video_set{i}) '_' method_set{ii} '.mat']); boxes = r.results{1}.res; assert(size(boxes,1)==size(gt,1)); % caculate pixel error center(:,1) = boxes(:,1)+boxes(:,3)/2; center(:,2) = boxes(:,2)+boxes(:,4)/2; er = center - gt_center; pixel_error = sqrt(er(:,1).*er(:,1)+er(:,2).*er(:,2)); % caculate overlaprate res_rect(:,1) = boxes(:,1); res_rect(:,2) = boxes(:,2); res_rect(:,3) = boxes(:,1)+boxes(:,3); res_rect(:,4) = boxes(:,2)+boxes(:,4); res_area = boxes(:,3).*boxes(:,4); overlap_rect(:,1) = max(res_rect(:,1), gt_rect(:,1)); overlap_rect(:,2) = max(res_rect(:,2), gt_rect(:,2)); overlap_rect(:,3) = min(res_rect(:,3), gt_rect(:,3)); overlap_rect(:,4) = min(res_rect(:,4), gt_rect(:,4)); mask = or((overlap_rect(:,1)>overlap_rect(:,3)), overlap_rect(:,2)>overlap_rect(:,4)); overlap_area = (overlap_rect(:,3)-overlap_rect(:,1)).*(overlap_rect(:,4)-overlap_rect(:,2)); overlap_area(mask) = 0; overlap_rate = overlap_area ./ (gt_area + res_area - overlap_area + eps); % visualization and result fig.video = video_set{i}; fig.method = method_set{ii}; fig.len = size(boxes,1); [yy, xx] = cdfcc(overlap_rate); fig.ol = overlap_rate; fig.olm = mean(overlap_rate); fig.olcdf.x = xx; fig.olcdf.x(1) = 0; fig.olcdf.x(end) = 1; fig.olcdf.y = 1-yy; [yy, xx] = cdfcc(pixel_error); fig.pe = pixel_error; fig.pem = mean(pixel_error); fig.pecdf.x = xx; fig.pecdf.y = yy; precision{i,ii} = fig; auc_table{i+1,ii+1} = fig.olm; end % show plot if 1, figure('Name', 'Pixel Error', 'Color', 'w'); for ii = 1:numel(method_set), plot(1:precision{i,ii}.len, precision{i,ii}.pe, line_style{ii}, 'LineWidth', 2), hold on; lg{ii} = [method_set{ii} ' ' sprintf('%.2f', precision{i,ii}.pem)]; end title(video_set{i});xlabel('Frame#');ylabel('Pixel Error'); legend(lg); figure('Name', 'Overlap Rate', 'Color', 'w'); for ii = 1:numel(method_set), plot(1:precision{i,ii}.len, precision{i,ii}.ol, line_style{ii}, 'LineWidth', 2), hold on; lg{ii} = [method_set{ii} ' ' sprintf('%.2f', precision{i,ii}.olm)]; end title(video_set{i});xlabel('Frame#');ylabel('Overlap Rate'); legend(lg); figure('Name', 'Pixel Error Success Plot', 'Color', 'w'); for ii = 1:numel(method_set), plot(precision{i,ii}.pecdf.x, precision{i,ii}.pecdf.y, line_style{ii}, 'LineWidth', 2), hold on; %lg{ii} = [method_set{ii} ' ' sprintf('%.2f', trapz(precision{i,ii}.pecdf.x(2:end-1), precision{i,ii}.pecdf.y(2:end-1)))]; end title(video_set{i});xlabel('Pixel Error Threshold');ylabel('Success Rate'); legend(method_set); figure('Name', 'Overlap Rate Success Plot', 'Color', 'w'); for ii = 1:numel(method_set), plot(precision{i,ii}.olcdf.x, precision{i,ii}.olcdf.y, line_style{ii}, 'LineWidth', 2), hold on; lg{ii} = [method_set{ii} ' ' sprintf('%.2f', trapz(precision{i,ii}.olcdf.x, precision{i,ii}.olcdf.y))]; end title(video_set{i});xlabel('Overlap Rate Threshold');ylabel('Success Rate'); legend(lg); end end
其中用到了一個函數,也貼上來
1
2
3
4
5
6
7
|
function [ yCDF, xCDF ] = cdfcc( rate )
[yy, xx, ~, ~, ~] = cdfcalc(rate);
k = length(xx);
n = reshape(repmat(1:k, 2, 1), 2*k, 1);
xCDF = [-Inf; xx(n); Inf];
yCDF = [0; 0; yy(1+n)];
end
|
這裏已經在圖例中放入了計算出的平均像素偏差、平均重疊率、AUC的數值。