基于matlab R2018b的图像检索

使用数据集:oxbuild images:共5063张图像

  1. 特征提取

  2. 图像检索

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);

检索结果:

参考博客:https://www.cnblogs.com/linkmust/articles/9607604.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kaichu2

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

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

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

打赏作者

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

抵扣说明:

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

余额充值