实习日记:图像检索算法 LSH 的总结与分析(matlab)

最开始仿真和精度测试,基于 matlab 完成的。

Demo_MakeTable.m (生成 Hash 表)

%========================================
%***********************************
%******* 设定参数: *****************
%*******  l : hash表个数    ********
%*******  k : 各表关键字个数 *******
%=========================================
clear all; close all; clc;
l = 3;
k = 15;
sData = textread(‘./Data/data.txt‘, ‘%s‘);
n = length(sData);
Data = false(n, 128);
for i = 1 : n
    Data(i, :) = sData{i} - ‘0‘;
end
clear sData;

Tables = lsh_1norm(l, k, Data);
save([‘.\Data\‘ num2str(l) ‘_‘ num2str(k) ‘_Tables‘], ‘Tables‘);
% cd ./ErrorCompute
% Demo_ErrorStat
%% Write Hash keys and the Index
% 多线程
% matlabpool local 10
% for i = 1 : l
%     fprintf(‘第 %d 个哈希表.\n‘, i);
%     Write_Hash_Index(k, Tables(i), i);
% end
% matlabpool close

lsh_1norm.m (核心函数,我用其组织了整个索引结构生成过程)

function T2 = lsh_1norm(l, k, yy)
%==================================
% parameters setting && getting
% [n d] = size(x);
%==================================
%************ 数据集预处理 : 转 hamming 空间(维度小于100时使用) ********
%   fprintf(‘数据集转换到 Hamming space.\n‘);
%   tic
%   x = x‘; % n x d   (d < 100)
%   C = max(x(:));
%   dim = size(x);
%   yy = false(dim(1), dim(2) * 255);
%   for i = 1 : dim(1)
%       for j = 1 : dim(2)
%           oneO = false(1,C);
%           oneO(1:x(i,j)) = 1;
%           yy(i,(j-1)*C+1 : (j-1)*C+C) = oneO;
%       end
%   end
%   clear oneO x;
%   toc
%   fprintf(‘转换 Hamming space 完成.\n‘);
%==================================
fprintf(‘初始化 %d 个 Hash 表...\n‘, l);
%  matlabpool local 10
%  可并行
for i = 1 : l
    % creat and init Tables[i] = f(k, x);
    T1(i) = createTable(k, yy);
end
%  matlabpool close
fprintf(‘初始化完成。\n‘);
%=====================================
tic;
matlabpool local 10
% save the index of feature data
%  insert(T, x);
for i = 1 : l
    fprintf(‘数据插入第 %d 个hash表\n‘, i);
    T2(i) = insert_data(T1(i), yy);
end
matlabpool close
toc;
% clc;

%======================================

createTable.m

function T = createTable(k, x)
% M = size(x,1)+17; % length of second hashTable (hashTable2)
M = 587474;
d = size(x, 2);

select_d = unidrnd(d, 1, k);
I.d = select_d;
% I.threshold = unifrnd(0, 1, 1, k) * 255; % value interval [0 255]
I.k = k;
T.I = I;
T.randDigits = unidrnd(M, 1, k);
T.buckets = [];
T.index = {};
T.hashTable2 = cell(M,1);

insert_data.m

function T = insert_data(T, x)
%  M = size(x, 1) + 17;
M = 587474;

%  buck01 = x(T.I.d, :)‘ < repmat(T.I.threshold, size(x,2), 1);
 buck01 = x(:, T.I.d);
 [uBuck id1 id2] = unique(buck01,‘rows‘);
 T.buckets = logical(uBuck);
 T.bucket_cnt = length(id1);
 key = mod(sum(bsxfun(@times, uBuck, T.randDigits),2), M) + 1; % matalb 下标从 1 开始
 T.index = cell(length(id1), 1);
 for bb = 1 : length(id1)
     sameBucket = find(id2 == bb);
     T.index{bb} = [T.index{bb}; sameBucket‘];
     T.hashTable2{key(bb)} = [T.hashTable2{key(bb)} bb];
 end

Demo_computeError.m (测试精确度)

%  clear all; clc;
 p = 1;
 load([‘..\Data\3_15_Tables.mat‘]);
 load(‘..\Data\data.mat‘);
 load(‘..\Data\query.mat‘);
 Data = Data‘;
 avgErr = zeros(1, 50);
 MissSum = zeros(1, 50);
 picErr = zeros(1,50); picErr(1) = 0.982;

 for K = 1 : 10
        MissCnt = 0;
        ratioCnt = 0;
        fid = fopen([‘K_‘ num2str(K) ‘.txt‘], ‘w‘);
        for i = 1 : length(Q)  % the ith input.
