Кластеризация SIFT, преобразующая функции просеивания (128-мерный вектор) в словарь

Как кластеризовать извлеченные дескрипторы SIFT. Целью кластеризации является использование ее для целей классификации.


person madan ram    schedule 27.02.2014    source источник


Ответы (3)


Подход:

  • Прежде всего, вычислите SIFT descriptor для каждого изображения/объекта, а затем push_back этого дескриптора в одно изображение (давайте назовем это изображение Mat featuresUnclustered).

  • После этого ваша задача состоит в том, чтобы сгруппировать весь дескриптор в некоторое количество групп/кластеров (которое решаете вы). Это будет размер вашего словаря/словаря.

    int dictionarySize=200;

  • И затем, наконец, наступает этап их кластеризации.

    //define Term Criteria
    TermCriteria tc(CV_TERMCRIT_ITER,100,0.001);
    
    //retries number
    int retries=1;
    
    //necessary flags
    int flags=KMEANS_PP_CENTERS;
    
    //Create the BoW (or BoF) trainer
    BOWKMeansTrainer bowTrainer(dictionarySize,tc,retries,flags);
    
    //cluster the feature vectors
    Mat dictionary=bowTrainer.cluster(featuresUnclustered);    
    
person skm    schedule 27.02.2014
comment
хорошо, как представить дескриптор для кластеризации, я знаю дескриптор как функцию 128. так как их представлять - person madan ram; 27.02.2014
comment
для одного объекта/изображения вы получите один дескриптор, который представляет собой не что иное, как изображение с одной строкой и 128 столбцами. Итак, если вы используете 50 изображений, то у вас будет 50 таких изображений (т.е. с одной строкой и 128 столбцами). Теперь вы помещаете все эти строки в одно изображение, которое имеет Unclustered` в моем примере выше. - person skm; 27.02.2014

Чтобы сгруппировать, преобразуйте размерность N * 128 (N — количество дескрипторов для каждого изображения) в массив размерности M * 128 (количество дескрипторов M для всех изображений). и выполнить кластеризацию этих данных.

eg:

def dict2numpy(dict):
    nkeys = len(dict)
    array = zeros((nkeys * PRE_ALLOCATION_BUFFER, 128))
    pivot = 0
    for key in dict.keys():
        value = dict[key]
        nelements = value.shape[0]
        while pivot + nelements > array.shape[0]:
            padding = zeros_like(array)
            array = vstack((array, padding))
        array[pivot:pivot + nelements] = value
        pivot += nelements
    array = resize(array, (pivot, 128))
    return array

all_features_array = dict2numpy(all_features)
nfeatures = all_features_array.shape[0]
nclusters = 100
codebook, distortion = vq.kmeans(all_features_array,
                                         nclusters)
person madan ram    schedule 01.03.2014

обычно kmeans применяется для получения k центров, вы можете преобразовать каждое изображение в вектор K (каждое измерение представляет, сколько патчей в этом кластере).

person michaeltang    schedule 27.02.2014