请注意,在撰写本文时,我将参考最新的 FLANN 版本,即flann-1.8.3。
对于 LSH 方法,它们表示一个对象(搜索空间中的点),
作为一个无符号整数数组
不:这是错误的。 LshIndex 类包括一个实现 LSH 索引的 buildIndexImpl 方法。由于 LSH 基本上是哈希表的集合,因此有效的索引发生在 LshTable 类上。
基本索引方法,即一次索引一个特征向量(又名描述符或点)的方法是:
/** Add a feature to the table
* @param value the value to store for that feature
* @param feature the feature itself
*/
void add(unsigned int value, const ElementType* feature) {...}
注意:buildIndexImpl 方法使用的替代版本只是简单地迭代特征,并在每个特征上调用上述方法。
如您所见,此方法有 2 个参数,它们是一对 (ID, descriptor):
-
value 即unsigned int 表示特征向量唯一数字标识符(又名特征索引)
-
feature 代表特征向量本身
如果您查看实现,您可以看到第一步包括对描述符值进行哈希处理以获得相关的桶键(= 指向将存储此描述符 ID 的桶的槽的标识符):
BucketKey key = getKey(feature);
实际上,getKey 散列函数仅为二进制描述符实现,即可以表示为 unsigned char 数组的描述符:
// Specialization for unsigned char
template<>
inline size_t LshTable<unsigned char>::getKey(const unsigned char* feature) const {...}
可能是因为 LSH 用于二进制特征?
是的:如上所述,FLANN LSH 实现适用于二进制描述符的Hamming space。
如果您要使用具有实值的描述符(在R**d 中),您应该参考original paper,其中包含有关如何将特征向量转换为二进制字符串以便使用汉明空间和哈希函数的详细信息。
有人可以分享更多关于 unsigned int 的可能用途吗?
案子?如果每个功能只需要 0 和 1,为什么要使用 unsigned int?
见上图:unsigned int值仅用于存储每个特征向量的相关ID。