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

article/2025/5/14 7:10:11

转载:http://www.yuanyong.org/cv/itq-hashing.html

CVPR 2011《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》论文阅读笔记。

 

看过的文章,不做记录,即便当时理解透了,过一段时间后,知识总会模糊不清。所以从现在开始,对一些自己阅读过的一些精彩的文章,悉心记录,方便自己查阅温故,当然如果对同行有所裨益的话,亦是一件开心的事。
好了,回归正题。这篇文章发表在2011年CVRP上,一作是Yunchao Gong,师从Sanjiv Kumar,关于Sanjiv Kumar可以到她的HomePage上了解。

 

这篇文章的主要思路是先对原始空间的数据集  XRn×d  用PCA进行降维处理,设经过PCA降维后的数据集为  VRn×c  ,该问题就可以转化为将该数据集中的数据点映射到一个二进制超立方体的顶点上,使得对应的量化误差最小,从而而已得到对应该数据集优良的二进制编码。

 

对于PCA降维部分,不做详解,具体可以参阅该文[1]。设  vRc  为原特征空间中某一数据点经过PCA降维后的表示形式,对应在超立方体中的顶点用  sgn(v){1,1}c  来表示,要使量化误差最小,即  vRc  与  sgn(v){1,1}c 的欧式距离最小,即  min||sgn(v)v)||2  ,对于所有的数据点进行二进制编码后用B表示,PCA降维后  V=X×W ,对整个数据集为  min||BV||2  。由于对矩阵进行旋转可以降低量化误差,如下图示:


从图1可以看出,对投影后的矩阵V进行随机旋转后,量化误差降低至0.93,对于找到的最优的旋转矩阵,量化误差降低至0.88(矩阵与正交矩阵相乘实际上就是对矩阵做旋转)。基于这样一个事实,考虑将投影后的数据集V进行旋转变换,  min||BV||2  便变换为  min||BVR||2  ,R为旋转矩阵。整个问题域就变成了  min||BVR||2  的优化问题,即找出最优的旋转矩阵R和与之对应的编码B。该式的优化可以采用交替跌倒的求解方法:先生成随机矩阵并对其进行SVD分解得到对应的正交矩阵作为R的初始值,然后固定R求B,  B=sgn(V×D)  (注意这里截距  b=0  ,因为在原空间已对数据中心化,非常重要),B求出来再通过对  B×V  进行SVD更新R,交替迭代若干次即可,文中选用的是50次。

 

通过上面过程便可经过PCA降维后的数据完成编码过程,后面的相似性采用汉明距离进行度量,这里不赘述。

 

总结一下,整个过程可以概括为:先对数据集进行PCA降维,然后寻找量化误差最小的旋转矩阵即可得到对应该最优旋转矩阵下的特征向量的二进制编码。

 

论文给出了检索飞机的一个实例效果:


Matlab源代码:Yunchao Gong Homepage上公开了源码,不过并提供数据库,直接运行不了,我已经对源码进行了modify,有需要的可以看LSH、ITQ、SKLSH图像检索实验实现(Code)这篇文章,在这篇文章中提供了modified后的代码,也可以直接到我的GitHub主页上下载modified后的代码。

 

Github: https://github.com/willard-yuan/ITQ_ImageRetrieval

[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.



http://chatgpt.dhexx.cn/article/6dmov4ul.shtml

相关文章

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

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

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

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

mysql中如何查看表是否被锁

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

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

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

MATLAB离散点边界曲线的绘制

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

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

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

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

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

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

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

Matlab画图和点标记

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

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

matlab绘制三维点云和点云凸包 效果展示 1.在matlab命令窗口输入guide打开matlab的ui开发界面,按照下图的样式绘制界面。 2. 在GUIDE中鼠标右键点击选择素材文件夹按键,选择查看回调=>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制作高分辨率点线图

相较于其他软件,MATLAB在图片制作上上手难度较高,但其强大的代码功能使得处理出来的图片更加漂亮。直接附代码和效果图! 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%% 测试数据,第一列代表纬度,第二列经度,第三列则是点的值 txt [46.75296619 -69.1022775 0.31290975246.80735808 -69.06131914 0.39115348546.68438136 -68.40644856 -0.52491718547.68233472 -6…

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

前言: 一些博客就是转了Matlab 的中文说明,可是他那个说明,他自己都说了不是很对。 本文从实践出发,详细介绍Matlab对 坐标空间的点和向量的绘制方法。 1 点的概念和画法: 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…

Mysql5 实现交叉表查询

交叉表、行列转换和交叉查询经典 一、什么是交叉表 “交叉表”对象是一个网格&#xff0c;用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成&#xff1a; 行 列 摘要字段 “交叉表”中的行沿水平方向延…