第一种,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);