%          fprintf(fid, ‘%-5d‘, i);
%          fprintf([num2str(i) ‘ ‘]);
         q = Q(i,:)‘;
         [Id1, Mis] = LSH_Search(q‘, K, Tables, Data, p);
         if Mis
             MissCnt = MissCnt + 1;
             fprintf(fid, ‘Miss\n‘);
             continue;
         end
%          num = num + 1;
%          imwrite(uint8(input),[‘.\Data\‘,‘query_subset2\‘,num2str(num),‘.bmp‘]);
         Id2 = Linear_Search(q, K, Data, p);
         Dlsh = lp_norm(q, Data(:, Id1), p);
         Dcst = lp_norm(q, Data(:, Id2), p);
         id = Dlsh == Dcst;
         ratio = Dcst ./ (Dlsh + 0.00002);
         ratio(id) = 1;
%           for j = 1 : K
%               fprintf(fid, ‘%-8.2f‘, ratio(j));
%           end
         fprintf(fid, ‘error: %8.3f\n‘, ratio(K));
         ratioCnt = ratioCnt + ratio(K);
    end
        fprintf(fid, ‘Hit times: %-5d Avg. error: %.3f\n‘, length(Q)-MissCnt, ratioCnt/(length(Q)-MissCnt));
        avgErr(K) = ratioCnt/(length(Q)-MissCnt);
        fprintf(fid, ‘Miss times: %-5d Miss ratio: %.3f‘, MissCnt, MissCnt/length(Q));
        MissSum(K) = MissCnt;
        picErr(K) = ratioCnt / (length(Q)-MissCnt);
        fclose(fid);
 end
%  figure,plot(1:50,avgErr,‘-r.‘,‘MarkerFaceColor‘,‘g‘),
%  xlabel(‘number of K‘),ylabel(‘Error‘),title(‘Error of LSH‘);
%  figure, plot(1:50,MissSum/146,‘-r.‘,‘MarkerEdgeColor‘,‘k‘),
%  xlabel(‘number of K‘),ylabel(‘Miss ratio‘),title(‘Qurey miss of LSH‘);

figure,plot(1:10,picErr(1:10),‘-r.‘,‘MarkerFaceColor‘,‘g‘),
xlabel(‘number of K‘),ylabel(‘Error‘),title(‘Error of LSH‘);

Linear_Search.m

function Index = Linear_Search(q, K, DataSet, p)

D = feval(‘lp_norm‘, q, DataSet, p);
[~, id] = sort(D);
Index = id(1 : K);

lp_norm.m  (此处使用了 Hamming distance, p = 2 时,可以调整为 l2 范式欧式距离)

%************   get the distance **********************
function distance = lp_norm(x0, x, p)
tem = repmat(x0, 1, size(x,2));
distance = sum((abs(tem - x) .^ p), 1) .^ (1/p);

lookup.m (LSH 查找)

function Index = lookup(T, q) % x can be removed
%========================================================
%************     参数解释:     ***********************
%************   T : 哈希表      ***********************
%************   x : 总数据集     **********************
%************   q: 查询
%
%========================================================

%========================================================
index = [];
% 可并行
for i = 1 : length(T)
    tem = getIndex(T(i), q);
    index = [index tem];
end
Index = unique(index);

getIndex.m

function tableiIndex = getIndex(T, x0)

M = length(T.hashTable2);
tableiIndex = [];

seq01_x = x0(:, T.I.d);
index_x = mod(sum(bsxfun(@times, seq01_x, T.randDigits),2), M) + 1;

if ~isempty(T.hashTable2{index_x})
    index_bucket = T.hashTable2{index_x};
    %******************************************
    %for i = 1 : length(index_bucket)
    %******************************************
    uni_index_bucket = index_bucket(find(all(bsxfun(@eq, seq01_x, T.buckets(index_bucket, :)), 2)));
    for i = 1 : length(uni_index_bucket)
        tableiIndex = [tableiIndex T.index{uni_index_bucket(i)}];
    end
end

Linear_Search.m (线性查找)

function Index = Linear_Search(q, K, DataSet, p)

D = feval(‘lp_norm‘, q, DataSet, p);
[~, id] = sort(D);
Index = id(1 : K);

(横轴为 K-NN 中 K 的值,纵轴为准确度)

相关截图:

Algorithm proposed from Papers :

(Indyk 1999) similarity search in hish dimensions via hashing.

(Indyk 2005) Locality-sensitive hashing scheme based on p-stable distributions.

实习日记:图像检索算法 LSH 的总结与分析(matlab)

时间: 2024-08-19 11:07:49

实习日记:图像检索算法 LSH 的总结与分析(matlab)的相关文章

