У меня есть некоторые данные, массив из 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.