pyflann代码比C ++ FLANN快得多

时间:2018-06-11 18:28:32

标签: python c++ opencv flann

我有一些数据,一个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 opencvpkg-config --libs opencv以及-std=c++11提供的标记外,没有其他标记。

OpenCV版本号为3.4.1。

0 个答案:

没有答案