Getting started with VLAD

xiaoxiao2021-02-27  259

本篇博客介绍了如何使用C API计算一副图像的VLAD,更多细节请看http://www.vlfeat.org/api/vlad-fundamentals.html(VLAD的定义和计算)

函数vl_vlad_encode能够获得一系列的VLAD特征,数据类型可以是float或者double。它需要一个视觉词典,比如说从K-means聚类中得到的,进一步,词典元素的特征分配必须是预处理的,比如通过KD-trees和forests。

void vl_vlad_encode(void *  enc,  vl_type  dataType,  void const *  means,  vl_size  dimension,  vl_size  numClusters,  void const *  data,  vl_size  numData,  void const *  assignments,  int  flags  )   Parameters encoutput VLAD encoding (out). dataTypethe type of the input data (VL_TYPE_DOUBLE or VL_TYPE_FLOAT). numDatanumber of data vectors to encode. meanscluster means. numClustersnumber of clusters. datathe data vectors to encode. dimensiondimensionality of the data. assignmentsdata to cluster soft assignments. flagsoptions. 在后面的例子中,词典时首先通过Kmeans聚类产生的,然后是点被分配到它的相关临近的词典中, 替代了原始的VLAD特征。最后编码存储在enc变量中。

vl_uint32 * indexes; float * assignments; float * enc int i; // create a KMeans object and run clustering to get vocabulary words (centers) kmeans = vl_kmeans_new (VLDistanceL2, VL_TYPE_FLOAT) ; vl_kmeans_cluster (kmeans, data, dimension, numData, numCenters) ; // find nearest cliuster centers for the data that should be encoded indexes = vl_malloc( sizeof( vl_uint32) * numDataToEncode); vl_kmeans_quantize(kmeans,indexes,dataToEncode,numDataToEncode); // convert indexes array to assignments array, // which can be processed by vl_vlad_encode assignments = vl_malloc( sizeof( float) * numDataToEncode * numCenters); memset(assignments, 0, sizeof( float) * numDataToEncode * numCenters); for(i = 0; i < numDataToEncode; i++)  { assignments[i * numCenters + indexes[i]] = 1.; } // allocate space for vlad encoding enc = vl_malloc( sizeof(TYPE) * dimension * numCenters); // do the encoding job vl_vlad_encode (enc, VL_F_TYPE, vl_kmeans_get_centers(kmeans), dimension, numCenters, data, numData, assignments, 0) ;

转载请注明原文地址: https://www.6miu.com/read-3846.html

最新回复(0)