ITQ(Iterative Quantization)图像检索算法

article/2025/5/14 7:31:26

开发十年,就只剩下这套Java开发体系了 >>>   hot3.png

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 projectionpc = ITQparam.pcaW;     % W
nbits = ITQparam.nbits; % cV = 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 : 50Z = V * R;% calculate B = UXUX = ones(size(Z, 1), size(Z, 2)) .* -1;UX(Z >= 0) = 1;% B' * VC = 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

 

 

 

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/54K2jxpR.shtml

相关文章

ITQ(Iterative Quantization)迭代量化方法详解

转载&#xff1a;http://www.yuanyong.org/cv/itq-hashing.html CVPR 2011《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》论文阅读笔记。 看过的文章&#xff0c;不做记录&#xff0c;即便当时理解透了&#xff0c;过一段时间后&#xff0c;知识…

怎么查看mysql是否锁表_MySQL查看是否锁表

MySQL查看是否锁表的方法:首先进入命令窗口;然后通过执行命令“show engine innodb status\G;”查看造成死锁的sql语句,并分析索引情况即可。 可直接在mysql命令行执行:show engine innodb status\G; 查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlis…

mysql 查询 锁表_怎么查找mysql中的锁表语句?

查看sql server数据库被锁表可以用用如下语句&#xff1a; 也可以用如下语句: 拓展资料: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表&#xff0c;但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SEL…

mysql中如何查看表是否被锁

https://blog.csdn.net/love666666shen/article/details/122419330 如何查看是否发生死锁 在使用mysql的时候&#xff0c;如何查看表是否被锁呢&#xff1f; 查看表被锁状态和结束死锁步骤&#xff1a; 1.在mysql命令行执行sql语句 use dbName; // 切换到具体数据库 show …

matlab画六面体,MATLAB绘制平行六面体

如果给出一个平行六面体(甚至其他多面体)的各个顶点坐标,如何画出这个平行六面体。 在网上找了找方法,可以参考这篇博客 matlab中patch函数详解。然后我具体查看了 Multifaceted Patches 帮助,记录下来以备后查。 绘制主要就是利用 patch 函数,patch 的一般调用格式为patch…

MATLAB离散点边界曲线的绘制

一大堆离散点有时候需要绘制边缘点&#xff0c;这时候可以用到boundary函数&#xff0c;这是MATLAB的自带函数&#xff0c;用机械臂的工作空间为例绘制边界曲线图&#xff1a; %建立机器人模型 % theta d a alpha offset L1Link([0 0 …

利用Matlab绘制两个点电荷电场线【物理软件课程设计】

物理软件课程设计 2021年6月的课程设计题目之一&#xff1a;设计程序&#xff0c;画出两个点电荷之间电场线分布图 入门级别&#xff0c;代码思想可能有点像C语言&#xff0c;本人应用物理学专业。 资源链接&#xff1a;(4条消息) 利用MATLAB绘制点两个电荷电场线-C文档类资…

matlab描点写函数,matlab描点并标上点的序号

使用Kinect一帧可以获取构成人脸的121个点&#xff0c;每个点对应一个序号&#xff0c;其中121个点中有20个点描绘的唇部的点&#xff0c;但我们只能看出有20个点对应嘴唇&#xff0c;并不知道这20个点的序号&#xff0c;所以需要使用matlab建模并找出这20点对应的序号。 程序如…

matlab画三维散点图,调节点大小和图案

找了老半天的三维散点图&#xff0c;都没有。后来给我摸清楚了。 你随便画个三维散点&#xff0c;用scatter3 这个函数画。注意&#xff0c;plot是二维的 plot调节大小是 markersize 这个参数&#xff0c;但是三维没有。 可以画出图形后&#xff0c;用matlab自带的图形编辑器&…

Matlab画图和点标记

从csv中导出数据&#xff0c;然后需要在MATLAB图中进行标记个别点&#xff0c;但是利用MTALB自身标记的比较丑&#xff0c;因此搜了一下别的方法&#xff0c;具体效果如下&#xff0c;其中的*可以改成O或者其他的自定义的符号&#xff1a; 具体的主要代码如下&#xff1a; fi…