实习日记:图像检索算法 LSH 的总结与分析

先贴上这两天刚出炉的C++代码.(利用 STL 偷了不少功夫,代码尚待优化) Head.h 1 #ifndef HEAD_H 2 #define HEAD_H 3 4 #include "D:\\LiYangGuang\\VSPRO\\MYLSH\\HashTable.h" 5 6 7 #include <iostream> 8 #include <fstream> 9 #include <time.h> 10 #include <cstdli

基于HSV分块颜色直方图的图像检索算法

引 言 随着多媒体技术及[nternet技术的迅速发展,各行各业对图像的使用越来越广泛,图像信息资源的管理和检索显得越来越重要.传统的通过手工标记和索引图像(即基于文本的图像检索)的方法已经不能满足人们的需求,随之而来的问题是:随着图像数据的剧增和人们对图像的理解具有不同的侧重点,不同的人从不同的角度对同一幅图像的认识可能存在很大的差异性,因此无法准确反映图像信息.基于内容的图像检索方法(Content-Based Image Retrieval,CBIR)由此应运而生. 在基于内容的图像检索中

Aho-Corasick算法的Java实现与分析

简介Aho-Corasick算法简称AC算法,通过将模式串预处理为确定有限状态自动机,扫描文本一遍就能结束.其复杂度为O(n),即与模式串的数量和长度无关.思想自动机按照文本字符顺序,接受字符,并发生状态转移.这些状态缓存了"按照字符转移成功(但不是模式串的结尾)"."按照字符转移成功(是模式串的结尾)"."按照字符转移失败"三种情况下的跳转与输出情况,因而降低了复杂度.基本构造AC算法中有三个核心函数,分别是:success; 成功转移到另一个

第2章 rsync算法原理和工作流程分析

本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是rsync系列篇: 1.rsync(一):基本命令和用法 2.rsync(二):inotify+rsync详细说明和sersync 3.rsync算法原理和工作流程分析 4.rsync技术报告(翻译) 5.rsync工作机制(翻译) 6.man rsync翻译(rsync命令中文手册) 本文目录: 1.1 需要解决的问题 1.2 rsync增量传输算法原理 1.3 通过示例分析r

OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 2013-03-23 17:44 16963人阅读 评论(28) 收藏 举报 分类: 机器视觉(34) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] KAZE系列笔记: OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 OpenCV学习笔记(28)KA

算法导论——lec 12 平摊分析与优先队列

在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出,反映在任何情况下(即最坏情况下),每个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方法.掌握了平摊分析的方法以后,我们就可以利用他来分析一些优先队列. 一. 平摊分析 [问题一]对作用于一个初始为空的栈上的n个PUSH.POP和MULTIPOP组成的序列进行分析. [问题二]考虑一个由0开始向上计数的k位二进制计数器.作用于一个初始为零的计数器上的n个INCREMENT操作的时间分析.

联合查找算法Union Find的一些分析

最近在学习Robert  Sedgewic,Kevin  Wayne的Algorithms第四版,谈谈有关并查集的概念. 首先,我们知道并查集是一种树型的数据结构,用于处理一些不相交集合,而最重要的就是联合查找算法,Union Find. 并查集的基本操作: makeSet(s):建立一个新的并查集,其中包含 s 个单元素集合. unionSet(x, y):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并. find(x):找到元素 x 所在的集合的

Bag of Features (BOF)图像检索算法

1.首先,我们用surf算法生成图像库中每幅图的特征点及描述符. 2.再用k-means算法对图像库中的特征点进行训练,生成类心. 3.生成每幅图像的BOF,具体方法为:判断图像的每个特征点与哪个类心最近,最近则放入该类心,最后将生成一列频数表,即初步的无权BOF. 4.通过tf-idf对频数表加上权重,生成最终的bof.(因为每个类心对图像的影响不同.比如超市里条形码中的第一位总是6,它对辨别产品毫无作用,因此权重要减小). 5.对query进来的图像也进行3.4步操作,生成一列query图的

华为实习日记——第六天

端午节过得好快,又要上班了. 昨晚上在寝室自己下载了objgraph,然后把安装包发送到公司邮箱,今早上去了之后把工具给配置好. 早上9:30晨会,安排今天的内容,我今天的任务是和师父一起处理内存泄漏这部分. 我们的模块要在Linux系统下运行,上午就在虚拟机里配置了Linux的环境,然后读源码.感觉压力好大,我是做算法和底层比较多,但是这次实习分配到了存储云,负责Linux下的Python模块开发,并且开发的流程里业务背景占的比重很大,所以要学的东西好多. 中午吃饭的时候同事们都在聊端午去哪里