主要内容

使用HOG特征进行数字分类

这个例子展示了如何使用HOG特征和多类SVM分类器对数字进行分类。

目标分类是许多计算机视觉应用的重要任务,包括监控、汽车安全和图像检索。例如,在汽车安全应用程序中,您可能需要将附近的物体分类为行人或车辆。不管被分类的对象类型是什么,创建对象分类器的基本过程是:

  • 获取带有所需对象图像的标记数据集。

  • 将数据集划分为训练集和测试集。

  • 使用从训练集中提取的特征训练分类器。

  • 使用从测试集中提取的特征测试分类器。

为了说明这一点,这个例子展示了如何使用HOG(定向梯度直方图)特征[1]和多类SVM(支持向量机)分类器对数字数字进行分类。金宝app这种类型的分类通常用于许多光学字符识别(OCR)应用程序。

该示例使用fitcecoc函数从统计和机器学习工具箱™和extractHOGFeatures功能从计算机视觉工具箱™。

数字数据集

使用合成数字图像进行训练。每个训练图像都包含一个数字,周围围绕着其他数字,这模拟了通常数字在一起的情况。使用合成图像很方便,它可以创建各种训练样本,而无需手动收集它们。对于测试,使用手写数字的扫描来验证分类器在与训练数据不同的数据上的表现。虽然这不是最具代表性的数据集,但有足够的数据来训练和测试分类器,并显示该方法的可行性。

使用|imageDatastore|加载训练和测试数据。synticdir = fullfile(toolboxdir(“愿景”),“visiondata”“数字”“合成”);handwrittenDir = fullfile(toolboxdir(“愿景”),“visiondata”“数字”“手写”);imageDatastore|递归扫描包含%的图像。文件夹名称将自动用作每个图像的标签。trainingSet = imageDatastore(合成目录,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);testSet = imageDatastore(handwrittenDir,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

使用countEachLabel将与每个标签相关联的图像数量制成表格。在本例中,训练集包含101张图像,对应10个数字中的每一个。测试集由每个数字12个图像组成。

countEachLabel (trainingSet)
ans =10×2表标签计数_____ _____ 0 101 1 101 2 101 3 101 4 101 5 101 6 101 7 101 8 101 9 101
countEachLabel (testSet)
ans =10×2表标签计数_____ _____ 0 12 1 12 2 12 3 12 4 12 5 12 6 12 7 12 8 12 9 12

显示一些训练和测试图像

图;次要情节(2、3、1);imshow (trainingSet.Files {102});次要情节(2、3、2);imshow (trainingSet.Files {304});次要情节(2、3、3);imshow (trainingSet.Files {809});次要情节(2、3、4);imshow (testSet.Files {13});次要情节(2、3、5); imshow(testSet.Files{37}); subplot(2,3,6); imshow(testSet.Files{97});

在训练和测试分类器之前,应用预处理步骤去除在收集图像样本时引入的噪声伪影。这为训练分类器提供了更好的特征向量。

显示预处理结果exTestImage = readimage(testSet,37);proces沉淀物= imbinalize (im2gray(exTestImage));图;subplot(1,2,1) imshow(exTestImage) subplot(1,2,2) imshow(proces沉积物)

使用HOG特性

用于训练分类器的数据是从训练图像中提取的HOG特征向量。因此,确保HOG特征向量编码关于对象的正确数量的信息是很重要的。的extractHOGFeatures函数返回一个可视化输出,可以帮助形成一些关于“适当数量的信息”意味着什么的直觉。通过改变HOG单元格大小参数并将结果可视化,您可以看到单元格大小参数对特征向量中编码的形状信息数量的影响:

img = readimage(trainingSet, 206);提取HOG特征和HOG可视化[hog_2x2, vis2x2] = extractHOGFeatures(img,“CellSize”(2 - 2));[hog_4x4, vis4x4] = extractHOGFeatures(img,“CellSize”4 [4]);[hog_8x8, vis8x8] = extractHOGFeatures(img,“CellSize”[8]);%显示原始图像图;次要情节(2、3、1:3);imshow (img);可视化HOG特征次要情节(2、3、4);情节(vis2x2);标题({'CellSize = [2 2]';['Length = 'num2str(长度(hog_2x2))]});次要情节(2、3、5);情节(vis4x4);标题({'CellSize = [4 4]';['Length = 'num2str(长度(hog_4x4))]});次要情节(2、3、6);情节(vis8x8);标题({'CellSize = [8 8]';['Length = 'num2str(长度(hog_8x8))]});

可视化结果表明,尺寸为[8 8]的单元格编码的形状信息并不多,而尺寸为[2 2]的单元格编码的形状信息较多,但HOG特征向量的维数显著增加。一个好的折衷方案是4 * 4的单元格大小。这种大小设置编码了足够的空间信息,以视觉上识别数字形状,同时限制HOG特征向量中的维度数量,这有助于加快训练。在实践中,HOG参数应该通过重复的分类器训练和测试来改变,以确定最优参数设置。

cellSize = [4 4];hogFeatureSize =长度(hog_4x4);

训练一个数字分类器

数字分类是一个多类分类问题,你必须将图像分为十个可能的数字类中的一个。在本例中,fitcecoc统计和机器学习工具箱™中的函数用于使用二进制支持向量机创建多类分类器。

首先从训练集中提取HOG特征。这些特征将被用来训练分类器。

遍历trainingSet并从每张图像中提取HOG特征。一个%类似的过程将用于从testSet中提取特征。numImages = nummel (trainingSet.Files);trainingFeatures = 0 (numImages,hogFeatureSize,“单一”);i = 1:numImages img = readimage(trainingSet,i);Img = im2gray(Img);应用预处理步骤Img = Img;trainingFeatures(i,:) = extractHOGFeatures(img,“CellSize”, cellSize);结束为每个图像获取标签。trainingLabels = trainingSet.Labels;

接下来,使用提取的特征训练分类器。

fitcecoc使用支持向量机学习器和“一对一”编码方案。classifier = fitcecoc(trainingFeatures, trainingLabels);

计算数字分类器

使用来自测试集的图像评估数字分类器,并生成一个混淆矩阵来量化分类器的精度。

在训练步骤中,首先从测试图像中提取HOG特征。这些特征将用于使用训练过的分类器进行预测。

从测试集中提取HOG特征。程序类似于什么为简洁起见,%被封装为一个辅助函数。[testFeatures, testLabels] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);使用测试特性进行类预测。predictedLabels = predict(分类器,testFeatures);使用混淆矩阵将结果制成表格。confMat = confusimat (testLabels, predictedLabels);helperDisplayConfusionMatrix (confMat)
数字| 0 1 2 3 4 5 6 7 8 9  --------------------------------------------------------------------------------------------------- 0 | 0.25 0.00 0.08 0.00 0.00 0.00 0.58 0.00 0.08 0.00 1 | 0.00 0.75 0.00 0.00 0.08 0.00 0.00 0.08 0.08 0.00 - 2 | 0.00 0.00 0.67 0.17 0.00 0.00 0.08 0.00 0.00 0.08 - 3 | 0.00 0.00 0.00 0.58 0.00 0.00 0.33 0.00 0.00 0.08 - 4 | 0.00 0.08 0.00 0.17 0.75 0.00 0.00 0.00 0.00 0.00 - 5 | 0.00 0.00 0.00 0.00 0.00 0.33 0.58 0.00 0.08 0.00 6 | 0.00 0.00 0.00 0.00 0.25 0.00 0.67 0.00 0.080.00 7 | 0.00 0.08 0.08 0.33 0.00 0.00 0.17 0.25 0.00 0.08 8 | 0.00 0.00 0.00 0.08 0.00 0.00 0.00 0.08 0.67 0.17 9 | 0.00 0.08 0.00 0.25 0.17 0.00 0.08 0.00 0.00 0.42

