使用HOG特征的数字分类

这个例子说明了如何使用HOG特征分类数字和多类SVM分类。

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

  • 获得的标记的数据与期望的对象的图像设定。

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

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

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

为了说明,这个例子展示了如何使用HOG(方向梯度直方图)个数字分类设有[1]和多类SVM(支持向量机)的分类器。万博1manbetx这种类型的分类通常在许多光学字符识别(OCR)应用中使用。

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

数字数据集

合成数字图像用于训练。每个训练图像都包含一个数字和其他数字,这些数字模仿了通常情况下数字一起出现的方式。使用合成图像是方便的,它可以创建各种训练样本,而不必手动收集它们。测试时,通过扫描手写数字来验证分类器在处理与训练数据不同的数据时的表现如何。虽然这不是最具代表性的数据集,但是有足够的数据来训练和测试一个分类器,并显示方法的可行性。

%负载培养和使用测试数据| imageDatastore |。syntheticDir = fullfile (toolboxdir (“愿景”'visiondata',“数字”,“人造”);handwrittenDir =完整文件(toolboxdir(“愿景”'visiondata',“数字”,“手写”);%| imageDatastore |递归扫描包含的目录树% 图片。文件夹的名称将自动用作标签为每个图像。trainingSet = imageDatastore(syntheticDir,'IncludeSubfolders',真实,'LABELSOURCE',“foldernames”);测试集= imageDatastore(handwrittenDir,'IncludeSubfolders',真实,'LABELSOURCE',“foldernames”);

countEachLabel制表与每个标签相关联的图像的数量。在这个例子中,训练集包括101个图像的每个的10个数字的。测试集由每12个图像。

countEachLabel (trainingSet)
ANS =10×2表标签数_____ _____ 0 101 101 101 101 101 4 101 5 6 101 7 101 101 101 9
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 (rgb2gray (exTestImage));图;子地块(1,2,1)不显现(延伸)子地块(1,2,2)不显现(沉积过程)

使用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] =提取功能(img,“CellSize”[8 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);

训练一个数字分类器

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

通过提取HOG训练集功能启动。这些功能将被用于训练分类。

%循环在trainingSet和提取HOG从每个图像特征。一个%相似的过程将用于从测试集提取特征。numImages =元素个数(trainingSet.Files);(numImages, hogFeatureSize,'单');对于I = 1:numImages IMG = readimage(trainingSet,I);img = rgb2gray (img);%应用预处理步骤IMG = imbinarize(IMG);trainingFeatures(I,:) = extractHOGFeatures(IMG,“CellSize”,CELLSIZE);结束%为每个图像获取标签。trainingLabels = trainingSet.Labels;

接着,使用所提取的特征训练分类器。

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

评估数字分类

评价使用图像从测试组中的数字分类器,并产生一个混淆矩阵量化分类精度。

如在训练步骤中,首先提取HOG从测试图像中的特征。这些功能将被用来制造使用训练过的分类预测。

%提取HOG从测试设置功能。该过程类似于%早些时候示出并且被封装为为了简洁的辅助功能。[testFeatures,testLabels] = helperExtractHOGFeaturesFromImageSet(测试集,hogFeatureSize,CELLSIZE);使用测试特性进行类预测。predictedLabels =预测(分类器,testFeatures);%制表使用混淆矩阵的结果。confMat = confusionmat(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近邻的效果。

万博1manbetx支持功能

功能helperDisplayConfusionMatrix(confMat)%显示在格式化表中的混淆矩阵。%转换混淆矩阵成百分比的形式confMat = bsxfun(@ rdivide,confMat,总和(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:numel(数字)fprintf(' % 9 s '[数字(IDX)'|']);流('%-9.2f'confMat (idx:));流('\ n')结束结束
功能[特征,setLabels] = helperExtractHOGFeaturesFromImageSet(IMDS,hogFeatureSize,CELLSIZE)%提取HOG从imageDatastore功能。setLabels = imds.Labels;numImages = numel(imds.Files);特征=零(numImages,hogFeatureSize,'单');%加工每一图像和提取特征对于1:numImages img = readimage(imds, j);img = rgb2gray (img);%应用预处理步骤IMG = imbinarize(IMG);特征(J,:) = extractHOGFeatures(IMG,“CellSize”, cellSize);结束结束

参考

[1] N.达拉尔和B. Triggs, “用于人体检测方向梯度直方图”,PROC。IEEE CONF。计算机视觉与模式识别,第一卷。1,第886-893,2005。

[2] LeCun,Y.,Bottou,L.,Bengio,Y.,和哈夫纳,P。(1998)。基于梯度的学习应用到文档识别。在IEEE,86,2278年至2324年的诉讼。

[3] Y.内策,王T.,A科茨A. Bissacco,吴B.,A.Y.伍,读书位数深学习和无监督功能学习2011自然意象与无监督功能学习NIPS研讨会。