Caltech是常用的图像识别数据库之一,加州理工有一个在Caltech上的图像检索工具包image-search ,提供了很多图像检索需要的功能,其中包括基于BOW的图像检索。该工具包的使用有一定难度,并且涉及函数很多。在Matlab2016中也有Caltech101的图像分类和识别程序,代码数量很少。

	% 数据库下载地址,第一次执行需要联网下载
	url ='http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz';
	outputFolder = fullfile(tempdir, 'caltech101'); 
	if ~exist(outputFolder, 'dir') % download only once
		disp('Downloading 126MB Caltech101 data set...');
		untar(url, outputFolder);
	end
	rootFolder = fullfile(outputFolder, '101_ObjectCategories');
	%为加快速度只取三类图像
	imgSets = [ imageSet(fullfile(rootFolder, 'airplanes')), ...
							imageSet(fullfile(rootFolder, 'ferry')), ...
							imageSet(fullfile(rootFolder, 'laptop')) ];
	%取各类图像数目最小值
	minSetCount = min([imgSets.Count]); 
	%图像集分割
	[trainingSets, validationSets] = partition(imgSets, 0.3, 'randomize');

	bag = bagOfFeatures(trainingSets);
	img = read(imgSets(1), 1);
	%使用图像词包(bag)对每幅图像进行编码,得出一个定长的向量
	featureVector = encode(bag, img);

	figure;
	%图像向量分布图
	bar(featureVector);
	title('Visual word occurrences');
	xlabel('Visual word index');
	ylabel('Frequency of occurrence');
	%训练图像类别分类器
	categoryClassifier = trainImageCategoryClassifier(trainingSets, bag);
	%计算训练集上的混淆矩阵
	confMatrix = evaluate(categoryClassifier, trainingSets);
	confMatrix = evaluate(categoryClassifier, validationSets);

	% 计算平均准确度
	mean(diag(confMatrix));
	img = imread(fullfile(rootFolder, 'airplanes', 'image_0690.jpg'));
	%对指定图像进行识别
	[labelIdx, scores] = predict(categoryClassifier, img);

该示例关键代码也只有几行,除了计算图象集词包,还利用encode函数对图像编码,生成了特征向量,也有人叫做视觉向量。该示例中,仅画出了视觉向量的分布图,没有它用。事实上,该向量可作为图像特征进一步完成图像检索、分类、识别等任务,相比直接使用提取词袋的局部特征,可大大减少计算复杂度和内存消耗。