在图像检索和近似最近邻搜索(ANN)领域,哈希方法是一种高效的技术,它可以将高维特征向量映射到低维的二进制汉明空间中,从而大幅降低存储成本并加速查询过程。常见的基准数据集如SIFT(128维局部特征)和GIST(960维或更高全局特征),通常以fvecs格式存储,这些数据集广泛用于评估各种哈希算法的性能。
今天,我想分享一个用Matlab编写的实用脚本,这个脚本可以自动化地在多个数据集上运行多种经典哈希方法,生成不同码长的二进制哈希码,并将这些码打包成每32位一个uint32的紧凑二进制文件。这种格式特别适合后续的汉明距离计算或导入到ANN基准工具中进行评估。
脚本的核心功能
这个脚本的设计思路非常清晰:通过三层嵌套循环,遍历数据集、哈希方法和码长,依次完成以下步骤:
加载数据集:使用
fvecs_read函数读取训练集(base.fvecs)和查询集(query.fvecs)。这些文件是标准的ANN基准格式,每向量前4字节是维度int32,后跟float32分量。读取后转置成样本数 × 维度 的矩阵。训练和压缩生成哈希码:利用动态eval调用对应方法的
_learn和_compress函数。例如,对于LSH方法,会调用LSH_learn和LSH_compress。这些函数通常是已实现的哈希学习模块,返回二进制矩阵trainB和testB(值为0/1或-1/+1,根据方法而定),以及训练和测试耗时。