这个例子说明了如何使用的功能包接近图像类别分类。这种技术也常常被称为词袋。视觉图像分类是被测分配一个类别标签的图像的处理。分类可以包含表示几乎任何图像,例如,狗,猫,火车,轮船。
解压缩图像的收集,使用这个例子。
解压缩('MerchData.zip');
使用加载图像采集imageDatastore
为了帮助您管理数据。因为imageDatastore
对图像文件位置进行操作,因此不会将所有的图像加载到内存中,它可以安全地用于大型图像集合。
IMDS = imageDatastore(“MerchData”,'IncludeSubfolders',真的,'LABELSOURCE',“foldernames”);
你可以很容易地检查每个类别的图像数量以及类别标签如下所示:
TBL = countEachLabel(IMDS)
台=5×2表标签数量_______________________ _____ MathWorks的第15个MathWorks公司立方15个MathWorks的扑克牌15 MathWorks的螺丝刀15 MathWorks的火炬15
注意,标签是从用于构造ImageDatastore的目录名派生出来的,但是可以通过手动设置ImageDatastore对象的labels属性来定制。接下来,显示一些图像以了解使用的图像类型。
图蒙太奇(imds.Files(1:16:端))
注意,为了使特征包方法有效,目标的大部分必须在图像中可见。
将集合分离为训练数据和验证数据。从每组图像中选取60%作为训练数据,其余40%作为验证数据。将分割随机化以避免使结果产生偏差。
[trainingSet,validationSet] = splitEachLabel(IMDS,0.6%,“随机”);
以上调用返回两个imageDatastore对象准备训练和验证任务。
词袋技术是从自然语言处理领域发展而来的一种适应计算机视觉的技术。由于图像实际上并不包含离散的单词,我们首先构建一个“词汇”extractFeatures
设有代表每个图像类别的。
这可以通过调用来实现bagOfFeatures
功能,其中:
提取物从SURF所有图像特征中的所有图像的类别
通过使用K均值聚类减少通过特征空间量化的特征的数量构建视觉词汇
袋= 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
此外,该bagOfFeatures对象提供一个编码
一种在图像中计算可视单词出现次数的方法。它产生了一个直方图,成为一个新的和简化的代表图像。
IMG = readimage(IMDS,1);featureVector =编码(袋,IMG);
使用一袋功能对图像进行编码。-------------------------------------- *编码的图像...完成。
%绘制视觉词出现的直方图图巴(featureVector)标题(“视觉出现的词语”)xlabel(“视觉字索引”)ylabel(“发生的频率”)
该直方图形成了训练分类器和实际图像分类的基础。本质上,它将图像编码为特征向量。
从每个类别编码训练图像被馈送到由调用的分类器训练过程trainImageCategoryClassifier
函数。注意,这个函数依赖于来自统计和机器学习工具箱™的多类线性SVM分类器。
categoryClassifier = trainImageCategoryClassifier(trainingSet,袋);
5个大类培养的图像类别分类。-------------------------------------------------------- *类别1:The MathWorks公司CAP *第2类:MathWorks的立方* 3类:MathWorks的扑克牌* 4类:MathWorks的螺丝刀* 5类:MathWorks的火炬*编码功能45张图片...完成。*完成培训的类别分类。使用评估,以测试对测试集的分类。
上面的函数利用了编码
输入的方法袋
目的是配制表示从每个图像类别的特征向量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(完整文件(“MerchData”,“MathWorks公司帽”,“Hat_0.jpg”));图imshow(IMG)
[labelIdx,分数] =预测(categoryClassifier,IMG);
使用一袋功能对图像进行编码。-------------------------------------- *编码的图像...完成。
%显示字符串标签categoryClassifier.Labels(labelIdx)
ANS =1x1的单元阵列{' MathWorks帽'}