主要内容

利用HOG特征进行数字分类

此示例显示如何使用HOG功能和Multiclass SVM分类器对数字进行分类。

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

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

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

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

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

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

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

数字数据集

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

使用| IMageDATASTORE负载培训和测试数据。syntheticDir = fullfile (toolboxdir (“愿景”),“visiondata”'数字'“合成”);handwrittendir = fullfile(toolboxdir(“愿景”),“visiondata”'数字'“手写”);% |imageDatastore|递归扫描包含%的图像。文件夹名称将自动用作每个图像的标签。培训= ImageageTastore(SyntheticDir,'upplyubfolders',真的,'labelsource'“foldernames”);testSet = imageDatastore (handwrittenDir,'upplyubfolders',真的,'labelsource'“foldernames”);

counteanceLabel.制表与每个标签关联的图像数量。在此示例中,训练集由10位数中的每一位的101个图像组成。测试集由每位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(培训,206);提取HOG特征和HOG可视化[hog_2x2,Vis2x2] =骨折比法(IMG,“CellSize”,[2 2]);[hog_4x4,Vis4x4] =骨折比法(IMG,“CellSize”4 [4]);[hog_8x8, vis8x8] =“CellSize”,[8 8]);%显示原始图像图;子图(2,3,1:3);imshow(img);可视化HOG功能次要情节(2、3、4);情节(vis2x2);标题({'CellSize = [2 2]';[的长度= 'num2str(长度(hog_2x2))]});次要情节(2、3、5);情节(vis4x4);标题({'细胞化= [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.函数用于使用二进制支持向量机创建多类分类器。

首先从培训集中提取猪曲调。这些功能将用于培训分类器。

%循环在培训集上,并从每个图像中提取猪的功能。一种将使用类似的过程从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 =培训。标签;

接下来,使用提取的功能列出分类器。

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

评估数字分类器

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

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

%从测试集中提取HOG特征。程序是类似什么%已在前面显示过,并被封装为一个辅助函数以方便使用。[testFeatures, testLabels] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);%使用测试特性进行类预测。predigeLabels =预测(分类器,TestFeatures);用混淆矩阵将结果制成表格。confmat = confusionmat(Testlabels,predightlabels);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)的效果。

金宝app支持功能

功能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.2f'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);特征(j,:) =骨折features(img,“CellSize”, cellSize);结束结束

参考

[1] N. Dalal和B. Triggs,“人类检测的导向梯度直方图”,Proc。IEEE CONF。计算机视觉和模式识别,卷。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. Coaters,A.Bissacco,B. Wu,A.Y.Y.NG,在深度学习和无人监督专业学习中学习NIPS研讨会的自然映像中的自然图像阅读数字。