主要内容

基于特征包的图像分类

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

加载图像数据集

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

解压缩(“MerchData.zip”);

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

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

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

台= countEachLabel (imd)
台=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聚类对特征空间进行量化,减少特征数量,构建视觉词汇

袋= bagOfFeatures (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 * [Step 1/1]聚类词汇等级1*特性数量:112895 *集群数量:500 *初始化集群中心……100.00% * Clustering...completed 18/100 iterations (~1.10 seconds/iteration)...converged in 18 iterations. * Finished creating Bag-Of-Features

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

Img = readimage(imds, 1);featureVector = encode(包,img);
使用特征包编码图像。-------------------------------------- * 编码图像做…。
%绘制视觉单词出现的直方图图酒吧(featureVector)标题(“视觉词出现”)包含(“视觉词指数”) ylabel (发生的频率

图中包含一个轴对象。具有标题的轴对象可视字出现包含一个类型为bar的对象。

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

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

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

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

评估分类器的性能

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

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

接下来,让我们评估validationSet上的分类器,它在训练期间没有使用。默认情况下,评估函数返回混淆矩阵,这是判断分类器执行情况的良好初始指标。

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

您可以调整bagOfFeatures超参数,并继续评估训练的分类器,直到您满意的结果。可以使用evaluate函数返回的其他参数来派生额外的统计信息。请参阅帮助imageCategoryClassifier /评估

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

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

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

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

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