2015-06-09 3 views
2

В настоящее время я работаю над проблемой классификации объектов. Моя цель - использовать дескрипторы SURF для обучения искусственной нейронной сети на основе MLP в opencv и создания модели для классификации объектов. До сих пор я достиг следующего:Как выбрать хорошие ключевые точки функции SURF?

Я вычислительное SURF ключевых точек, используя следующий код:

vector<KeyPoint> computeSURFKeypoints(Mat image) { 
    SurfFeatureDetector surfdetector(400, 4, 2, true, false); 
    vector<KeyPoint> keypoints; 
    surfdetector.detect(image, keypoints); 
    return keypoints; 
} 

Я вычислить прибой дескрипторы над этими ключевыми точками, используя следующий код:

Mat computeSURFDescriptors(Mat image, vector<KeyPoint> keypoints) { 
    SurfDescriptorExtractor extractor; 
    Mat descriptors; 
    extractor.compute(image, keypoints, descriptors); 
    return descriptors; 
} 

Проблема, с которой я сталкиваюсь, заключается в том, что размер дескриптора варьируется от изображения к изображению. Дескриптор содержит 64 элемента ДЛЯ КАЖДОЙ ФУНКЦИИ. Для обучения нейронной сети я хочу, чтобы размер дескриптора был исправлен. Для этого я использую ППШ, чтобы уменьшить размер дескриптора следующим образом:

Mat projection_result; 
PCA pca(descriptors, Mat(), CV_PCA_DATA_AS_COL, 64); 
pca.project(descriptors,projection_result); 
return projection_result; 

При этом, я могу уменьшить размеры дескриптора, но выбранные характерные точки не являются репрезентативными изображения и они приводят в плохих результатах сопоставления. Как уменьшить размер дескриптора, сохранив хорошие точки функции? Любая помощь будет оценена.

+0

Вы говорите »... размер дескриптора варьируется от изображения к изображению. Дескриптор содержит 64 элемента ДЛЯ КАЖДОЙ ФУНКЦИОНАЛЬНОЙ ТОЧКИ " , который не имеет смысла. SURF дескриптор - 64 или 128 элементов. Вы отметили расширенный флаг True, поэтому вы должны получить 128 элементов. Думаю, вы говорите о разных функциях? –

+1

описание ** количество ** меняется от изображения к изображению (не размер). Чтобы преодолеть это, обычно применяется кластеризация Bag-of-Words (и вы в конечном итоге подаете фиксированный N-мерный вектор, содержащий расстояния до вашего словаря в ваш мл) – berak

+0

@berak: Не могли бы вы рассказать?Может быть, ответ на ваши мысли? – Bhoot

ответ

0

Я искал что-то совсем другое, поэтому никакого эксперта, но я знаю, что у Matlab есть функция «points.selectstrongest (x)», были x - количество очков, которые вы хотите. Функция выбирает точки с самой сильной метрикой.

Метрика - это свойство, присвоенное SURFpoints функцией Matlab 'detectSURFFeatures'. I Метрика дается в «detectSURFFeatures» функцией OpenCV «vision.internal.buildable.fastHessianDetectorBuildable.fastHessianDetector_uint8»

+0

извините, но дело не только в matlab – berak

+0

также, opencv не имеет функции под названием «vision.internal.buildable.fastHessianDetectorBuildable.fastHessianDetector_uint8' – berak

0

Вы можете использовать значение ответа каждой ключевой точки, возвращенной при обнаружении функции. Сортировка ключевых точек в соответствии с их значением ответа должна быть способом, но я никогда не тестировал это.

См: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/types.hpp#L697

0

Предполагая, что вы говорите о другом количестве ключевых точек в каждом изображении (а не разной длины дескриптора). Не имеет большого значения, что количество ключевых точек будет одинаковым, это не соединение «один-к-одному». Итак, я не знаю, в чем заключается идея создания PCA, в каждом изображении вы получите разные результаты.

Есть несколько других распространенных способов проверки соответствия функций, см. Feature matching. Баснически они проверяют расстояние между векторами дескрипторов.

Я думаю, что вы пытаетесь сделать что-то немного по-другому, чем особенности согласования, поэтому я предлагаю смотреть на object detection

Смежные вопросы