vlfeat 中的 phow_caltech101 演示应用程序为 Caltech101 数据集上的图像分类创建了一个完整的 Bag of Words 过程,大致如下:
- 特征提取
- 视觉词汇建设
- 空间直方图计算
- 支持向量机训练
- SVM 测试和评估,
获得一个模型,该模型可用于以后对新的未分类实例进行分类。直方图计算的唯一问题是空间直方图,这意味着如果我有一个大小为 n 的视觉词汇表,我会期望直方图的大小为 nx (size_collection),其中包含每个训练实例中每个视觉单词的出现次数。
然而,空间直方图根据指定的模型存储在一个结构中,默认情况下它有两个空间参数,spatialX 和 spatialY,这会产生一个大小为 spatialX * spatialY * (size_vocabulary) 的结构,该结构后来被归一化,这是用于训练 SVM 的那个。
现在,如果我想使用正常直方图,无论是否归一化,但是直方图给我每张图像的视觉词 1-1 对应关系,或者从空间直方图中获取此信息,该怎么办?此外,当我描绘词袋过程时,使用空间直方图而不是我考虑的经典直方图效率高多少?
任何帮助表示赞赏。
更新:
这是计算直方图的代码的一部分,您可以看到如何以大小为直方图 (spatialX * spatialY * number_visual_words) 而不是以直方图向量结束 (number_visual_words) 结束。让我澄清一下,在这种情况下,模型被定义为具有 spatialX = [2 4] 和 spatialY = [2 4]。
for i = 1:length(model.numSpatialX)
binsx = vl_binsearch(linspace(1,width,model.numSpatialX(i)+1), frames(1,:)) ;
binsy = vl_binsearch(linspace(1,height,model.numSpatialY(i)+1), frames(2,:)) ;
% combined quantization
bins = sub2ind([model.numSpatialY(i), model.numSpatialX(i), numWords], ...
binsy,binsx,binsa) ;
hist = zeros(model.numSpatialY(i) * model.numSpatialX(i) * numWords, 1) ;
hist = vl_binsum(hist, ones(size(bins)), bins) ;
hists{i} = single(hist / sum(hist)) ;
end
hist = cat(1,hists{:}) ;
hist = hist / sum(hist) ;
部分问题是我也没有使用空间直方图,所以我不确定它们比“正常”直方图好多少。也许以前使用过这种直方图的人可以提供更有用的见解。