SIFT cluster de conversão de sift recursos (128 vetor tridimensional) em um vocabulário
-
23-12-2019 - |
Pergunta
Como cluster extraídos descritores SIFT.O objetivo de fazer de clusters é usá-lo para a classificação finalidade.
Solução 2
Para cluster , converter N*128 dimensão(N é o número de descritor de cada imagem) em uma matriz de M*128 dimensão (M número de descritor de todas as imagens).e executar cluster de dados.
por exemplo:
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)
Outras dicas
Abordagem:
Primeiro de tudo, calcular o
SIFT descriptor
para cada imagem/objeto e, em seguida,push_back
que o descritor em uma única imagem (permite chamado de imagemMat featuresUnclustered
).Depois que sua tarefa é a de cluster de todos os descritor em algumas número de grupos (clusters que é decidido por você).Que vai ser o tamanho do seu vocabulário/dicionário.
int dictionarySize=200;
E, finalmente, vem a etapa de agrupamento-los
//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);
geralmente kmleans é aplicado para obter centros k, você pode alterar cada imagem em umvetor do k (cada dimensão representa quantos patch nesse cluster).