使用VGG16的全连接层fc6计算oxford5k和paris6k的mAP

目录

1、官网地址:https://www.vlfeat.org/matconvnet/

2、配置MatConvNet

3、提取fc6层特征

4、计算mAP

5、evaluate:


1、官网地址:https://www.vlfeat.org/matconvnet/

2、配置MatConvNet

参考配置MatConvNet方法

PS:这一步完成才能进行下一步

3、提取fc6层特征

oxford5K数据集:http://www.robots.ox.ac.uk/~vgg/data/oxbuildings/

paris6k数据集:http://www.robots.ox.ac.uk/~vgg/data/parisbuildings/

数据集存放地址代码里有体现,可以根据自己的情况修改!

为什么选择fc6层?

答:没有任何原因,哪一层都可以;但是卷积层会比全连接层的效果要好;微调之后的性能也会有所提升!或者进行特征互补!

参考博客:layer选择与fine-tuning性能提升验证

参考论文:Exploiting the complementary strengths of multi-layer CNN features for image retrieval

参考论文中的表格
run matlab/vl_setupnn;
addpath('./data/datasets/paris6k/');
model = 'imagenet-vgg-verydeep-16.mat';
% fc6层
layers = 32;
max_img_dim = 1024;
baseDir = './data/';

net = load(model);
net.layers = {net.layers{1:layers}};

im_folder_oxford = [baseDir,'datasets/paris6k/'];
oxford_gnd = [im_folder_oxford,'gnd_paris6k.mat'];

gnd_oxford = load(oxford_gnd);

% query
Q = [];
% database
X = [];

fprintf('Extracting database features\n');
for i=1:length(gnd_oxford.imlist)
    I = imread([im_folder_oxford, gnd_oxford.imlist{i},'.jpg']);
    % 缩放
    im_ = imresize(single(I),net.meta.normalization.imageSize(1:2));
    % 减去均值
    im_ = im_ - net.meta.normalization.averageImage;
    res = vl_simplenn(net,im_);
    feature = res(layers).x;
    % 提取卷积层的特征
%     x = res(layers).x;
%     % 提取的是卷积层特征:原始的是:[14*14*512]
%     feature = squeeze(mean(x,[1,2]));
    X(i,:) = feature(:);
    if mod(i,100) == 0
        i
    end
end

fprintf('extracting the query image\n');
qimlist = {gnd_oxford.imlist{gnd_oxford.qidx}};
for i=1:length(qimlist)
    I = imread([im_folder_oxford, qimlist{i}, '.jpg']);
    % 缩放
    im_ = imresize(single(I),net.meta.normalization.imageSize(1:2));
    % 减去均值
    im_ = im_ - net.meta.normalization.averageImage;
    res = vl_simplenn(net,im_);
    fea = res(layers).x;
    % 提取卷积层的特征
%     x = res(layers).x;
%     fea = squeeze(mean(x,[1,2]));
    Q(i,:) = fea(:);
    disp(i);
end

save('./data/features/paris6k.mat',"Q","X");

4、计算mAP

官方提供的计算方法:http://www.robots.ox.ac.uk/~vgg/data/oxbuildings/

官方是C++,这里用matlab实现:参考https://github.com/Relja/netvlad

function [map,aps] = mAP(ranks,gnd,verbose)

% usage; map = mAP(ranks,gnd)

% ranks:1->size(ranks)=db_size

if nargin < 3
    verbose = false;
end

map = 0;
nq = numel(gnd);
aps = zeros(nq,1);

for i = 1:nq
  qgnd = gnd(i).ok; 
  if isfield (gnd(i), 'junk')
    qgndj = gnd(i).junk; 
  else 
    qgndj = []; 
  end
  
	% positions of positive and junk images
  [~, pos] = intersect (ranks (:,i), qgnd);
  [~, junk] = intersect (ranks (:,i), qgndj);

	pos = sort(pos);
	junk = sort(junk);

	k = 0;  
	ij = 1;

	if ~isempty (junk)
		% decrease positions of positives based on the number of junk images appearing before them
		ip = 1;
		while ip <= numel (pos)

			while ( ij <= length (junk) && pos (ip) > junk (ij) )
				k = k + 1;
				ij = ij + 1;
			end

			pos (ip) = pos (ip) - k;
			ip = ip + 1;
		end
	end

  ap = score_ap_from_ranks1 (pos, length (qgnd));
	
  if verbose
    fprintf ('query no %d -> gnd = ', i);
    fprintf ('%d ', qgnd);
    fprintf ('\n              tp ranks = ');
    fprintf ('%d ', pos);
    fprintf (' -> ap=%.3f\n', ap);
  end
  map = map + ap;
	aps (i) = ap;

end
map = map / nq;

end

% This function computes the AP for a query
function ap = score_ap_from_ranks1 (ranks, nres)

% number of images ranked by the system
nimgranks = length (ranks);  
ranks = ranks - 1;	
  
% accumulate trapezoids in PR-plot
ap = 0;

recall_step = 1 / nres;

for j = 1:nimgranks
  rank = ranks(j);
  
  if rank == 0
    precision_0 = 1.0;
  else
    precision_0 = (j - 1) / rank;
  end
  
  precision_1 = j / (rank + 1);
  ap = ap + (precision_0 + precision_1) * recall_step / 2;
end

end

5、evaluate:

% oxford5k:fc6层特征:0.3265
% load('./data/features/oxford5k.mat');

% paris6k:fc6层特征:
load('./data/features/paris6k.mat');

fprintf(">>Starting retrieval!!!");
% 使用内积
sim = X*Q';
[sim,ranks] = sort(sim,'descend');
map = mAP(ranks,gnd_oxford.gnd);
fprintf("map=%.4f",map);
map=0.4421

注:如有疑问,麻烦指出,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaichu2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值