matlab绘制三维点云和点云凸包

matlab绘制三维点云和点云凸包 效果展示 1.在matlab命令窗口输入guide打开matlab的ui开发界面&#xff0c;按照下图的样式绘制界面。 2. 在GUIDE中鼠标右键点击选择素材文件夹按键&#xff0c;选择查看回调&#xff1d;&#xff1e;callback编辑回调函数。 function pushbutto…

matlab 绘制孤立点

绘制孤立点 clc,clear; X[1,3,5,6]; Y[3,4,1,5]; nlength(X); hold on for i1:nplot(X(i),Y(i),c*); endresult

Matlab制作高分辨率点线图

相较于其他软件&#xff0c;MATLAB在图片制作上上手难度较高&#xff0c;但其强大的代码功能使得处理出来的图片更加漂亮。直接附代码和效果图&#xff01; x[100 125 150 175 200]; %定义x轴的坐标 sign["1#",2#,3#,4#,5#,Ave];[num,txt,raw]xlsread(D:\wudi\postg…

MATLAB 绘制点的地理空间分布,并用点的颜色或大小代表数值

%% 修改日期 2021/12/8clc clear close all%% 测试数据&#xff0c;第一列代表纬度&#xff0c;第二列经度&#xff0c;第三列则是点的值 txt [46.75296619 -69.1022775 0.31290975246.80735808 -69.06131914 0.39115348546.68438136 -68.40644856 -0.52491718547.68233472 -6…

Matlab 绘制 - 点和向量:向量加减的方法和源码

前言&#xff1a; 一些博客就是转了Matlab 的中文说明&#xff0c;可是他那个说明&#xff0c;他自己都说了不是很对。 本文从实践出发&#xff0c;详细介绍Matlab对 坐标空间的点和向量的绘制方法。 1 点的概念和画法&#xff1a; 1.1 一个平面上的点 plot(2, 3, ., MarkerS…

oracle一基础查询:单表,多表查询(交叉,内联,外联),分组聚合,子查询语法。

摘要&#xff1a;条件查询&#xff0c;别名&#xff0c;排序&#xff0c;聚合函数&#xff0c;where&#xff0c;having&#xff0c;联接查询&#xff0c;where in/exists/><子查询&#xff0c;&#xff0c;rownum伪列&#xff0c;模糊查询。 查询所有信息 select *from…

wps交叉表_使用WPS图表功能中的堆叠条形图制作日程交叉图

微软的项目&#xff0c;作为一个老式的项目管理软件&#xff0c;被许多朋友在工作中使用。它的功能相对完善&#xff0c;与微软的sharepoint服务器相结合&#xff0c;功能非常强大。一般来说&#xff0c;我们很少使用微软项目的所有功能。毕竟&#xff0c;与中国人的使用习惯还…

sql 交叉查询

日常开发中遇到多表查询时&#xff0c;首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等&#xff0c;但是这两种查询有时候不能满足需求。比如&#xff0c;左表一条关联右表多条记录时&#xff0c;我需要控制右表的某一条或多条记录跟左表匹配。貌似&#xff0c;INNER JOIN 或 L…

交叉表和透视表

交叉表: 用于计算一列数据对于另一列数据的分组个数&#xff08;用于统计分组频率的特殊透视表&#xff09; pd.crosstab(value1,value2)透视表&#xff1a;将原有的dataframe的列分别作为行索引和列索引&#xff0c;然后对指定的列应用聚集函数 data.pivot_table() 探究股票的…

【交叉表查询】行列转换的魅力

本文主要是讲一下行列转换&#xff0c;也就是大家经常讲的交叉表查询。 行列转换在实际的应用中非常的实用&#xff0c;可以大大的减少工作量。 很多时候&#xff0c;在Excel中处理数据时&#xff0c;我们需要统计每个月的销量或者需要填写每个月的销量&#xff0c;如下图 &a…