код pyflann намного быстрее чем C ++ FLANN - PullRequest
0 голосов
/ 11 июня 2018

У меня есть некоторые данные, массив из 400 тыс. Строк, в каждой строке по 200 элементов.

Я пытаюсь использовать эти данные для сопоставления с помощью FLANN.Используя библиотеку 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 ++.В частности, я использую версию FLANN в комплекте с opencv.

Я скопировал значения параметров по умолчанию из 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.

...