Как да изберем добри ключови точки за SURF функция?

В момента работя върху проблем с класификацията на обекти. Моята цел е да използвам SURF дескрипторите за обучение на базирана на MLP изкуствена невронна мрежа в opencv и генериране на модел за класификация на обекти. До момента съм постигнал следното:

Изчислявам SURF ключови точки, като използвам следния код:

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

Изчислявам SURF дескрипторите върху тези ключови точки, като използвам следния код:

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

Проблемът, с който се сблъсквам, е, че размерът на дескриптора варира от изображение на изображение. Дескрипторът съдържа 64 елемента ЗА ВСЯКА ХАРАКТЕРИСТИКА. За целите на обучението на невронната мрежа искам размерът на дескриптора да бъде фиксиран. За това използвам PCA, за да намаля размера на дескриптора, както следва:

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

Правейки това, мога да намаля размерите на дескриптора, но избраните характерни точки не са представителни за изображението и водят до лоши резултати за съвпадение. Как мога да намаля измерението на дескриптора, като запазя добри характеристики? Всяка помощ ще бъде оценена.


person Bhoot    schedule 09.06.2015    source източник
comment
Вие казвате ... размерът на дескриптора варира от изображение на изображение. Дескрипторът съдържа 64 елемента ЗА ВСЯКА ХАРАКТЕРИСТИКА, което няма смисъл. Дескрипторът за сърфиране е 64 или 128 елемента. Маркирахте разширения флаг True, така че трябва да получите 128 елемента. Предполагам, че говорите за различен брой функции?   -  person Elad Joseph    schedule 11.12.2015
comment
дескрипторът брой варира от изображение до изображение (не размерът). за да се преодолее това, обикновено се прилага групиране на Bag-of-Words (и в крайна сметка подавате фиксиран, N-dim вектор, съдържащ разстоянията до вашия речник във вашия ml)   -  person berak    schedule 11.12.2015
comment
@berak: Бихте ли разяснили, моля? Може би публикувайте отговор с вашите мисли?   -  person Bhoot    schedule 11.12.2015
comment
напр. погледнете тук   -  person berak    schedule 11.12.2015


Отговори (3)


Търсех нещо съвсем друго, така че не съм експерт, но случайно знам, че Matlab има функция „points.selectstrongest(x)“, когато x е количеството точки, което искате. Функцията избира точките с най-силен показател.

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

person RikH    schedule 27.06.2015
comment
съжалявам, но не става дума за matlab - person berak; 27.06.2015
comment
освен това opencv няма функция, наречена vision.internal.buildable.fastHessianDetectorBuildable.fastHessianDetector_uint8 - person berak; 27.06.2015

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

Вижте: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/types.hpp#L697

person saurabheights    schedule 11.12.2015

Ако приемем, че говорите за различен брой ключови точки във всяко изображение (а не за различна дължина на дескриптора). Няма много смисъл броят на ключовите точки да е еднакъв, това не е връзка едно към едно. Така че, не знам каква е идеята зад правенето на PCA, във всяко изображение ще получите различни резултати.

Има някои други обичайни начини за проверка на съответствието на характеристиките, вижте Съвпадение на функции. По принцип те проверяват разстоянието между векторите на дескрипторите.

Мисля, че се опитвате да направите нещо малко по-различно от съвпадението на функции, така че бих ви предложил да погледнете откриване на обект

person Elad Joseph    schedule 11.12.2015