主要内容

利用HOG特征进行数字分类

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

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

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

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

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

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

为了说明这一点,这个例子展示了如何使用HOG (Histogram of Oriented Gradient)特征[1]和一个多类SVM (Support Vector Machine)分类器来分类数字。万博1manbetx这种类型的分类在许多光学字符识别(OCR)应用中经常使用。

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

数字数据集

使用合成数字图像进行训练。每个训练图像都包含一个由其他数字包围的数字,这模拟了数字通常是如何一起被看到的。使用合成图像是很方便的,它可以创建各种训练样本,而不必手动收集它们。在测试中,使用手写数字的扫描来验证分类器对不同于训练数据的数据执行得如何。虽然这不是最具代表性的数据集,但有足够的数据来训练和测试分类器,并显示了方法的可行性。

使用|imageDatastore|加载训练和测试数据。syntheticDir = fullfile (toolboxdir (“愿景”),“visiondata”“数字”“合成”);handwrittenDir = fullfile (toolboxdir (“愿景”),“visiondata”“数字”“手写”);% |imageDatastore|递归扫描包含%的图像。文件夹名称将自动用作每个图像的标签。trainingSet = imageDatastore (syntheticDir,“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);processedImage = imbinarize (im2gray (exTestImage));图;subplot(1,2,1) imshow(exTestImage) subplot(1,2,2) imshow(processediment)

使用猪特性

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

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

可视化结果表明,[8 8]的细胞大小编码的形状信息不多,[2 2]的细胞大小编码的形状信息较多,但显著增加了HOG特征向量的维数。一个好的折中方案是4 × 4的单元格大小。这种大小设置编码了足够的空间信息,以直观地识别数字形状,同时限制了HOG特征向量的维数,这有助于加快训练。在实际应用中,HOG参数需要通过重复的分类器训练和测试来确定最优参数设置。

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

训练数字分类器

数字分类是一个多类分类问题,你必须将一幅图像分类为十个可能的数字类别中的一个。在这个例子中fitcecoc函数用于使用二进制支持向量机创建多类分类器。

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

%循环训练集并从每幅图像中提取HOG特征。一个将使用类似的过程从testSet中提取特征。numImages =元素个数(trainingSet.Files);trainingFeatures = 0 (numImages hogFeatureSize,“单一”);i = 1:numImages img = readimage(trainingSet,i);img = im2gray (img);%应用预处理步骤img = imbinarize (img);training (i,:) = extractHOGFeatures(img,“CellSize”, cellSize);结束为每个图像获取标签。trainingLabels = trainingSet.Labels;

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

% fitcecoc使用SVM学习器和“一vs一”编码方案。classifier = fitcecoc(trainingFeatures, trainingLabels);

计算数字分类器

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

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

%从测试集中提取HOG特征。程序是类似什么%已在前面显示过,并被封装为一个辅助函数以方便使用。[testFeatures, testLabels] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);%使用测试特性进行类预测。predictedLabels = predict(分类器,testFeatures);用混淆矩阵将结果制成表格。confMat = confconfmat (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.08 0.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分类器,但其他特征和机器学习算法也可以以同样的方式使用。例如,您可以使用不同的特征类型来训练分类器;或者您可以看到使用Statistics和machine learning Toolbox™中提供的其他机器学习算法(如k-nearest neighbors)的效果。

万博1manbetx支持功能

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

参考文献

[1] N. Dalal和B. Triggs,“面向人脸检测的直方图”,计算机视觉与模式识别,vol. 1, pp. 886-893, 2005。

[2] LeCun, Y., botou, L., Bengio, Y., and Haffner, P.(1998)。梯度学习在文档识别中的应用。IEEE学报,86,2278-2324。

[3] Y. Netzer, T. Wang, A. Coates, A. Bissacco, B. Wu, A.Y. Ng,基于无监督特征学习的自然图像数字阅读技术NIPS Workshop on Deep Learning and Unsupervised Feature Learning 2011。