如何聚类提取的SIFT描述符。进行聚类的目的是将其用于分类目的。
答案 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的向量(每个维度代表该群集中有多少个补丁)。