原文来自我的独立blog:http://www.yuanyong.org/blog/cv/lsh-itq-sklsh-compliment
这两天寻找idea,想来思去也没想到好点的方法,于是把前段时间下过来的一篇《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》和代码拿出来又细读了一番,希望可以从中获得点启发。
Iterative Quantization: A Procrustean Approach to Learning Binary Codes的Project请戳这里,一作是Yunchao Gong,师从Svetlana Lazebnik,第一次听说Svetlana Lazebnik是一次在提取图像特征时立超师兄说可以用Spatial Pyramid特征,说Svetlana Lazebnik自信得直接是”Beyond Bags of Features: ……”(超越BOW),然后下去看了一下大牛的homePage,所以对Svetlana Lazebnik有些印象。扯远了,回归正题。代码下载下来后,发觉paper里做好的数据库并没提供,有需要请戳这里下载:代码与数据库。解压文件,比较重要的有三个,cca.m、ITQ.m、RF_train.m、recall_precision.m。
实验评价方案recall_precision.m跟我之前用过的一个评价方案不同,花了大半个下午,85%的弄明白了这个recall_precision.m评价方案。先理理一下已经完全整明白了的LSH吧。

表1
表1是对不同编码方法的说明,从表中可以看出LSH的哈希函数是 sgn(wTx+b) 。实际上,对于采用哈希方法做检索,分两个阶段:(1). 投影阶段(Projection Stage); (2). 量化阶段(Quantization Stage)。LSH投影矩阵(即哈希系列函数)是随机产生的。Matlab中生成投影矩阵为: w=randn(size(X,2), bit), X∈Rn×d ,bit是编码位数, g1↔w1=w(:,1) , g2↔w2=w(:,2) ,···, gn↔wn=w(:,L) 。对于 xx ,通过 w 投影后经过阈值化(量化)后映射到哈希桶中。
1. 对于原空间数据,对于进行中心化(centre the data)后在量化阶段阈值变为0,整个压缩编码的代码为:
1 |
XX = XX * randn(size(XX,2),bit); |
3 |
Y(XX>=0)=1; %原数据中心化后,阈值设为0。大于0编码为1,小于0编码为0 |
4 |
Y = compactbit(Y); %将二进制用十进制表示 |
表1中对于LSH的投影过程(Projection)是数据独立(data-independent),对于data-independent,[2]中指出”Generally,data-independent methods need longer codes than data-dependent methods to achieve satisfactory performance”,即要获得比数据非独立方法一样满意的表现,数据独立方法需要更长的编码。
1 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
2 |
Function: this is a geometric illustration of Draw the recall precision curve |
3 |
%Author: Willard (Yuan Yong' English Name)%Date: 2013-07-22 |
4 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
8 |
load cifar_10yunchao.mat; |
12 |
%Get the recall & precision |
13 |
[recall{1,1}, precision{1,1}] = test(X, 16, 'LSH'); |
14 |
[recall{1,2}, precision{1,2}] = test(X, 24, 'LSH'); |
15 |
[recall{1,3}, precision{1,3}] = test(X, 32, 'LSH'); |
16 |
[recall{1,4}, precision{1,4}] = test(X, 64, 'LSH'); |
17 |
[recall{1,5}, precision{1,5}] = test(X, 128, 'LSH'); |
20 |
figure; hold on;grid on; |
21 |
plot(recall{1, 1}, precision{1, 1},'g-^','linewidth',2); |
22 |
plot(recall{1, 2}, precision{1, 2},'b-s','linewidth',2); |
23 |
plot(recall{1, 3}, precision{1, 3},'k-p','linewidth',2); |
24 |
plot(recall{1, 4}, precision{1, 4},'m-d','linewidth',2); |
25 |
plot(recall{1, 5}, precision{1, 5},'r-o','linewidth',2); |
28 |
legend('LSH-16 bit','LSH-24 bit','LSH-32 bit','LSH-64 bit','LSH-128 bit','Location','NorthEast'); |

图1
从图1可以看出,PCA-ITQ比PCA-RR、LSH、SKLSH表现性能要佳。ITQ的代码还在分析中,希望可以从中获得点启示。
2. PCA-ITQ, PCA-RR, LSH, SKLSH对比实验
1 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
2 |
% Function: this is a geometric illustration of Draw the recall precision curve |
3 |
%Author: Willard (Yuan Yong' English Name) |
5 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
10 |
load cifar_10yunchao.mat; |
15 |
%Get the recall & precision |
16 |
[recall{1,1}, precision{1,1}] = test(X, bit, 'ITQ'); |
17 |
[recall{1,2}, precision{1,2}] = test(X, bit, 'RR'); |
18 |
[recall{1,3}, precision{1,3}] = test(X, bit, 'LSH'); |
19 |
[recall{1,4}, precision{1,4}] = test(X, bit, 'SKLSH'); |
22 |
figure; hold on;grid on; |
23 |
plot(recall{1, 1}, precision{1, 1},'r-o','linewidth',2); |
24 |
plot(recall{1, 2}, precision{1, 2},'b-s','linewidth',2); |
25 |
plot(recall{1, 3}, precision{1, 3},'k-p','linewidth',2); |
26 |
plot(recall{1, 4}, precision{1, 4},'m-d','linewidth',2); |
27 |
plot(recall{1, 5}, precision{1, 5},'g-^','linewidth',2); |
28 |
xlabel('Recall');ylabel('Precision');legend('PCA-ITQ','PCA-RR','LSH','SKLSH','Location','NorthEast'); |
图2
3. PCA-ITQ检索实例实验主要代码:
1 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
2 |
% Function: this is a PCA-ITQ demo showing the retrieval sample |
3 |
%Author: Willard (Yuan Yong' English Name) |
5 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
12 |
averageNumberNeighbors = 50; % ground truth is 50 nearest neighbor |
13 |
num_test = 1000; % 1000 query test point, rest are database |
14 |
load cifar_10yunchao.mat; |
15 |
[ndata, D] = size(cifar10); |
16 |
Xtraining= double(cifar10(1:59000,1:end-1)); |
17 |
Xtest = double(cifar10(59001:60000,1:end-1)); |
18 |
num_training = size(Xtraining,1); |
20 |
% generate training ans test split and the data matrix |
21 |
XX = [Xtraining; Xtest]; |
22 |
% center the data, VERY IMPORTANT |
23 |
sampleMean = mean(XX,1); |
24 |
XX = (double(XX)-repmat(sampleMean,size(XX,1),1)); |
27 |
[pc, l] = eigs(cov(XX(1:num_training,:)),bit); |
31 |
[Y, R] = ITQ(XX(1:num_training,:),50); |
37 |
% compute Hamming metric and compute recall precision |
38 |
B1 = Y(1:size(Xtraining,1),:); %编码后的训练样本 |
39 |
B2 = Y(size(Xtraining,1)+1:end,:);%编码后的测试样本 |
40 |
Dhamm = hammingDist(B2, B1); |
41 |
[foo, Rank] = sort(Dhamm, 2,'ascend'); %foo为汉明距离按每行由小到大排序 |
43 |
% show retrieval images |
44 |
load cifar-10-batches-mat/data_batch_1.mat; |
48 |
load cifar-10-batches-mat/data_batch_2.mat; |
52 |
load cifar-10-batches-mat/data_batch_3.mat; |
56 |
load cifar-10-batches-mat/data_batch_4.mat; |
60 |
load cifar-10-batches-mat/data_batch_5.mat; |
64 |
load cifar-10-batches-mat/test_batch.mat; |
68 |
database=[data1 labels1 ;data2 labels2;data3 labels3;data4 labels4;data5 labels5;data6 labels6]; |
69 |
cifar10labels=[labels1;labels2;labels3;labels4;labels5;labels6]; |
70 |
%save('./data/cifar10labels.mat','cifar10labels'); |
71 |
%index=[50001,Rank(1,1:129)]'; P001是猫 |
72 |
%index=[50002,Rank(2,1:129)]'; P002是船 |
73 |
%index=[59004,Rank(4,1:129)]'; Y004是猫 |
74 |
%index=[59005,Rank(5,1:129)]'; %马 |
75 |
%index=[59006,Rank(6,1:129)]'; %狗 |
76 |
%index=[59018,Rank(18,1:129)]'; % 飞机 |
77 |
index=[59018,Rank(18,1:129)]'; % 飞机 |
78 |
%index=[50007,Rank(7,1:129)]'; P007是automobile |
85 |
% show the retrieved images |
88 |
image1r=database(j,1:1024); |
89 |
image1g=database(j,1025:2048); |
90 |
image1b=database(j,2049:end-1); |
91 |
image1rr=reshape(image1r,32,32); |
92 |
image1gg=reshape(image1g,32,32); |
93 |
image1bb=reshape(image1b,32,32); |
94 |
image1(:,:,1)=image1rr'; |
95 |
image1(:,:,2)=image1gg'; |
96 |
image1(:,:,3)=image1bb'; |
99 |
hdl1=subplot(10,13,rank,'position',[left+0.07*(mod(rank,13)-1) botton-0.09*fix(rank/13) width height]); |
102 |
hdl1=subplot(10,13,rank,'position',[left+0.07*12 botton-0.09*fix(rank/14) width height]); |
第1幅是查询图像,后面129是从59k的database里检索出来的相似的图像。

enjoy yourself~
- Google Chrome 源码下载地址 (Google Chrome Source Code Download)
1. Google Chrome 源码 SVN 地址:http://src.chromium.org/svn.包含有 Chrome.Gears.Webkit.GCC 等源码以及编译依赖工具.Chrom ...
- 各个版本spring的jar包以及源码下载地址
各个版本spring的jar包以及源码下载地址,目前最高版本到spring4.1.2,留存备用: http://maven.springframework.org/release/org/spring ...
- Cytoscape源码下载地址和编译办法
开发环境:Windows2008 R2 64位+Jdk1.7+Maven3.2.3 前提条件:安装好JDK1.7到C:\Program Files\Java\jdk1.7.0_67,下载好Maven并 ...
- 最新git源码下载地址
1.最新git源码下载地址: https://github.com/git/git/releases https://www.kernel.org/pub/software/scm/git/ 可以手动 ...
- android Activity实现底部滑动弹出窗口及源码下载地址
在做微信.微博.qq等分享时,一般是点击分享按钮后会从底部弹出滑动窗口,然后选择要分享的社交平台进行分享.今日头条.腾讯新闻等内容App的评论也是从底部滑动弹出输入窗口,进行评论输入的.本篇文章就讲讲 ...
- linux2.4.0源码下载地址(配合毛德操情景分析)
https://www.kernel.org/pub/linux/kernel/v2.4/
- MyBatis、Spring、SpringMVC 源码下载地址
MyBatis.Spring.SpringMVC 源码下载地址 github mybatis https://github.com/fengyu415/MyBatis-Learn.git spring ...
- 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...
- JavaWeb宿舍管理系统(附 演示、源码下载地址)
宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志. 本篇文章将带你从运行环境搭建.系统设计. ...
随机推荐
- swing的第一课
Swing介绍 Swing API 可扩展 GUI组件,以减轻开发者的生活创造基于JAVA前端/GUI应用.它是建立在AWT API之上,并作为 AWTAPI 的更换,因为它几乎每一个控制对应 AWT ...
- Contains Duplicate 解答
Question Given an array of integers, find if the array contains any duplicates. Your function should ...
- Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...
- PHP Database ODBC 之 ODBC
ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库). 创建 ODBC ...
- 给Visual Studio更替皮肤和背景图
给Visual Studio更换皮肤和背景图 1.先安装更换皮肤的插件 VS菜单栏里面找到:工具>扩展和更新>联机>搜索: Theme Editor 下载并安装: 安装后先不着 ...
- HttpURLConnection访问url的工具类
java代码: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; ...
- RMAN数据库恢复 之归档模式有(无)备份-丢失数据文件的恢复
1.归档模式有备份,丢失数据文件的恢复归档模式有备份,不管丢失什么数据文件,直接在RMAN下RESTOER--->RECOVER--->OPEN即可. RMAN> STARUP MO ...
- App Store不能下载一直等待中的两种解决办法
1,重启手机,之后确认是否得到改善 2,重启不行,更改WiFi的dns为114.114.114.114或者223.5.5.5 或 223.6.6.6,再重启手机 ps:我是第二种方法
- cc1plus: fatal error: emeralddb-pmdMain.d: No such file or directory
签名autoscan, aclocal, config啥的都没错,最后make 报下面的错,查了各个文件没发现有啥问题,请哪位帮忙卡看 make[1]: Entering directory `/ro ...
- DWZ在APS.NET WebForm中的使用(二)
任何框架由于个人理解不到位或者框架自身的局限性,在项目实施中,大家或多或少都会遇到一些问题,下面我就讲述下我在使用DWZ开发过程中的几个问题.如有一点能帮助到你,这篇文章也算有存在的意义了. 1.树菜 ...