Как кластеризовать извлеченные дескрипторы SIFT. Целью кластеризации является использование ее для целей классификации.
Кластеризация SIFT, преобразующая функции просеивания (128-мерный вектор) в словарь
Ответы (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);
Чтобы сгруппировать, преобразуйте размерность 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)
обычно kmeans применяется для получения k центров, вы можете преобразовать каждое изображение в вектор K (каждое измерение представляет, сколько патчей в этом кластере).