数字分类方法HOG特征

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

对象分类是许多计算机视觉应用,包括监控,汽车的安全性,以及图像检索的一项重要任务。例如,在汽车安全应用程序,你可能需要到附近的物体如行人或车辆进行分类。不管对象的类型被分类,用于创建对象分类的基本步骤是:

  • 获取带有目标图像的标记数据集。

  • 分区中的数据集分成训练集和测试集。

  • 培养使用从训练集提取的特征分类。

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

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

这个例子使用了fitcecoc函数来自统计和机器学习工具箱™和extractHOGFeatures函数来自计算机视觉工具箱™。

数字数据集

合成的数字图像用于训练。训练图像中的每个包含由其他数字,它模仿如何位数通常看到一起包围的数字。使用合成的图像是便利的,它能够使各种训练样本的创建,而无需手动收集它们。为了测试,手写数字扫描被用来验证是如何对数据分类器的性能比训练数据不同。虽然这不是最有代表性的数据集,有足够的数据来训练和测试分类,并表明了该方法的可行性。

%使用|imageDatastore|加载训练和测试数据。syntheticDir =完整文件(toolboxdir('视力'),“visiondata”“数字”“合成”);handwrittenDir = fullfile (toolboxdir ('视力'),“visiondata”“数字”“手写”);映像atastore|递归地扫描包含%的图像。文件夹名称自动用作每个图像的标签。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(测试集)
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(测试集,37);processedImage = imbinarize(rgb2gray(exTestImage));图;副区(1,2,1)imshow(exTestImage)副区(1,2,2)imshow(processedImage)

使用猪特性

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

readimage(训练集,206);提取HOG特征和HOG可视化[hog_2x2, vis2x2] =提取特征(img,'CELLSIZE'(2 - 2));[hog_4x4, vis4x4] =提取特征(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]';(的长度= '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]的细胞尺寸编码的形状信息不多,而[22]的细胞尺寸编码的形状信息较多,但HOG特征向量的维数显著增加。一个好的折衷方案是4×4的单元格大小。这个大小设置编码了足够的空间信息,可以在视觉上识别数字形状,同时限制HOG特征向量中的维数,这有助于加速训练。在实践中,应该通过反复训练和测试来改变HOG参数,以确定最优的参数设置。

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

培养出数字分类

数字分类是一个多分类问题,那就是你有一个图像划分一出十个可能的数字类。在这个例子中,fitcecoc函数from the Statistics and Machine Learning Toolbox™用于使用二进制支持向量机创建一个多类分类器。

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

循环遍历trainingSet并从每个图像中提取HOG特征。一个将使用类似的过程从测试集中提取特性。numImages = numel(trainingSet.Files);trainingFeatures =零(numImages,hogFeatureSize,“单一”);i = 1:numImages img = readimage(trainingSet, i);IMG = rgb2gray(IMG);%应用预处理步骤img = imbinarize (img);训练特征(i,:) =提取特征(img,'CELLSIZE',cellSize);结束%上设置标签为每个图像。trainingLabels = trainingSet.Labels;

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

% fitcecoc使用支持向量机学习器和“One-vs-One”编码方案。分类= fitcecoc(trainingFeatures,trainingLabels);

评估数字分类器

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

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

从测试集中提取HOG特征。过程类似于什么前面已经显示了%,为了简单起见,将其封装为辅助函数。[testFeatures, testtags] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);%使用测试功能,使类的预测。predictedtags = predict(classifier, testFeatures);用混淆矩阵把结果制成表格。confMat = confusionmat(testtags, predictedtags);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 neighbor)来查看效果。

万博1manbetx支持功能

函数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(格式,“数字|”,colHeadings {:});fprintf中(' \ n % s \ n % s \ n”头,repmat (' - '、大小(头)));IDX = 1:numel(位数)fprintf中('%-9s',(数字(idx)“|”]);fprintf中(' % -9.2 f ',confMat(IDX,:));fprintf中(' \ n '结束结束
函数[features, settags] = helperExtractHOGFeaturesFromImageSet(imds, hogFeatureSize, cellSize)从imageDatastore中提取HOG特征。setLabels = imds.Labels;numImages =元素个数(imds.Files);特征= 0 (numImages, hogFeatureSize,“单一”);%处理每个图像并提取特征J = 1:numImages IMG = readimage(IMDS,J);IMG = rgb2gray(IMG);%应用预处理步骤img = imbinarize (img);特征(j,:) =提取特征(img,'CELLSIZE',CELLSIZE);结束结束

参考文献

张建新,“人类侦测方向梯度之柱状图”,国立中央大学资讯工程学研究所硕士论文,国立中央大学资讯工程学研究所硕士论文。

李宝英,李宝英,李宝英。(1998)。梯度学习在文档识别中的应用。IEEE会议记录,86,2278-2324。

吴宝云,“自然图像中数字的阅读与非监督特征学习”,深度学习与非监督特征学习研讨会,2011。