計算AP值的兩種方式
阿新 • • 發佈:2019-01-09
第一種,query結果的第一個不包括在內
MAP = [];
for i =1:query_frame
old_recall = 0;
old_precision = 1.0;
ap = 0;
intersect_size = 0;
j = 0;
ngood = length(gnd{i});
good_now = 0;
ngood = ngood - 1;
for n = 2:return_num
if ~isempty(find(gnd{i} == query_result(i,n)))
flag = 1 ; % good image
good_now = good_now+1;
else
flag = 0; % bad image
end
if flag == 1%good
intersect_size = intersect_size + 1;
end
recall = intersect_size/ngood;
precision = intersect_size/(j + 1);
ap = ap + (recall - old_recall)*((old_precision+precision)/2 );
old_recall = recall;
old_precision = precision;
j = j+1;
if good_now == ngood
break;
end
end
MAP = [MAP,ap];
end
final_MAP = mean(MAP);
fprintf('CNN final_MAP %6.4f \n',final_MAP);
第二種,query結果的第一個計算在內,這樣計算出來的AP值要比第一種高
MAP = [];
for i = 1:query_frame
double map;
map = 0;
up = 0;
gnd_num = length(gnd{i});
for j =1:return_num
if( find(gnd{i}==query_result(i,j)))
up = up+1;
map = map + up/j;
end
if up == gnd_num
break;
end
end
map = map / gnd_num;
MAP(i) = map;
end
final_MAP = mean(MAP);