您的位置:首页 > 其它

CS143-project3 基于bag of words 的场景识别 Scene Recognition with Bag of Words

2016-12-28 11:23 309 查看
本项目实现两种不同的图像表示——小图像和SIFT特征包,以及两种不同的分类技术——最近邻和线性SVM。通过试验得到准确率是
小图像和最近邻分类器 (准确率20.50%).
SIFT表示包和最近邻分类器 (准确率49.99%).
SIFT表示包和线性SVM分类器 (准确率68.10%).
 以下通过4个方面进行详细说明:
小图像特征.
最近邻分类器.
SIFT表示包.
SVM分类器
 
系统环境:

操作系统:WIN7

实现平台:MATLAB2014a

 

一.小图像特征表示

小图像表示法比较简单,对图像进行抽样,使图像缩小至16*16的大小。

代码如下:

N = size(image_paths,1); 

image_feats = [];

for i = 1:N 

  path = image_paths{i,1};

  image = imread(path);

  %image = rgb2gray(single(image)/255); %转换为灰度图像

  image = imresize(image,[16,16]); %转换为16*16的大小

  image = reshape(image, 1, 256); %转换为1*256的大小

  image_feats = cat(1,image_feats,image);

end


二.最近邻分类器

KNN近邻分类器是一种有监督的分类算法。此项目中,测试图像直接在训练图像集中寻找距离最短的图像,将本测试图像的类别就分为此距离最短的训练图像的类别

实现起来也很简单,以下是代码:

predicted_categories = [];

D = vl_alldist2(test_image_feats',train_image_feats'); %行转换为列进行距离计算256列

[Y,I] = min(D); %最小距离的计算

predicted_categories = train_labels(I); %返回最近邻(最相似)的类别

 

三.SIFT表示包

Bag-of-words模型是信息检索领域常用的文档表示方法。在信息检索中,BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。

SIFT表示包就是参考了文本文档的这种表示方法。将每一副图像视为一个文档,每个特征描述(描述可以多种,本项目使用dense sift)视为一个词汇。构建一个bag_of_feature模型

有了这个模型,便能对训练图像和测试图像进行比较了。所以,怎么构建这个模型是重点。

构建bag_of_feature需要两个步骤

1.创建词汇表

    利用dense_sift算法,从每类图像中提取视觉词汇(特征描述算子)。具体实现是调用vl_feat库的vl_dsift函数,其中关键参数有binsize(步长)和step(间距)等。

然后对获取到的词汇做k_means 聚类。k_means是无监督的聚类算法,利用欧式距离将样本分为指定好的k类。k可以调整,本文对k进行不同的取值(下图2),并分析其性能和准确率。

最后,所有图的视觉词汇便汇聚成了k维的一个向量,称其为词汇表。以下为实现代码:

vocab2 = [];

for i = 1:N 

  path = image_paths{i};

  image = imread(path);

  %image = vl_imsmooth(single(image),1.5);

  [locations, SIFT_features] = vl_dsift(single(image),'size',1,'step',4);

  %[locations, SIFT_features] = vl_dsift(single(image));

  %sampled_features = [sampled_features,SIFT_features];

  sampled_features = single(SIFT_features);

  [vocab1, assignments] = vl_kmeans(sampled_features, vocab_size);

  vocab2 = [vocab2,vocab1];

  sampled_features = [];

end

[vocab, assignments] = vl_kmeans(vocab2, vocab_size);

2.每幅图像统计词汇直方图

    有了词汇表,接下来是利用词汇表来表示图像。通过sift算法可以提取到图像的很多特征,这些特征都可以在词汇表里面找到与其最接近的那个词汇。那么这个词汇的值就+1(假如

是+1,只是为了简单计数)。遍历所有特征点,计算词汇出现的次数,形成一个直方图。假如一个图像获取到了N个特征点,那么用词汇表来表示这个图像的时候就是k维的向量,其值总和

为N。为了平衡不同图像获取特征点数量不同,还必须对词汇直方图进行归一化。以下为实现代码:

N = size(image_paths,1);

parpool(4);%使用并行算法,提高执行效率

image_feats = [];parfor i = 1:N 

  path = image_paths{i};

  image = imread(path);

  [locations, SIFT_features] = vl_dsift(single(image),'size',1,'step',4);

  M = size(SIFT_features,2); %获取特征的数量

  SIFT_features = single(SIFT_features);

  his = zeros(1,vocab_size); %初始化直方图

  D = vl_alldist2(SIFT_features,temp_vocab); %取最小距离

  [Y,I] = min(D'); %计算出最小的距离的单词表索引

  for j = 1:vocab_size

  %循环建立直方图

    F = find(I == j);

    h_value = size(F,2); %j单词出现的次数

    his(1,j) = h_value; %构建直方图

  end

  his = his ./ norm(his); %归一化直方图

  image_feats = [image_feats;his];

end

delete(gcp('nocreate'));

 



图2(binsize:4 step:4 trans_images:200)

可以看到,当k值越大时,每幅图像能分到更加精确的类别,因此准确率也越高。但是同时计算量也越高,性能越差。

四.SVM分类器

线性SVM分类器是一中有监督的分类算法。其把样本空间映射到更高维的空间,使其线性可分。并构建分类的线性函数,大于0的属于此类,小于0的则不属于

本项目不详细讨论SVM的实现方法,知识用它来对前面已经获取到的bag_of_feature进行分类

思路:

1.循环15个场景,对train_image_feats进行svm训练,得到15个分类器

2.循环test_image_feats图,每幅图进行15个分类计算

3.计算各个分类得分,最高分则为此类

关键代码如下:

[W B] = vl_svmtrain(train_image_feats', labels, 0.00006); %调用vl_feat库函数训练svm

score = w'*image' + b ; %评价公式

 

其中vl_svmtrain的LAMBDA参数对准确度比较敏感,通过多值实验,确定了效果较好的值



下图为当参数选0.00006时,bag of feature+svm 的可视化评估:



Results visualization for poorly performing recognition pipeline.

Accuracy (mean of diagonal of confusion matrix) is 0.681
 

提示与说明

1.用不同的词汇表规模做实验,并报告性能。例如:10, 20, 50, 100, 200, 400, 1000, 10000。

2.get_bags_of_sifts加入了并行算法,用4个核同时抽取图像sift描述和计算直方图,以提高性能。通过实验,比串行节省约1/3的时间

3.SVM中,试样了不同的LAMBDA参数,评估其准确性

4.build_vocabulary中实验了3种算法,最后取效果较优的第三种算法

    第一种算法,从1500幅图中随机抽取一定数量的图像进行sift计算,可能抽取样本不够均匀,影响匹配正确率

    第二种算法:先在15个场景的每个场景中100幅图进行sift计算,kmean计算后,再汇总做kmean。

    第三种算法:先在每幅图进行sift计算,kmean计算后,再汇总做kmean。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息