该表以百分比形式显示了混淆矩阵。矩阵的列表示预测的标签,而行表示已知的标签。对于这个测试集,数字0经常被错误地分类为6,很可能是由于它们的形状相似。9和3也出现了类似的错误。使用更有代表性的数据集(如MNIST[2]或SVHN[3])进行训练,这些数据集包含数千个手写字符,与使用这个合成数据集创建的分类器相比,可能会产生更好的分类器。

总结

类创建多类对象分类器的基本过程extractHOGfeatures函数从计算机视觉工具箱和fitcecoc功能从统计和机器学习工具箱™。虽然这里使用了HOG特征和ECOC分类器,但其他特征和机器学习算法也可以以同样的方式使用。例如,您可以探索使用不同的特征类型来训练分类器;或者您可以看到使用统计和机器学习工具箱™中可用的其他机器学习算法(如k-nearest neighbors)的效果。

金宝app支持功能

函数helperDisplayConfusionMatrix (confMat)在格式化的表格中显示混淆矩阵。将混淆矩阵转换为百分比形式confMat = bsxfun(@rdivide,confMat,sum(confMat,2));数字=' 0 '“9”;colheading = arrayfun(@(x)sprintf(' % d ', 0:9 x)“UniformOutput”、假);格式= repmat(' % 9 s '1、11);标题= sprintf(格式,“数字|”, colHeadings {:});流(' \ n % s \ n % s \ n”头,repmat (“- - -”、大小(头)));Idx = 1:数字(数字)fprintf(' % 9 s ',(数字(idx)“|”]);流(' % -9.2 f 'confMat (idx:));流(' \ n '结束结束
函数[features, setLabels] = helperextracthogfeatresfromimageset (imds, hogFeatureSize, cellSize)从imagedatstore中提取HOG特征。setLabels = imds.Labels;numImages = nummel (imds.Files);features = 0 (numImages,hogFeatureSize,“单一”);处理每张图像并提取特征j = 1:numImages img = readimage(imds,j);Img = im2gray(Img);应用预处理步骤Img = Img;features(j,:) = extractHOGFeatures(img,“CellSize”, cellSize);结束结束

参考文献

[1]戴良,“面向梯度的人体检测直方图”,计算机视觉与模式识别,vol. 1, pp. 886-893, 2005。

[2] LeCun, Y., Bottou, L., Bengio, Y.和Haffner, P.(1998)。基于梯度的学习应用于文档识别。电子工程学报,86,2278-2324。

Y. Netzer, T. Wang, A. Coates, A. Bissacco, B. Wu, A.Y. Ng,用无监督特征学习在自然图像中读取数字,NIPS深度学习和无监督特征学习研讨会2011。

相关的话题