计算机视觉作业(三)Scene Recognition with Bag of Words

一、实验原理

本次实验是基于词袋模型的图像分类技术,利用提取的局部区域的分布对图像进行识别。在图像分类中,词袋模型算法需要通过监督或非监督的学习来获得视觉词典。基于词袋模型的图像分类算法一般分为四步,首先对图像进行局部特征向量的提取(本次实验采用HOG);其次利用上一步得到的特征向量集,抽取其中有代表性的向量,作为单词,形成视觉词典(本实验采用K-means聚类算法);然后对图像进行视觉单词的统计,一般判断图像的局部区域和某一单词的相似性是否超过某一阈值,这样即可将图像表示成单词的分布,即完成了图像的表示;最后设计并训练分类器,利用图像中单词的分布进行图像分类(本实验采用KNN分类算法和线性SVM多分类算法)。

二、实验目的

本实验的目的是对15个场景数据库进行场景识别,对它们进行训练和测试。对于给定的训练集和测试集的图像,处理其图像特征和构建分类器,图像特征表示和分类器构建的组合有五种,分别为随机生成的(图像特征没有经过处理以及没有对应的分类器)、微小图像特征和KNN分类器、微小图像特征和线性SVM分类器、单词特征包和KNN分类器以及单词特征包和线性SVM分类器。

三、实验内容

这次实验的内容调用四个.py文件完成,分别是helpers.py文件、student.py文件、create_results_webpage.py文件以及main.py文件。下面将进行详细的描述。

1、helpers.py文件

文件中只包含一个get_image_paths()函数,功能是返回包含每个训练和测试图像的文件路径和标签的列表。

2、student.py文件

文件中包含五个函数,总的功能是实现图像的特征表示和分类器的构建。对于图像的特征表示可以通过两种相互独立的方法实现,第一种是直接获得图像的tiny特征(get_tiny_images()函数实现该功能),优点是速度快,缺点是精度差。第二种是通过构建词袋模型(build_vocabulary()函数以及get_bags_of_words()函数实现该功能),相比于tiny特征有很大提升,缺点是训练时间较长。对于分类器将采用KNN分类算法(nearest_neighbor_classify()函数实现该功能)和线性SVM多分类算法(svm_classify()函数实现该功能)。

(1)定义get_tiny_images()函数,把原图像缩小到固定像素(本实验设置成16*16像素)并进行归一化操作,最后进行一维输出。

(2)定义build_vocabulary()函数,先训练集图片的直方图(HOG)特征提取,然后使用K-means对提取特征进行聚类后返回特征中心。

(3)定义get_bags_of_words()函数,通过上一步得到的特征词典,分别统计训练集和测试集中每幅图像的词频。

(4)定义nearest_neighbor_classify()函数,通过查找训练集图像的相应最似特征来预测测试图像的类别。对于任意给定的KNN参数K给出相对于测试集图像最近的K个邻居(本次实验k设置为5),并通过投票法返回最临近邻居的分类。

(5)定义svm_classify()函数,先在训练集上训练15个多对1的线性SVM分类器,然后在测试集上使用这些学习后的分类器,对每个测试图像进行分类预测。

3、create_results_webpage.py文件

文件中包含两个函数,create_results_webpage()函数的功能是创建一个图像的分类结果可视化的网页;rescale()函数的功能是规范图片的尺寸。

(create_results_webpage()函数代码很多,上面截取了一小段。)

4、main.py文件

文件中只包含一个projSceneRecBoW()函数,功能分四个步骤来实现。具体步骤如下:

(1)首先是设置参数、类别列表和图像路径。其中,图像特征表示和分类器构建的组合有五种,分别为随机生成的(图像特征没有经过处理以及没有对应的分类器)、微小图像特征和KNN分类器、微小图像特征和线性SVM分类器、单词特征包和KNN分类器以及单词特征包和线性SVM分类器。

(2)其次是用适当的特征表示每个图像,每个构造特征的函数应该返回一个矩阵。这里因为构建词汇表需要很长时间,所以保存生成的词汇表到一个vocab.npy文件,并重新加载它每次使测试更快。如果需要重新生成vocab,简单地删除vocab.npy文件并重新运行main.py文件即可。

(3)然后通过训练和使用合适的分类器对每个测试图像进行分类,其中placeholder分类器简单地对每个测试实例进行随机预测分类。

(4)最后建立混淆矩阵并对识别系统进行评分。

四、实验器材(设备、元器件)

硬件配置:Windows 10 64位操作系统。

软件配置:Jupyter Notebook 6.0.0版本。

五、实验步骤

本次实验的步骤总的来说有三步:首先获得图像的特征表示;然后训练SVM分类器和KNN分类器;最终实现场景识别。其中图像特征表示有微型图像表示和词袋模型构建,分别调用get_tiny_images()函数和build_vocabulary()函数。分类器的构建KNN分类器和SVM分类器,调用nearest_neighbor_classify()函数和svm_classify()函数。

六、实验数据及结果分析

图像特征表示和分类器构建的组合有五种,故结果有五个文件夹,具体为:

1placeholderplaceholder_results_webpage

特征提取器(NULL)、分类器(NULL)、准确率(6.9%

2tiny imagenearest neighbor_results_webpage

特征提取器(Tiny)、分类器(KNN)、准确率(18.9%

3tiny imagesupport vector machine_results_webpage

特征提取器(Tiny)、分类器(SVM)、准确率(22.3%

4bag of wordsnearest neighbor_results_webpage

特征提取器(bag of words)、分类器(KNN)、准确率(58.1%

5bag of wordssupport vector machine_results_webpage

特征提取器(bag of words)、分类器(SVM)、准确率(68.9%

七、实验结论

观察五种情况下的混淆矩阵(从左至右依次为分别为随机生成的、微小图像特征和KNN分类器、微小图像特征和线性SVM分类器、单词特征包和KNN分类器以及单词特征包和线性SVM分类器。)的对角线可知,从左至右的混淆矩阵的对角线越来越明显,意味着分类效果也越来越好,这一点从准确率越来越高也得到了佐证。对于每一种组合生成的混淆矩阵而言,其小格颜色越亮代表对应的该类别得到了很好的分类,越暗代表该类别没有得到很好的分类。

八、总结及心得体会

在本次实验中,基本上实现了图像特征和分类器构建的各种组合,用来处理15种场景下的图像分类问题,取得了较好的实验效果(最高的准确率达到了68.9%)。首先对原始图像进行了读取和预处理,接着进行对图像特征分别进行了微小化(get_tiny_images())处理和词袋模型构建(build_vocabulary()get_bags_of_words()),最后在两种定义的分类器(nearest_neighbor_classify()svm_classify())上分别进行图像的分类预测。从分类结果可以看出,分类效果基本属于较为正常的范围。

九、对本实验过程及方法、手段的改进建议

首先是数据集的扩充,本次实验使用的数据集图像数与图像类别比较少,之后的实验中可以针对大量图像进行分类检测。

其次是形成单词特征包时图像特征提取的方法,本实验使用的是HOG,虽然在本实验中相比于图像微小化而言,取得了更好的效果。但是HOG提取图像特征的方法忽略了光照颜色对图像造成的影响,对于图像的遮挡问题很难处理以及对图像的噪声异常敏感,这些缺点对于以后要处理的大量复杂的图像集而言并不是一个很好的选择,之后的图像分类实验中对于图像特征的提取可以考虑LBP。

最后是框架的选择,之后的实验中可以考虑使用深度学习框架 TensorFlow或者PyTorch来实现本实验的场景识别。

配套代码见相关博客。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值