使用数据集:oxbuild images:共5063张图像
-
特征提取
-
图像检索
1、特征提取
使用VGG-16提取fc7特征,也可以使用其他层,代码中注释了可以使用conv5_3卷积层
img_path = './oxbuild_images/*.jpg';
addpath(img_path);
addpath('tools\');
% 加载网络并修改输入层的尺寸
net = vgg16;
layers = net.Layers;
insz = layers(1).InputSize;
img_files = dir(img_path);
% 加载每一张图像
img_NameList = {img_files(~[img_files.isdir]).name};
img_NameList = img_NameList';
clear img_files;
% 图像数
numImg = length(img_NameList);
feature = [];
for i = 1:numImg
oriImg = imread(img_NameList{i,1});
im_ = single(oriImg);
img_resize = imresize(im_,insz(1:2));
features(i,:) = activations(net,img_resize,'fc7','OutputAs','rows');
% temp = activations(net,img_resize,'conv5_3','OutputAs','channels');
% 删除第1和2维度:原始的是:14*14*512,这里只是保留了第3维
% features(i,:) = squeeze(mean(temp,[1,2]));
fprintf('extract %d image\n\n', i);
end
disp('Done..!!!')
% 提取Conv5_3特征
save('conv5_3_512dim.mat','features','img_NameList');
% 采用pca降维
[coeff,score,latent] = pca(features);
feature = features*coeff(:,1:128);
% 归一化后的特征
feat_norm = normalize1(feature);
save('conv5_3_feature.mat','feat_norm','img_NameList');
2、图像检索
addpath('tools');
db_name = 'oxbuild_images';
numRetrieval = 12;
if strcmp(db_name, 'oxbuild_images')
load feature_norm.mat;
% load conv5_3_512dim.mat;
feat = feat_norm;
path_imgDB = './oxbuild_images/';
addpath(path_imgDB);
end
% 如果没有归一化,就采用归一化
% featNorm = normalize1(feat);
% save('feat4096Norml.mat','featNorm', 'rgbImgList');
% 特征值和特征向量的子集
[pc, ~] = eigs(double(cov(feat)), 64);
feat_norm = feat*pc;
% 检索可视化
queryID = 4600;
QueryVec = featNorm(queryID, :);
[n,~] = size(featNorm);
score = zeros(n, 1);
%for loop = 1:n
% VecTemp = featNorm(loop, :);
% score(loop) = QueryVec*VecTemp';
%end
score = (QueryVec*featNorm')';
[~, index] = sort(score,'descend');
rank_image_ID = index;
% 输出图像的尺寸
% 方法一
% I2 = uint8(zeros(224, 224, 3, numRetrieval));
for i=1:numRetrieval
% 方法二、显示图像和对应的图像名
imName = rgbImgList{rank_image_ID(i, 1), 1};
im = imread(imName);
im = imresize(im, [224 224]);
subplot(3,4,i);
imshow(im);
title(imName(1:3));
% if (ndims(im)~=3)
% I2(:, :, 1, i) = im;
% I2(:, :, 2, i) = im;
% I2(:, :, 3, i) = im;
% else
% I2(:, :, :, i) = im;
% end
end
% figure('color',[1,1,1]);
% montage(I2(:, :, :, (1:numRetrieval)));
% title('检索结果');
% 显示查询图像和图像名
QueryName = rgbImgList{queryID, 1};
im = imread(QueryName);
imQuery = imresize(im, [224 224]);
figure('color',[1,1,1]);
imshow(imQuery);
disp(QueryName);
title(QueryName(1:3),'fontsize',8);
检索结果: