当前位置 博文首页 > bbox对Holiday数据集进行图像检索mAP_斯人若彩虹,遇上方知有!
测试数据集:Holiday:总共1491张图像
提取特征:fc7层特征
降维方法:pca主成分分析
主要还是使用matconvnet提取特征;用matlab自带的activations也可以提取特征;
其中random_bbox只是针对查询图像!也可以使用groundtruth中提供的默认值也可以!
直接上代码:
addpath('helpers');
addpath('groundtruth');
addpath('matconvnet-1.0-beta25');
addpath('matlab');
% setup the matconvnet
run vl_setupnn.m;
net = load('imagenet-vgg-verydeep-16.mat');
gnd_holiday = load('gnd_holiday.mat');
main_folder = './datasets/';
dataset = 'holiday';
dataset_folder = [main_folder, dataset, '/'];
% 提取数据集特征
fprintf('Encoding database features...\n');
vecs = zeros(4096,numel(gnd_holiday.imlist));
qvecs = zeros(4096,numel(gnd_holiday.qidx));
for i = 1:numel(gnd_holiday.imlist)
img = imread([dataset_folder, gnd_holiday.imlist{i},'.jpg']);
image = single(img);
image = imresize(image,net.meta.normalization.imageSize(1:2));
image = image - net.meta.normalization.averageImage;
res = vl_simplenn(net,image);
feat = res(34).x;
feat = feat(:);
feat = feat./norm(feat);
vecs(:,i) = feat;
fprintf('Extracting image %d ... \n',i);
end
% 这个值越大效果不一定就越好
mean = 0.7; % 0.7->85.62
bbx_ratio = zeros (1, numel (gnd_holiday.qidx));
for i = 1: numel (gnd_holiday.qidx)
bbx_ratio(i) = max(0.01,randn + mean*100);
end
bbx_ratio = bbx_ratio'/100;
qimlist = {gnd_holiday.imlist{gnd_holiday.qidx}};
random_bbx = generate_random_bbx(bbx_ratio,qimlist,dataset_folder);
disp(random_bbx);
qim = arrayfun(@(x) crop_qim([dataset_folder, qimlist{x}, '.jpg'], random_bbx(x,1:4)), 1:numel(gnd_holiday.qidx), 'un', 0);
% 提取查询图像特征
fprintf ('Encoding Query Features... \n');
qvecs = zeros (4096,numel (gnd_holiday.qidx));
for i = 1:numel (gnd_holiday.qidx)
image = single(qim{i}) ; % cropped groundtruth version
image = imresize(image, net.meta.normalization.imageSize(1:2));
image = image - net.meta.normalization.averageImage ;
res = vl_simplenn(net, image) ;
feat = res(34).x;
feat = feat(:);
feat = feat./norm(feat);
qvecs (:,i) = feat;
fprintf('Extracting Image %d ... \n', i);
end
fprintf('Initial Filtering... \n');
% retrieval with inner product
[~,ranks] = sort(vecs'*qvecs,'descend');
map = compute_map (ranks, gnd_holiday.gnd);
fprintf('mAP (4096), without re-ranking = %.4f\n', map);
% pca降维
[coeff,~,~] = pca(vecs');
pca_vecs = coeff(:,1:64);
fc128_vecs = pca_vecs'*vecs;
qvecs = pca_vecs'*qvecs;
[sim,ranks] = sort(fc128_vecs'*qvecs,'descend');
map = compute_map (ranks,gnd_holiday.gnd);
fprintf('mAP (128) = %.4f\n', map);
fprintf("Starting image retrieval...\n");
query = floor ( rand * numel ( gnd_holiday.qidx ));
figure;
im_index = gnd_holiday.qidx(query);
image = imread(strcat(dataset_folder,gnd_holiday.imlist{im_index} ,'.jpg'));
imshow(image);
bounding_box_tmp = random_bbx(query,:);
bounding_box = zeros (1,4);
bounding_box (1) = bounding_box_tmp(1);
bounding_box (2) = bounding_box_tmp(2);
bounding_box (3) = bounding_box_tmp(3) - bounding_box_tmp(1);
bounding_box (4) = bounding_box_tmp(4) - bounding_box_tmp(2);
rectangle ('Position',bounding_box,'EdgeColor','g','LineWidth',2);
title (strcat('query',string(query),' Number: ',string(numel(gnd_holiday.gnd(query).ok))));
xlabel (strcat ('crop ratio ',string (bbx_ratio(query))));
figure;
for i = 1 : 10
[image,map] = imread(strcat(dataset_folder,gnd_holiday.imlist{ranks(i,query)},'.jpg'));
subplot(2,5,i), imshow(image,map),title(i)
if ismember(ranks(i,query),gnd_holiday.gnd(query).ok)
rectangle('Position',[1 1 size(image,2)-1 size(image,1)-1],'EdgeColor','g','LineWidth',2);
else
rectangle('Position',[1 1 size(image,2)-1 size(image,1)-1],'EdgeColor','r','LineWidth',2);
end
end
其中generate_random_bbox.m
function [random_bbx] = generate_random_bbx (bbx_ratio,qimlist,dataset_folder)
% Input:
% bbx_ratio: each element is the ratio of the bounding box area [No.Query x 1]
% qimlist
% dataset_foldr
% Output:
% random_bbx: each row is the randomly generated bounding box in the gnd
% file manner [No.Query x 1]
random_bbx = zeros (numel (bbx_ratio),4);
for i = 1: numel (bbx_ratio)
img = imread ([dataset_folder, qimlist{i}, '.jpg']);
ratio = sqrt ( bbx_ratio(i) );
mid_x = size (img,2)/2;
length_x = size (img,2)*ratio/2;
mid_y = size (img,1)/2;
length_y = size (img,1)*ratio/2;
random_bbx (i,:) = [mid_x-length_x mid_y-length_y mid_x+length_x mid_y+length_y];
end
最终输出结果是:mAP=85.62%
?
cs