1、文章简介
名称:Iterative Quantization:A Procrustean Approach to Learning Binary Codes
这篇文章发表与2011年CVRP(Computer Vision & Pattern Recognition),作者:Yunchao Gong
这篇文章的主要思路是先对原始空间的数据集 用PCA进行降维处理,设经过PCA降维后的数据集为 ,该问题就可以转化为将该数据集中的数据点映射到一个二进制超立方体的顶点上,使得对应的量化误差最小,从而而已得到对应该数据集优良的二进制编码。
2、论文介绍
Related works:
1、Approximate Nearest Neighbor Search
方法总体上来说有O(logn)O(logn)和O(n)O(n)两种复杂度。第一种复杂度专注于一些数据结构,比如树;第二种是让暴力方法更加高效。第一种的例子是kd-tree,第二种是LSH。
2、Similarity Preserving Binary Codes
相似度保存的二值编码,主要有一下三步:
1. Projection learning, or finding a linear or nonlinear projection of the data;(映射数据)
2. Binary thresholding, or quantizing continuous projected data to binary vectors;(量化映射后的数据到二值向量)
3. Similarity computation, or finding distances between query and database points.(相似度计算)
3、 ITQ
主要思路:先对原始空间的数据集X∈Rn∗dX∈Rn∗d用PCA进行降维处理,设经过PCA降维后的数据集为V∈Rn∗cV∈Rn∗c,该问题就可以转化为将该数据集中的数据点映射到一个二进制超立方体的顶点上,使得对应的量化误差最小,从而得到对应该数据集优良的二进制编码。
设v∈Rcv∈Rc为原特征空间中某一数据点经过PCA降维后的表示形式,对应在超立方体中的顶点用sgn(v)∈{−1,1}c来表示,要使量化误差最小,即v∈Rc与sgn(v)∈{−1,1}c的欧式距离最小,即min||sgn(v)−v)||2,对于所有的数据点进行二进制编码后用B表示,PCA降维后V=X∗W,对整个数据集为min||B−V||2 。由于对矩阵进行旋转可以降低量化误差,如下图示:
从图1可以看出,对投影后的矩阵V进行随机旋转后,量化误差降低至0.93,对于找到的最优的旋转矩阵,量化误差降低至0.88(矩阵与正交矩阵相乘实际上就是对矩阵做旋转)。基于这样一个事实,考虑将投影后的数据集V进行旋转变换,min||B−V||^2便变换为min||B−VR||^2,R∈R^c∗c为旋转矩阵,正交。整个问题域就变成了min||B−VR||^2的优化问题,即找出最优的旋转矩阵R和与之对应的编码B。
该式的优化可以采用交替迭代的求解方法:先生成随机矩阵并对其进行SVD分解得到对应的正交矩阵作为R的初始值,然后固定R求B, B=sgn(V×D)(注意这里截距 b=0 ,因为在原空间已对数据中心化,非常重要),B求出来再通过对 B×V进行SVD更新R,交替迭代若干次即可,文中选用的是50次。
通过上面过程便可经过PCA降维后的数据完成编码过程,后面的相似性采用汉明距离进行度量,这里不赘述。
总结一下,整个过程可以概括为:先对数据集进行PCA降维,然后寻找量化误差最小的旋转矩阵即可得到对应该最优旋转矩阵下的特征向量的二进制编码。
4、详细介绍:
二值量化
假设第二步求得降维矩阵维W,然后将数据映射到了空间中的一个一个点,现在就是要将空间中的点映射到一个边长为1的超立方体中,以原点为空心,方方正正的放在空间中的超立方体是二值码的(为方面记这个超立方体为Q0)。但如果我们对数据进行一个旋转再映射到这个空间中,会得到更小的量化误差。这个想法类似于如果我们只是要将数据映射到边长为1的立方体中,而不需要固定超立方体的具体位置,这就等同于对数据进行旋转,再映射到以Q0。
降维后的数据:V=XW,旋转后的数据:VR (R是旋转矩阵,必须是c*c维的正交矩阵)最小化映射误差:
等价于
问题等价于最大化:
但是这里R也是未知的,B也是未知的,对于求解这样的为题,我们使用迭代求解的方法,固定一个,优化另一个
求解这个问题分两步:
(1) 固定R,求解B
由于R是正交矩阵,作者使用随机初始化R为正交矩阵。随机的方法:R = randn(bit,bit); // 随机生成一个矩阵[U11 S2 V2] = svd(R); //对矩阵做SVD分解,U和V都是正交矩阵R = U11(:,1:bit); //选取U作为随机初始化的正交矩阵R,R固定了,求解B相当简单。最大化
因为这里B的元素只有1和-1(因为是二值码,作者用-1表示0,这样只是为了求解问题简单),所以
B =sgn(V R)。
(2) 固定B,求解R
这是一个线性代数的问题orthogonal Procrustes problem。这个为题的原型是对A做一个正交投影,于B尽量相似:
所以本文中,
文章迭代求解50步,即可得到最后二值码的编码方式。
求得B,R之后,整体的编码方式是:
BincodeXtrainingITQ =compactbit(bsxfun(@minus, Xtraining, sample_mean) * eigVec * R > 0);
Matlab源代码:Yunchao Gong Homepage上公开了源码,不过并未提供数据库,直接运行不了,我已经对源码进行了modify,有需要的可以看LSH、ITQ、SKLSH图像检索实验实现(Code)这篇文章,在这篇文章中提供了modified后的代码,也可以直接到 Github: https://github.com/willard-yuan/ITQ_ImageRetrieval 主页上下载modified后的代码。
Matlab源代码:Yunchao Gong Homepage上公开源代码:
function ITQparam = trainITQ(X, ITQparam)
% Input:
% X: n * d, n is the number of images
% ITQparam:
% ITQparam.pcaW---PCA of all the database
% ITQparam.nbits---encoding length
%
% Output:
% ITQparam:
% ITQparam.pcaW---PCA of all the database
% ITQparam.nbits---encoding length
% ITQparam.r---ITQ rotation projection
pc = ITQparam.pcaW; % W
nbits = ITQparam.nbits; % c
V = X * pc; % V
% initialize with a orthogonal random rotation
R = randn(nbits, nbits);
% R-orthogonal
[U11 S2 V2] = svd(R);
R = U11(:, 1: nbits);
% ITQ to find optimal rotation
for iter = 0 : 50
Z = V * R;
% calculate B = UX
UX = ones(size(Z, 1), size(Z, 2)) .* -1;
UX(Z >= 0) = 1;
% B' * V
C = UX' * V;
[UB, sigma, UA] = svd(C);
R = UA * UB';
%fprintf('iteration %d has finished\r',iter);
end
% make B binary
%B = UX;
%B(B<0) = 0;
ITQparam.r = R;
PCA-ITQ检索实例实验主要代码:
见博文 [3]
第1幅是查询图像,后面129是从59k的database里检索出来的相似的图像。
引用:
[1]. Yunchao Gong and S. Lazebnik. Iterative Quantization: A Procrustean Approach to Learning Binary Codes. In: IEEE International Conference on Computer Vision and Pattern Recognition (CVPR), 2011
[2].参考博客:https://blog.csdn.net/le_le_name/article/details/51615915?locationNum=2
[3].推荐博客:https://www.cnblogs.com/keanuyaoo/p/3331267.html