我正在使用VLFeat库使用 Bag-of-Visual-Words (BoVW) 构建项目图像分类。BoVW 管道包括:
- 筛
- k-均值
- 构建直方图
- 支持向量机分类
我可以将vl_sift
andvl_kmeans
用于 (1) 和 (2),但我不知道如何构建直方图特征并在 SVM 中使用它们。
我正在使用VLFeat库使用 Bag-of-Visual-Words (BoVW) 构建项目图像分类。BoVW 管道包括:
我可以将vl_sift
andvl_kmeans
用于 (1) 和 (2),但我不知道如何构建直方图特征并在 SVM 中使用它们。
鉴于您已经拥有来自 vl_kmeans 的“字典”:
[centers] = vl_kmeans(data, numClusters);
为了构建图像 I 的直方图,您需要使用 vl_sift 获取该图像的 128-D 描述符:
[~,D] = vl_sift(I)
D 的每一列是图像 I 中一个兴趣点(或帧)的描述符。现在您需要根据D
和字典构建 I 的直方图centers
。最简单的方法是使用 for 循环:
H = zeros(1,numClusters);
for i=1:size(D,2)
[~, k] = min(vl_alldist(D(:,i), centers)) ;
H(k) = H(k) + 1;
end
现在,在将直方图 H 传递给 SVM 之前,由您决定是否对其进行归一化。请注意,可能有一种更快的方法来构建不需要循环的直方图;但我认为我的代码(在 Matlab 中)足以解释算法。