本篇博客介绍了如何使用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
-
enc output VLAD encoding (out). dataType the type of the input data (VL_TYPE_DOUBLE or VL_TYPE_FLOAT). numData number of data vectors to encode. means cluster means. numClusters number of clusters. data the data vectors to encode. dimension dimensionality of the data. assignments data to cluster soft assignments. flags options.
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
vl_kmeans_quantize(kmeans,indexes,dataToEncode,numDataToEncode);
// convert indexes array to assignments array,
// which can be processed by vl_vlad_encode
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) ;