Проблемы с производительностью при использовании детектора / дескриптора BRISK OpenCV
У меня возникают проблемы с производительностью, когда я использую BRISK для обнаружения и описания функций в OpenCV.
В основном я пытаюсь сопоставить все дескрипторы, которые я получаю из этого изображения:
против всех дескрипторов, которые я получаю из базы данных изображений, используя сопоставление по флангу с алгоритмом LSH и BRISK для обнаружения и описания функций.
Моя база изображений состоит из 242 изображений. На этих 242 изображениях есть три изображения, соответствующие каждому объекту, взятому отдельно в вышеупомянутом "сложном" запросе изображения.
Вот параметры, используемые для обнаружения BRISK (параметры opencv по умолчанию): Порог: 30, Октавы: 4, Масштаб паттерна: 1.0.
После сопоставления по флангу с использованием метода наилучшего совпадения (каждый дескриптор в запросе изображения связан с его ближайшей окрестностью в наборе дескрипторов базы данных), мой алгоритм выводит список изображений базы данных, отсортированный по проценту соответствия. Вот четыре первых результата:
- Изображение, соответствующее болту в базе данных: 4 совпадения / 15 обнаруженных ключевых точек => Соответствующий процент: 26,7%.
- Изображение, соответствующее бутылке в базе данных, имеет 4 совпадения / 15 обнаруженных ключевых точек => Процент совпадения: 26,7%.
- Изображение, соответствующее болту в базе данных, имеет 10 совпадений / 59 обнаруженных ключевых точек => Соответствующий процент: 16,9%.
- Изображение, соответствующее объекту, которого нет в запросе изображения: 1 совпадение / 16 обнаруженных ключевых точек => Соответствующий процент: 16,7%.
Я сравнил эти результаты, используя ORB в качестве функции обнаружения и описания. Вот используемые параметры: Количество функций: 2000, Коэффициент масштабирования: 1,2, Количество уровней пирамиды: 8.
Вот результаты, которые я получаю:
- Изображение, соответствующее болту в базе данных: 576 совпадений / 752 обнаруженных ключевых точек => Соответствующий процент: 76,6%.
- Изображение, соответствующее бутылке в базе данных, имеет 111 совпадений / 189 обнаруженных ключевых точек => Совпадающий процент: 58,7%.
- Изображение, соответствующее перу в базе данных, имеет 124 совпадения / 293 обнаруженных ключевых точки => процент совпадений: 42,3%.
- Изображение, соответствующее объекту, которого нет в запросе изображения: 2 совпадения / 66 обнаруженных ключевых точек => Соответствующий процент: 3%.
Как вы можете видеть, результаты намного лучше с ORB. Во-первых, в каждом изображении в базе данных обнаружено больше ключевых точек, и процент соответствия значительно выше для хороших объектов. Кроме того, разрыв между процентом соответствия для хороших объектов и процентом соответствия для неправильных объектов является более значительным.
Мне интересно, почему детектор BRISK обнаруживает гораздо меньше ключевых точек, чем детектор ORB. Я провел различные тесты, чтобы выяснить, как я могу обнаружить больше ключевых точек с помощью детектора BRISK (уменьшить порог, уменьшить число октав). Я действительно могу обнаружить немного больше ключевых точек, но разница с детектором ORB все еще действительно важна. Есть ли у вас идеи, почему детектор BRISK имеет такое поведение?
Моя версия OpenCV 2.4.8, но я попробовал часть обнаружения BRISK с 2.4.4 и версией 2.4.9 согласно этим утверждениям:
http://code.opencv.org/issues/2491 а детектор функций BRISK обнаруживает нулевые ключевые точки без улучшений.
Я также попытался объединить детектор ORB с описанием BRISK. Результаты сопоставления лучше, чем в первом методе (полный BRISK), но хуже, чем во втором (полный ORB):
- Изображение, соответствующее болту в базе данных: 529 совпадений / 708 обнаруженных ключевых точек => Соответствующий процент: 74,7%.
- Изображение, соответствующее бутылке в базе данных, имеет 69 совпадений / 134 обнаруженных ключевых точки => Процент совпадений: 51,5%.
- Изображение, соответствующее перу в базе данных, соответствует 93 / 247 обнаруженных ключевых точек => Соответствующий процент: 37,6%.
- Изображение, соответствующее объекту, которого нет в запросе изображения: 5 совпадений / 50 обнаруженных ключевых точек => Соответствующий процент: 10%.
Обратите внимание, что количество точек, обнаруженных на каждом изображении, не одинаково в методе 2 и методе 3. На самом деле, когда я запускаю этот код на тестовом изображении (здесь изображение болта):
// BRISK parameters
int Threshl=30;
int Octaves=4;
float PatternScales=1.0f;
// ORB parameters
int nFeatures=2000;
float scaleFactor=1.2f;
int nLevels=8;
BRISK BRISKD(Threshl, Octaves, PatternScales);
ORB ORBD(nFeatures, scaleFactor, nLevels);
vector<KeyPoint> kpts;
Mat descriptors;
Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE );
ORBD.detect(img,kpts); // Number of keypoints detected = 752
BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708
Кажется, что BRISK не вычисляет все обнаруженные ключевые точки в дескрипторах (752 ключевых точки, обнаруженных детектором ORB => 708 дескрипторов, вычисленных дескриптором BRISK).
Однако, даже если все ключевые точки, обнаруженные ORB, не вычисляются в дескрипторах BRISK. С этими результатами кажется, что BRISK не лучше описать ключевую точку, чем ORB? Поправьте меня, если я ошибаюсь, но я уверен, что должно быть наоборот...
Если у вас, ребята, есть какой-то элемент, который мог бы помочь мне понять мои результаты, или если у вас уже были некоторые проблемы с BRISK в OpenCV, пожалуйста, дайте мне знать. Любая помощь будет принята с благодарностью:).
1 ответ
Хорошо, я понял, как получить результаты, которые я ожидал от BRISK. Я попробовал код от создателя BRISK здесь: https://github.com/calihem/mavhub/tree/master/thirdparty
Вот результаты, которые я получаю:
- Изображение, соответствующее болту в базе данных: 149 совпадений / 288 обнаруженных ключевых точек => Соответствующий процент: 51,7%.
- Изображение, соответствующее бутылке в базе данных, имеет 27 совпадений / 57 обнаруженных ключевых точек => Процент совпадений: 47,4%.
- Изображение, соответствующее перу в базе данных, имеет 38 совпадений / 101 обнаруженных ключевых точек => Соответствующий процент: 37,6%.
- Изображение, соответствующее объекту, которого нет в запросе изображения: 5 совпадений / 76 обнаруженных ключевых точек => Соответствующий процент: 6,6%.
Эти результаты намного лучше, чем те, которые у меня были раньше. На самом деле они не лучше, чем те, которые получены с помощью ORB для этого конкретного изображения запроса. Однако я попробовал с другими изображениями запроса, особенно более сложными изображениями, и BRISK превосходит ORB.
Кажется, есть проблема с реализацией BRISK в opencv по крайней мере с версии 2.4.4 до текущей версии 2.4.9. Я думаю, что эта ошибка должна быть исправлена в ближайшее время, потому что она была сообщена сообществу opencv ( http://code.opencv.org/issues/2491).
Тем временем я рекомендую вам использовать код, написанный создателем BRISK, который хорошо работает;).