利用Matlab自带的bagOfFeatures函数抽取图像的SURF+BOW特征(以Office-Home数据集为例)

前言

最近在做有关迁移学习的实验时需要对Office-Home数据集进行SURF+BOW特征的抽取,遂查找了一下相关博客,发现Matlab自身集成了bagOfFeatures函数,可以十分方便地进行特征抽取,因此决定将其过程记录一下,希望可以帮助到以后遇到同样问题的小伙伴~
P.S. 此博客不对SURF+BOW特征进行讲解,如需了解具体过程请自行搜索其他博客进行学习。

1、下载Office-Home数据集(此处可以换成任何你的数据集):[下载链接](https://drive.google.com/file/d/0B81rNlvomiwed0V1YUxQdC1uOTg/view

)

2、Office-Home数据集的目录格式如下图所示(只要满足此类目录结构的所有数据均可按照下面的方法进行特征提取)。

利用Matlab自带的bagOfFeatures函数抽取图像的SURF+BOW特征(以Office-Home数据集为例)_第1张图片
Office-Home数据集目录格式图

3、以Art子目录为例,接下来的任务需要将Art目录下的所有图像的SURF+BOW特征提取出来,在OfficeHomeDataset_10072016目录下新建featureExtracted.m文件,写入以下代码:

clear all;
clc;
%------------------------------------------%
setDir_Art = fullfile('Art');
%------------------------------------------%
imgSets_Art = imageSet(setDir_Art, 'recursive');
%------------------------------------------%
bag = bagOfFeatures(imgSets_Art, 'VocabularySize', 800); % construct a 800-dimension codebook
%------------------------------------------%
fts_Art = encode(bag, imgSets_Art);
labels_Art = zeros(size(fts_Art,2),1);
%------------------------------------------%
idx_Art = 1;
for i = 1:length(imgSets_Art)     % length(imgSets_Art)为总共类别的个数
    classNumbers_Art = imgSets_Art(i).Count;
    labels(idx_Art:idx_Art+classNumbers_Art-1) = ones(classNumbers_Art,1)*i;
    idx_Art = idx_Art+classNumbers_Art;
%------------------------------------------%
save('Art_Surf.mat','fts_Art','labels_Art');  % 将提取的特征与类标保存成一个MAT文件进行存储

4、运行上述代码结束,便可以成功抽取出Art目录下所有图像的SURF+BOW特征,其余目录下的特征同理可得。

P.S. 如果大家只是提取特征,下面的注意事项可忽略。同构迁移学习中一般是要求所有领域(Art,Clipart,Product, Real World)的图像使用同一个bag进行编码,这里我是采用‘bag = bagOfFeatures(imgSets_Art, 'VocabularySize', 800);’作为公共的bag对图像进行特征提取,原因在于所有领域的图像按照一个bag进行特征提取,那么所有图像每一维特征的含义便是相同的,否则便会有差异

参考贴

[1] bagOfFeatures - MathWorks
[2] Image Category Classification Using Bag of Features

你可能感兴趣的:(利用Matlab自带的bagOfFeatures函数抽取图像的SURF+BOW特征(以Office-Home数据集为例))