主要内容

使用袋子特征的图像类分类

此示例显示如何使用一袋特征方法进行图像类别分类。这种技术也经常被称为单词袋。可视图像分类是将类别标签分配给被测图像的过程。类别可能包含代表任何关于任何内容的图像,例如狗,猫,火车,船只。

加载图像数据集

解压缩一组图像以用于此示例。

解压缩('merchdata.zip');

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

imd = imageDatastore (“MerchData”'insertumbfolders',真的,'labelsource'“foldernames”);

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

TBL = CONSECHANCLABEL(IMDS)
台=5×2表标签数_______________________ _____数学工作章第15个MATHWORKS CUBE 15 MATHWORKS扑克牌15 MATHWORKS螺丝刀15 MATHWORKS TORCH 15

请注意,标签源自用于构造IMAGEDATASTORE的目录名称,但可以通过手动设置IMAGEDATASTORE对象的标签属性来自定义。接下来,显示一些图像以获得正在使用的图像类型的感觉。

图蒙太奇(IMDS.FILES(1:16:结束))

图包含轴。轴包含类型图像的对象。

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

准备培训和验证图像集

将集合分离为训练数据和验证数据。从每组图像中选取60%作为训练数据,其余40%作为验证数据。将分割随机化以避免使结果产生偏差。

[培训,验证项目= SpliteachLabel(IMDS,0.6,“随机”);

上面的调用返回两个IMAGEDATASTORE对象,准备培训和验证任务。

创建视觉词汇和培训图像类别分类器

词袋技术是从自然语言处理领域发展而来的一种适应计算机视觉的技术。由于图像实际上并不包含离散的单词,我们首先构建一个“词汇”提取物质代表每个图像类别的特征。

这可以通过调用来实现Bagoffeature功能,哪个:

  1. 从所有图像类别中提取来自所有图像的冲浪功能

  2. 通过使用K-means群集来减少功能空间的量化来构造视觉词汇量

袋= Bagoffeature(培训);
创建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%最强大的功能。*使用K-Means聚类创建500单词的视觉词汇。*特性数量:112895 *集群数量(K): 500 *初始化集群中心……100.00%完成18/100次迭代(~1.29秒/迭代)…在18次迭代中收敛。 * Finished creating Bag-Of-Features

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

IMG = ReadImage(IMDS,1);FeatureVector =编码(袋子,IMG);%绘制视觉词出现的直方图图栏(FeatureVector)标题('视觉词出现')Xlabel('视觉单词索引')ylabel('发生频率'

图包含轴。具有标题视觉字出现的轴包含类型栏的对象。

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

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

categoryClassifier = TrainimageCategoryClassifier(培训,袋);
为5个类别培训图像类别分类器。---------------------------------------------------------------------- *类别1:Mathworks Cap *类别2:Mathworks Cube *类别3:Mathworks扑克牌*类别4:Mathworks螺丝刀* 5类:Mathworks Torch *编码特征45张图片的功能。*完成培训类别分类器。使用评估在测试集上测试分类器。

上述功能利用了编码输入的方法对象以制定代表每个图像类别的特征向量培训

评估分类器的性能

现在我们有了一个训练有素的分类器,categoryClassifier,让我们来评估它。作为理智检查,让我们首先用训练集测试它,这应该产生近乎完美的混淆矩阵,即对角线上的那些。

confMatrix = evaluate(categoryClassifier, trainingSet);
评估图像分类器为5个类别。--------------------------------------------------------------------- *类别1:Mathworks Cap *类别2:Mathworks Cube *类别3:Mathworks扑克牌*类别4:Mathworks螺丝刀*类别5:Mathworks火炬*评估45张图片......完成45张图片。*完成所有测试集的评估。*该测试集的混淆矩阵是:预测已知|Mathworks帽数学工作多维数据库Mathworks扑克牌Mathworks螺丝刀Mathworks火炬-------------------------------------------------------------------------------------------------------------------------------------- Mathworks Cap |1.00 0.00 0.00 0.00 0.000 Mathworks立方体|0.00 0.89 0.00 0.11 Mathworks扑克牌|0.00 0.00 0.00 0.00 0.00 0.0 0.0螺丝刀螺丝刀| 0.00 0.00 0.00 1.00 0.00 MathWorks Torch | 0.00 0.00 0.00 0.00 1.00 * Average Accuracy is 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 Cap |1.00 0.00 0.00 0.00 0.000 Mathworks立方体|0.00 0.67 0.17 0.17 0.00 MathWorks Playing Cards | 0.00 0.00 1.00 0.00 0.00 MathWorks Screwdriver | 0.00 0.00 0.00 1.00 0.00 MathWorks Torch | 0.17 0.00 0.00 0.00 0.83 * Average Accuracy is 0.90.
计算平均精度意思是(诊断接头(confMatrix))
ans = 0.9000

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

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

您现在可以应用新培训的分类器来分类新图像。

img = imread(fullfile(“MerchData”'mathworks cap'“Hat_0.jpg”));图imshow(img)

图包含轴。轴包含类型图像的对象。

[labelidx,scores] =预测(类别Classifier,IMG);%显示字符串标签categoryclassifier.labels(labelidx)
ans =.1x1细胞阵列{' MathWorks帽'}