SIFT聚类将筛选特征(128维向量)转换为词汇表

时间:2014-02-27 08:04:47

标签: opencv image-processing classification sift

如何聚类提取的SIFT描述符。进行聚类的目的是将其用于分类目的。

3 个答案:

答案 0 :(得分:2)

<强>方法

  • 首先为每个图像/对象计算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);    
    

答案 1 :(得分:1)

要聚类,将N * 128维度(N是每个图像的描述符数)转换为M * 128维度的数组(来自所有图像的M个描述符)。并对此数据执行集群。

例如:

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)

答案 2 :(得分:-1)

通常kmeans用于获取k个中心,您可以将每个图像更改为K的向量(每个维度代表该群集中有多少个补丁)。