我有一些数据,一个400k行的数组,每行有200个元素。
我正在尝试使用此数据来使用FLANN进行knn匹配。使用pyflann库,它只是一组C ++代码的绑定,我获得了出色的性能。构建索引只需要很少的时间,然后一旦构建索引,knn搜索的速度和准确性就太棒了。
这是用于使用python构建和查询索引的代码:
import pyflann
flann = pyflann.FLANN()
# data is np.array(400000, 200), dtype = np.float32, rows are L2-normed
flann.build_index(data, algorithm="kmeans", branching=32, iterations=7, checks=16)
ind = 100
k = 5
vector = data[ind, :].reshape(1, 200)
t0 = time.time()
D, I = flann.nn_index(vector, k, algorithm="kmeans", branching=32, iterations=7, checks=16)
t1 = time.time()
t = t1 - t0
通常情况下,索引的构建时间约为20秒,结果D, I
的计算时间小于0.001秒。
我正在尝试使用C ++实现相同的性能。特别是我使用的是与opencv捆绑在一起的FLANN版本。
我已经将pyflann中的默认参数值复制到索引参数中,并尝试设置kmeans,但是性能很差,我通常不得不在几分钟后终止索引过程。
cvflann::IndexParams getParams(){
cvflann::IndexParams indexParams;
indexParams["algorithm"] = cvflann::FLANN_INDEX_KMEANS;
//branching=32, iterations=7, checks=16
indexParams["branching"] = 32;
indexParams["iterations"] = 7;
indexParams["checks"] = 16;
indexParams["eps"] = 0.0;
indexParams["cb_index"] = 0.5;
indexParams["trees"] = 1;
indexParams["leaf_max_size"] = 4;
indexParams["centers_init"] = cvflann::FLANN_CENTERS_RANDOM;
indexParams["target_precision"] = 0.9;
indexParams["build_weight"] = 0.01;
indexParams["memory_weight"] = 0.0;
indexParams["sample_fraction"] = 0.1;
indexParams["log_level"] = "warning";
indexParams["random_seed"] = -1;
return indexParams;
}
cvflann::Matrix dataset(this->data[0], 400000, 200);
cvflann::IndexParams ip = getParams();
index = new cvflann::Index >(dataset, ip);
index->buildIndex(); //hangs
有什么我想念的吗?为什么这里的表现会有这样的差异?任何建议都会得到很好的接受。
编辑:
编译器:
g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin17.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
除了pkg-config --cflags opencv
和pkg-config --libs opencv
以及-std=c++11
提供的标记外,没有其他标记。
OpenCV版本号为3.4.1。