ADC方法(asymmetric distance computation)

《Aggregating local descriptors into a compact image representation》论文笔记

提取到VLAD特征后,要先用PCA降维,然后再用ADC方法对每一幅图像建立索引,这里先介绍ADC方法。

ADC方法是对图片库中,除query vector x之外的所有图的vector Y=y1,y2...yn,做kmeans产生k个聚类中心,用log2kbit编码这k个center的ID,ci=q(yi),比如k=16,yi属于c8,那么用4bit编码yi:q(yi)=0100

找到离x最近的a个邻居NNa(x)也就是计算如下问题:

NNa(x)=a?argmini||x?q(yi)||2.(2)

然而这里存在的问题是,k必须是一个较小的值,这样会导致信息损失较严重,因为上百万个图,最后只对应到了16种编码,搜索精度会很低。如果想用64bit编码,k=264,聚类中心的个数太多,kmeans计算代价很大。所以这里参考论文《Product quantization for nearest neighbor search》中的方法,对ADC方法做优化。

这种方法是把vector y划分成m个子向量,如果y长度为D,那么每个子向量长度:D/m,定义product quantizer:

q(x)=(q1(x1),q2(x2)...qm(xm)).(3)

也就是对每个子向量做上述的ADC编码。把Y=y1,y2...yn各自的第j个子向量拿出来yj1,yj2...yjn,用kmeans把他们聚为ks类,这个ks是一个固定的值,所以每个子向量被编码成log2ksbit。

此时(2)式中的距离计算就成了如下形式:

||x?q(yi)||2=∑j=1...m||x2?qj(yji)||2.(4)

在search之前,我们可以提前计算出一个lookup table保存子向量xj分别到ks个聚类中心的距离,生成lookup table的复杂度为O(D?ks),当ks<<n时,这个值相比于(2)式的复杂度O(D*n)是可以忽略不计的。

根据这个编码,可以对yi做分解:

yi=q(yi)+εq(yi).(5)

其中εq(yi)是指这次编码所造成的损失(quantization loss)。

这样,ADC就把一个vector编码成B bit,B=mlog2ks.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 02:41:50

ADC方法(asymmetric distance computation)的相关文章

HAL驱动库学习-ADC

如何使用ADC驱动库 1  实现如下两个函数 a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断 b:HAL_ADC_MspDeInit() 与 HAL_ADC_MspInit()作用相反,用来关闭ADC,可选 DMA,中断 2  配置ADC参数,详细参数描述参考ADC属性定义.通过HAL_ADC_Init()来加载参数 3  配置ADC通道,包括使用的通道,采样时间等 HAL_ADC_ConfigChannel() 4

C++ STL 迭代器方法 之 advance与prev 方法 浅析

[摘要] 迭代器是STL中重要的一支,prev和distance是其基本方法.distance方法十分简单,就不在此赘述,现主要对prev方法以及其相关方法--advance方法作简要介绍与使用说明,并在文末附上代码示例. [Advance 方法] Advance iterator Advances the iterator it by n element positions. If it is a random-access iterator, the function uses just o

gopl 方法和接口

方法声明 写一个简单的方法: type Point struct{X, Y float64} // 普通的函数 func Distance(p, q Point) float64 { return math.Hypot(q.X-p.X, q.Y-p.Y) } // 同样的作用,用方法实现 func (p Point) Distance(q Point) float64 { return math.Hypot(q.X-p.X, q.Y-p.Y) } 接收者:附加的参数 p 称为方法的接收者. 调用

Pyboard基本功能---ADC模数转换/DAC数模转换

ADC模数转换 1.获取ADC类里面的方法 >>> help(pyb.ADC) object <class 'ADC'> is of type type read -- <function> read_timed -- <function> read_timed_multi -- <staticmethod> >>> ADC (模拟信号转换为数字量)是嵌入式中最常用的功能之一,在MicroPython 同样也提供了相应的函

Spark MLlib KMeans聚类算法

1.1 KMeans聚类算法 1.1.1 基础理论 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇心的移动距离小于某个给定的值. K-Means聚类算法主要分为三个步骤: (1)第一步是为待聚类的点寻找聚类中心: (2)第二步是计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去: (3)第三步是计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心: 反复执行(

Awesome Machine Learning

Awesome Machine Learning  A curated list of awesome machine learning frameworks, libraries and software (by language). Inspired by awesome-php. If you want to contribute to this list (please do), send me a pull request or contact me @josephmisiti Als

算法-转

常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++) { if(arr[i]==arr[j]) { ++i; } } newArray.push(arr[i]); } return newArray; } var arr=new Array(&

Computer Graphics Research Software

Helping you avoid re-inventing the wheel since 2009! Last updated December 5, 2012.Try searching this page for keywords like 'segmentation' or 'PLY'.If you would like to contribute links, please e-mail them to [email protected]. Papers & Archives Gra

数据挖掘(二)——knn算法的java实现

1.K-近邻算法(Knn) 其原理为在一个样本空间中,有一些已知分类的样本,当出现一个未知分类的样本,则根据距离这个未知样本最近的k个样本来决定. 举例:爱情电影和动作电影,它们中都存在吻戏和动作,出现一个未知分类的电影,将根据以吻戏数量和动作数量建立的坐标系中距离未知分类所在点的最近的k个点来决定. 2.算法实现步骤 (1)计算所有点距离未知点的欧式距离 (2)对所有点进行排序 (3)找到距离未知点最近的k个点 (4)计算这k个点所在分类出现的频率 (5)选择频率最大的分类即为未知点的分类 3