Я хочу сопоставить набор двоичных дескрипторов (данные запроса) с большим набором двоичных дескрипторов (данные поезда).
Соответствие должно быть сделано быстро. Я решил попробовать FlannBasedMatcher OpenCv. Matcher поддерживает различные Алгоритмы. Для двоичных дескрипторов реализован Multi-Probe LSH.
FlannBasedMatcher matcher (new flann::LshIndexParams(12,10,2));
std::vector<DMatch> matches;
matcher.knnMatch(query, train, matches, 2);
(Я пробовал разные настройки LshIndexParams)
Проблема в том, что сопоставление Flann с LSH очень медленное по сравнению с сопоставлением BruteForce или по сравнению с сопоставлением Flann с KDTreeIndexParams с использованием дескрипторов с плавающей точкой.
Также похоже, что некоторые другие испытали ту же проблему (см. 1, 2).
В одном из ответов предлагается попробовать иерархическую кластеризацию.
Это должно быть быстрее, чем LSH.
Я хотел бы использовать тот же интерфейс FlannBasedMatcher, что и с LSH.
FlannBasedMatcher matcher (new flann::HierarchicalClusteringIndexParams());
std::vector<DMatch> matches;
matcher.knnMatch(query, train, matches, 2);
Однако это не работает с двоичными дескрипторами (см. Сообщение об ошибке):
OpenCV Error: Unsupported format or combination of formats
Но «сырой» интерфейс иерархической кластеризации поддерживает несколько типов расстояний, и есть возможность выбрать расстояние Хемминга.
cv::flann::Index tree(train, cv::flann::HierarchicalClusteringIndexParams(), FLANN_DIST_HAMMING);
cv::Mat indices, dists;
tree.knnSearch(query, indices, dists, 2, cv::flann::SearchParams());
Мои вопросы:
flann::HierarchicalClusteringIndexParams()
с расстоянием Хэмминга? Я хотел бы использовать интерфейс FlannBasedMatcher.Задача ещё не решена.
Других решений пока нет …