主要内容

使用特征袋进行图像分类

这个例子展示了如何使用特征袋方法进行图像类别分类。这种技巧也常被称为“词汇袋”。视觉图像分类是为被测图像分配类别标签的过程。类别可能包含代表任何事物的图像,例如狗、猫、火车、船。

加载图像数据集

解压缩用于本示例的图像集合。

解压缩(“MerchData.zip”);

类加载图像集合imageDatastore帮助您管理数据。因为imageDatastore对图像文件位置进行操作,因此不会将所有图像加载到内存中,用于大型图像集合是安全的。

imds = imageDatastore(“MerchData”“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

你可以很容易地检查每个类别的图像数量以及类别标签,如下所示:

tbl = countEachLabel(imds)
台=5×2表标签计数_______________________ _____ MathWorks Cap 15 MathWorks Cube 15 MathWorks Playing Cards 15 MathWorks螺丝刀15 MathWorks Torch 15

注意,这些标签来自于用于构造ImageDatastore的目录名,但是可以通过手动设置ImageDatastore对象的labels属性进行自定义。接下来,显示一些图像以了解所使用的图像类型。

图蒙太奇(imds.Files (1:16)):

图中包含一个轴对象。axis对象包含一个image类型的对象。

注意,为了使特征袋方法有效,对象的大部分必须在图像中可见。

准备训练和验证图像集

将数据集分为训练数据和验证数据。从每个集合中选择60%的图像作为训练数据,其余40%的图像作为验证数据。随机分割以避免结果的偏差。

[trainingSet, validationSet] = splitEachLabel(imds, 0.6,“随机”);

上面的调用返回两个imageDatastore对象,用于训练和验证任务。

创建一个视觉词汇表和训练一个图像分类器

单词袋是一种适应于计算机视觉的自然语言处理技术。由于图像实际上不包含离散的单词,我们首先构造一个“词汇表”extractFeatures代表每个图像类别的特征。

这是通过对bagOfFeatures函数,该函数:

  1. 从所有图像类别的所有图像中提取SURF特征

  2. 利用K-means聚类对特征空间进行量化,减少特征数量,从而构建视觉词汇

bag = bagfeateatures (trainingSet);
创建Bag-Of-Features。------------------------- *图像类别1:MathWorks Cap *图像类别2:MathWorks Cube *图像类别3:MathWorks Playing Cards *图像类别4:MathWorks螺丝刀*图像类别5:MathWorks Torch *使用Grid方法选择特征点位置。*从选定的特征点位置提取SURF特征。** GridStep是[8 8],BlockWidth是[32 64 96 128]。*从45张图像中提取特征…完成。提取了141120个特征。*保留每个类别中80%的最强功能。*创建500个单词的视觉词汇。*级别数:1 *分支因子:500 *聚类步骤数:1 *[步骤1/1]聚类词汇表级别1。*功能数量:112895 *集群数量:500 *初始化集群中心…100.00% * Clustering...completed 18/100 iterations (~1.05 seconds/iteration)...converged in 18 iterations. * Finished creating Bag-Of-Features

此外,bagfeatures对象提供了一个编码计算图像中可视单词出现次数的方法。它产生了一个直方图,成为一个新的和减少的图像表示。

Img = readimage(imds, 1);featureVector = encode(包,img);
使用Bag-Of-Features编码图像。-------------------------------------- * 编码图像做…。
绘制可视化单词出现的直方图图形栏(featureVector)“视觉单词出现”)包含(“视觉词汇索引”) ylabel (“发生频率”

图中包含一个轴对象。标题为可视单词出现的axes对象包含一个类型为bar的对象。

这个直方图形成了训练分类器和实际图像分类的基础。本质上,它将图像编码为特征向量。

来自每个类别的编码训练图像被馈送到分类器训练过程中调用trainImageCategoryClassifier函数。请注意,该函数依赖于统计和机器学习工具箱™中的多类线性SVM分类器。

categoryClassifier = trainImageCategoryClassifier(trainingSet, bag);
训练5个类别的图像分类器。-------------------------------------------------------- *类别1:MathWorks Cap *类别2:MathWorks Cube *类别3:MathWorks扑克牌*类别4:MathWorks螺丝刀*类别5:MathWorks Torch *编码功能45图像…完成。*完成分类器的训练。使用evaluate在测试集上测试分类器。

上面的函数利用编码输入方法对象中表示每个图像类别的特征向量trainingSet

评估分类器性能

现在我们有了一个训练有素的分类器,categoryClassifier我们来计算一下。作为一个完整性检查,让我们首先用训练集测试它,它应该会产生接近完美的混淆矩阵,即对角线上的矩阵。

confMatrix = evaluate(categoryClassifier, trainingSet);
对5个类别的图像分类器进行评估。------------------------------------------------------- *类别1:MathWorks Cap *类别2:MathWorks Cube *类别3:MathWorks Playing Cards *类别4:MathWorks螺丝刀*类别5:MathWorks Torch *评估45个图像…完成。*完成所有测试集的评估。*此测试集的混淆矩阵为:预测已知| MathWorks帽MathWorks立方体MathWorks扑克牌MathWorks螺丝刀MathWorks火炬  ---------------------------------------------------------------------------------------------------------------------------------- MathWorks帽| MathWorks立方体| 1.00 0.00 0.00 0.00 0.00 0.00 - 0.89 0.00 0.00 0.11 MathWorks扑克牌| 0.00 0.00 1.00 0.00 0.00 MathWorks螺丝刀| MathWorks火炬| 0.00 0.00 0.00 1.00 0.00 0.00 - 0.00 0.00 0.00 1.00 *平均精度为0.98。

接下来,让我们计算validationSet上的分类器,该分类器在训练期间没有使用。默认情况下,评估函数返回混淆矩阵,这是一个很好的分类器执行情况的初始指示器。

confMatrix = evaluate(categoryClassifier, validationSet);
对5个类别的图像分类器进行评估。------------------------------------------------------- *类别1:MathWorks Cap *类别2:MathWorks Cube *类别3:MathWorks Playing Cards *类别4:MathWorks螺丝刀*类别5:MathWorks Torch *评估30个图像…完成。*完成所有测试集的评估。*此测试集的混淆矩阵为:预测已知| MathWorks帽MathWorks立方体MathWorks扑克牌MathWorks螺丝刀MathWorks火炬  ---------------------------------------------------------------------------------------------------------------------------------- MathWorks帽| MathWorks立方体| 1.00 0.00 0.00 0.00 0.00 0.00 - 0.67 0.17 0.17 0.00 MathWorks扑克牌| 0.00 0.00 1.00 0.00 0.00 MathWorks螺丝刀| MathWorks火炬| 0.00 0.00 0.00 1.00 0.00 0.17 - 0.00 0.00 0.00 0.83 *平均精度为0.90。
计算平均准确率意思是(诊断接头(confMatrix))
Ans = 0.9000

你可以调整bagOfFeatures超参数,并继续评估训练的分类器,直到您对结果满意为止。可以使用evaluate函数返回的其余参数导出其他统计信息。参见help forimageCategoryClassifier /评估

在测试图像上尝试新训练的分类器

现在可以应用新训练的分类器对新图像进行分类。

Img = imread(fullfile(“MerchData”“MathWorks帽”“Hat_0.jpg”));图imshow (img)

图中包含一个轴对象。axis对象包含一个image类型的对象。

[labelIdx, scores] = predict(categoryClassifier, img);
使用Bag-Of-Features编码图像。-------------------------------------- * 编码图像做…。
显示字符串标签categoryClassifier.Labels (labelIdx)
ans =1x1单元阵列{' MathWorks帽'}