使用VLFeat库构建项目使用视觉词袋(BoVW)进行图像分类。 BoVW管道包括:
我可以将vl_sift
和vl_kmeans
用于(1)和(2),但我不知道如何构建直方图功能并在SVM中使用它们。
答案 0 :(得分:0)
鉴于你已经拥有"字典"来自vl_kmeans:
[centers] = vl_kmeans(data, numClusters);
为了构建图像I的直方图,您需要使用vl_sift获取该图像的128-D描述符:
[~,D] = vl_sift(I)
D的每一列是图像I中一个兴趣点(或帧)的描述符。现在,您需要根据D
和字典centers
构建I的直方图。最简单的方法是使用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中)足够清楚,可以解释算法。