主要内容

基于HOG特征的数字分类

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

在许多计算机视觉应用中,对象分类是一项重要任务,包括监控、汽车安全和图像检索。例如,在汽车安全应用中,您可能需要将附近的对象分类为行人或车辆。无论分类对象的类型如何,创建对象分类器是:

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

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

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

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

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

该示例使用fitcecoc统计和机器学习工具箱中的函数™ 和提取特征来自计算机视觉工具箱的函数™.

数字数据集

合成数字图像用于训练。每个训练图像都包含一个被其他数字包围的数字,这模仿了通常一起看到数字的方式。使用合成图像很方便,并且可以创建各种训练样本,而无需手动采集。对于测试,手写数字的扫描e用于验证分类器在不同于训练数据的数据上的性能。虽然这不是最具代表性的数据集,但有足够的数据来训练和测试分类器,并显示了该方法的可行性。

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

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

countEachLabel(培训集)
ans=10×2表标签计数uuuuuuuuuuuuuuuuuuuuuu0 101 1 101 2 101 3 101 4 101 5 101 6 101 7 101 8 101 9 101
countEachLabel(测试集)
ans=10×2表标签计数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

显示一些培训和测试图像

图;子图(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});子图(2,3,6);imshow(testSet.Files{97});

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

%显示预处理结果exTestImage=readimage(testSet,37);processedImage=imbinarize(rgb2gray(exTestImage));图;子图(1,2,1)imshow(exTestImage)子图(1,2,2)imshow(processedImage)

使用HOG特征

用于训练分类器的数据是从训练图像中提取的特征向量。因此,确保HOG特征向量编码有关对象的正确信息量是很重要的。这个提取特征函数返回一个可视化输出,该输出有助于对“适当数量的信息”的含义形成某种直觉。通过改变HOG cell size参数并可视化结果,您可以看到cell size参数对特征向量中编码的形状信息量的影响:

img = readimage(trainingSet, 206);%HOG特征提取与HOG可视化[hog2x2, vis2x2] = extracthgfeatures (img,“手机大小”(2 - 2));[hog_4x4, vis4x4] = extracthgfeatures (img,“手机大小”,[4 4]); [hog_8x8,vis8x8]=提取hog特征(img,“手机大小”[8]);%显示原始图像图;次要情节(2、3、1:3);imshow (img);%将猪的特征可视化子地块(2,3,4);地块(vis2x2);标题({'CellSize=[2]';['长度='num2str(长度(hog_2x2))]};子地块(2,3,5);地块(vis4x4);标题({'CellSize = [4 4]';['长度='num2str(长度(hog_4x4))]};子批次(2,3,6);绘图(vis8x8);头衔({'CellSize=[8]';['长度='num2str(长度(hog_8x8))]});

可视化显示[8]的单元大小没有编码太多的形状信息,而[2]的单元大小对大量形状信息进行编码,但会显著增加HOG特征向量的维数。一个很好的折衷方案是采用4乘4的单元格大小。此大小设置编码足够的空间信息,以直观地识别数字形状,同时限制HOG特征向量中的维数,这有助于加快训练速度。在实践中,HOG参数应随分类器的重复训练和测试而变化,以确定最佳参数设置。

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

训练数字分类器

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

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

%在训练集上循环并从每个图像中提取HOG特征。A%类似的过程将用于从测试集中提取特征。numImages=numel(trainingSet.Files);训练特征=零(数字图像、特征尺寸、,“单身”);对于i=1:numImages img=readimage(训练集,i);img=rgb2gray(img);%应用预处理步骤img=imbinarize(img);培训特征(i,:)=提取特征(img,“手机大小”,细胞大小);终止%获取每个图像的标签。trainingLabels = trainingSet.Labels;

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

%fitcecoc使用SVM学习器和“一对一”编码方案。分类器=fitcecoc(培训特征、培训标签);

计算数字分类器

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

在训练步骤中,首先从测试图像中提取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.08 0.00 1 | 0.00 0.75 0.00 0.00 0.00 0.08 0.00 0.00 0.08 0.00 2 | 0.00 0.00 0.00 0.67 0.17 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.08 3 1240.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00.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]等更有代表性的数据集进行训练,这些数据集包含数千个手写字符,与使用这种合成数据集创建的分类器相比,可能会产生更好的分类器。

总结

此示例演示了使用提取特征来自计算机视觉工具箱和fitcecoc统计和机器学习工具箱中的函数™. 虽然这里使用了HOG特征和ECOC分类器,但其他特征和机器学习算法也可以以相同的方式使用。例如,您可以探索使用不同的特征类型来训练分类器;或者您可以在统计和机器学习工具B中看到使用其他机器学习算法的效果公牛™ 比如k-近邻。

金宝app辅助功能

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

参考文献

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

[2] LeCun,Y.,Bottou,L.,Bengio,Y.,和Haffner,P.(1998)。基于梯度的学习应用于文档识别。IEEE会议录,862278-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。