当前位置 博文首页 > bbox对Holiday数据集进行图像检索mAP_斯人若彩虹,遇上方知有!

    bbox对Holiday数据集进行图像检索mAP_斯人若彩虹,遇上方知有!

    作者:[db:作者] 时间:2021-08-25 21:49

    测试数据集: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
    下一篇:没有了