用于图像分类的代码生成

本实施例显示了如何在数字图像分类使用已训练的分类模型生成来自MATLAB函数C代码。该实施例证明一种替代的工作流,以使用HOG特征的数字分类(计算机视觉工具箱)。但是,要支持该示例中的代万博1manbetx码生成,您可以遵循本示例中的代码生成步骤。

自动图像分类是一种普遍存在的工具。例如,一个经过训练的分类器可以部署到无人机上,在捕捉到的镜头中自动识别陆地上的异常情况,或者部署到一台机器上,扫描信件上手写的邮政编码。在后一个示例中,在机器找到邮政编码并存储单个数字图像后,部署的分类器必须猜测图像中有哪些数字来重构邮政编码。

此示例示出了如何训练和优化多类纠错输出编码(ECOC)分类模型,以基于在光栅图像的像素强度分类数字。的ECOC模型包含二进制支持向量机(SVM)的学习者。万博1manbetx然后,这个例子说明了如何生成使用训练的模型对新图像进行分类的C代码。的数据为各种字体,它模拟手写体数字的位数翘曲的合成图像。

设置您的C编译器

生成C / C ++代码,你必须能够访问到被正确配置C / C ++编译器。MATLAB编码器定位和使用的支持,安装编译器。万博1manbetx您可以使用墨西哥人-建立要查看和更改默认的编译器。有关详细信息,请参阅改变默认的编译器(MATLAB)。

假设和限制

要生成C代码,MATLAB编码器:

  • 需要适当配置的编译器。

  • 需要支持的功能是在万博1manbetx一个MATLAB函数定义。对于基本的工作流程,请参阅代码生成简介

  • 禁止对象作为已定义函数的输入参数。

关于最后一个限制,考虑以下因素:

  • 经过训练的分类模型是对象

  • MATLAB编码器支持万博1manbetx预测分类观察使用经过调校的模式,但不支持拟合模型万博1manbetx

要绕开分类的代码生成限制,可以使用MATLAB训练分类模型,然后将生成的模型对象传递给saveLearnerForCoder。该saveLearnerForCoder函数删除不需要的用于预测的一些属性,然后保存该训练的模型,以磁盘作为结构阵列。喜欢的模型,结构数组包含用于新的观测分类的信息。

将模型保存到磁盘后,使用loadLearnerForCoder。该loadLearnerForCoder函数加载保存的结构数组,然后重新构造模型对象。在MATLAB函数中,要对观测值进行分类,可以通过模型和预测器数据集,这些数据集可以是函数的输入参数预测

代码生成的分类工作流程

在将图像分类器部署到设备之前:

  1. 获取足够数量的标记图像。

  2. 决定从图像中提取哪些特征。

  3. 火车和优化分类模型。该步骤包括选择适当的算法和调谐超参数,即,模型参数不是在训练期间适合。

  4. 通过使用模型保存到磁盘saveLearnerForCoder

  5. 定义分类的新图像的功能。该功能必须通过加载模型loadLearnerForCoder,并可以返回标签,比如分类分数。

  6. 设置您的C编译器。

  7. 决定在其上执行所生成的代码的环境。

  8. 为函数生成C代码。

加载数据

加载digitimages数据集。

加载digitimages

图片是28由-28-通过-3000阵列的UINT16整数。每一页都是一个数字的栅格图像。每个元素都是一个像素强度。对应的标签在3000乘1的数字向量中Y。有关更多细节,请输入描述在命令行。

店内观察和预测变量的数数。创建数据分区指定保留出的数据的20%。提取训练和测试,从数据分区索引集。

rng (1)%用于重现n =大小(图片3);p =元素个数(图片(:,:1));本量利= cvpartition (n,“坚持”,0.20);idxTrn =培训(cvp);idxTest =测试(cvp);

显示从数据9个随机图像。

数字对于J = 1:9副区(3,3,j)的selectImage = datasample(图像,1,3);imshow(selectImage,[])结束

重新调整数据

由于原始像素强度差异很大,你应该训练分类模型前,规范自己的值。使得它们的范围在区间[0,1]重新缩放的像素强度。也就是说,假设 p j 是像素强度 j 在图像 。对于图像 度,将所有使用此公式的像素强度的:

p j = p j - 最小值 j ( p j ) 最大 j ( p j ) - 最小值 j ( p j )

X =双(图片);对于I = 1:n的其minX =分钟(分钟(X(:,:,i))的);maxX的= MAX(最大(X(:,:,i))的);X(:,:,1)=(X(:,:,i)的 - 其minX)/(maxX的 - 其minX);结束

可替换地,如果有一个图像处理工具箱™许可,那么就可以图像,以[0,1]有效地重新调整像素强度通过使用mat2gray。有关详细信息,请参阅mat2gray

重塑数据

用于代码生成,用于训练所述预测器的数据必须是数字变量或一个数字矩阵的表。

数据重塑到基质中,使得预测器变量(像素强度)对应于列和图像(观察值),以行。因为重塑需要的元素逐列,就必须调换其结果。

X =重塑(X, (p, n));

为了确保预处理数据保持图像,绘制在第一观察X

图imshow(重塑(X (1:), sqrt (p) * [1]), [],'InitialMagnification',“健康”)

提取的特征

计算机视觉工具箱™提供了几种特征提取技术的图像。一种这样的技术是面向梯度(HOG)的特征直方图的提取。要了解如何培养使用HOG特征的ECOC型号,请参阅使用HOG特征的数字分类(计算机视觉工具箱)。有关其他受支持技术的详细信息,请参见万博1manbetx局部特征检测与提取(计算机视觉工具箱)。本例使用重新缩放的像素强度作为预测变量。

火车和优化分类模型

线性SVM模型通常应用于图像数据集进行分类。然而,SVM是二元分类器,并有在所述数据集10层可能的类。

您可以通过创建多个二进制SVM学习的多类模型fitcecocfitcecoc结合使用编码设计的多个二进制学习者。默认,fitcecoc施加一个抗一种设计,其指定基于从对类的所有组合的HMM训练二进制学习者。例如,在具有10类的问题,fitcecoc要培养45个二进制SVM模型。

一般来说,当你训练分类模型,你应该调整超参数,直到获得满意的泛化误差。也就是说,你应该交叉验证模型的特定套超参数的,然后比较了倍-的误判率。

您可以选择自己的超参数值集,也可以指定实现贝叶斯优化。(有关贝叶斯优化的一般细节,请参见贝叶斯优化工作流程)。此示例在选择的值网格上执行交叉验证。

为了交叉验证基于训练观察的支持向量机二进制学习者的ECOC模型,使用5倍交叉验证。虽然预测值有相同的范围,但为了避免在训练过程中出现数值困难,将预测值标准化。同时,优化ECOC编码设计和SVM盒约束。使用这些值的所有组合:

  • 对于ECOC编码的设计,使用一个抗一个和一个抗所有。

  • 对于SVM盒约束,使用三个从0.1到100的对数间隔值。

对于所有型号,存储5倍交叉验证错分率。

编码= {“onevsone”'onevsall'};boxconstraint = logspace (1、2、3);cvLoss =南(元素个数(编码),元素个数(boxconstraint));%的预先配置对于I = 1:numel(编码)对于t = templateSVM(“BoxConstraint”,boxconstraint(j)的“标准化”,真正的);CVMdl = fitcecoc(X(idxTrn,:),Y(idxTrn),“学习者”,T,'KFold'5,'编码',编码{I});cvLoss(I,J)= kfoldLoss(CVMdl);fprintf中('用%s编码和框约束= cvLoss =%f表示模型%F \ N',cvLoss(I,J),编码{I},boxconstraint(J))结束结束
cvLoss = 0.052083对模型中使用onevsone编码和框约束= 0.100000 cvLoss使用onevsone编码和框约束为模型= 0.055000 = 3.162278 cvLoss使用onevsone编码和框约束为模型= 0.050000 = 100.000000 cvLoss使用onevsall编码和框约束为模型= 0.116667= 0.100000 cvLoss使用onevsall编码和框约束= 3.162278 cvLoss使用onevsall编码和框约束为模型= 0.125000 = 100.000000为模型= 0.123750

确定产生最小误分类率的超参数指数。使用训练数据训练ECOC模型。对训练数据进行标准化,并提供观察到的最优超参数组合。

minCVLoss =分钟(cvLoss(:))
minCVLoss = 0.0500
linIdx =查找(cvLoss == minCVLoss);[bestI,bestJ = ind2sub(的大小(cvLoss),linIdx)bestCoding = {编码} bestI
bestCoding = ' onevsone '
bestBoxConstraint = boxconstraint(bestJ)
bestBoxConstraint = 100
T = templateSVM(“BoxConstraint”bestBoxConstraint,“标准化”,真正的);Mdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”,T,'编码',bestCoding);

构建用于测试集的图像的混淆矩阵。

testImages = X(idxTest,:);testLabels =预测(MDL,testImages);混淆矩阵= confusionchart(Y(idxTest),testLabels);

对角元素和非对角元素分别对应于正确分类和错误分类的观测值。MDL似乎可以正确地分类大多数图像。

如果您满意的性能MDL,然后可以继续生成用于预测的代码。否则,您可以继续调整超参数。例如,您可以尝试使用不同的核函数训练SVM学习者。

将分类模型保存到磁盘

MDL是预测分类模型,但是你必须对代码生成做准备。保存MDL到您当前的工作目录saveLearnerForCoder

saveLearnerForCoder(MDL,“DigitImagesECOC”)

saveLearnerForCoder契约MDL,将其转换为一个结构阵列,并且在MAT-文件保存它DigitImagesECOC.mat

定义代码生成的预测函数

定义一个名为入口点函数predictDigitECOC.m该执行以下操作:

  • 包括代码生成指令% # codegen某处功能。

  • 接受图像数据相称X

  • 加载DigitImagesECOC.mat使用loadLearnerForCoder

  • 返回预测标签。

类型predictDigitECOC.m%predictDigitECOC.m文件的显示内容
功能标记= predictDigitECOC(X)%#代码生成%PREDICTDIGITECOC分类数字图像中使用ECOC模型%PREDICTDIGITECOC分类上述28逐28图像X的使用%的紧凑模型ECOC在文件DigitImagesECOC.mat的行,然后%在标签返回类的标签。CompactMdl = loadLearnerForCoder( 'DigitImagesECOC.mat');标记=预测(CompactMdl,X);结束

注意:如果单击此页面右上方的按钮,并在MATLAB®中打开此示例,则MATLAB®将打开示例文件夹。这个文件夹包含了入口函数文件。

验证预测函数返回相同的测试集作为标签预测

pfLabels = predictDigitECOC(testImages);verifyPF = ISEQUAL(pfLabels,testLabels)
verifyPF =逻辑1

isequal返回逻辑1 (真正),这意味着所有的输入是相等的。该predictDigitECOC产生预期的结果。

决定哪些环境中执行生成的代码

生成的代码可以运行:

  • 里面的MATLAB环境下为C-MEX文件

  • 外MATLAB环境作为一个独立的可执行文件

  • 在MATLAB环境之外作为一个链接到另一个独立可执行文件的共享实用程序

这个例子产生在MATLAB环境中运行一个MEX文件。产生这样的MEX文件可以在MATLAB环境之外部署功能之前测试使用MATLAB工具生成的代码。在MEX功能,可以包括验证码,但不适用于代码生成,通过使用声明的命令外源性coder.extrinsic。外部命令可以包括不支持代码生成的函数。万博1manbetx所有MEX函数中的外部命令都运行在MATLAB中,但是codegen不会为它们生成代码。

如果您计划部署在MATLAB环境之外的代码,那么你就必须产生一个独立的可执行文件。指定编译器的选择的方法之一是使用配置选择codegen。例如,要生成静态C可执行文件,请指定配置:exe您打电话的时候codegen。有关设置代码生成选项的详细信息,请参阅配置选择codegen

编译MATLAB函数来MEX文件

编译predictDigitECOC.m到MEX文件中使用codegen。指定这些选项:

  • -报告-生成编译报告,识别原始MATLAB代码和相关文件codegen在代码生成期间创建。

  • arg游戏- MATLAB编码器需要您指定的所有功能,输入参数属性。要做到这一点的方法之一是提供codegen输入值示例。因此,MATLAB编码器推断的性质从示例值。指定与之匹配的测试集图像X

codegenpredictDigitECOC-报告arg游戏{testImages}
代码生成成功:查看报表

codegen成功生成预测函数的代码。您可以通过单击命令行上的链接来查看报告。如果代码生成不成功,则该报告可以帮助您调试。

codegen创建目录PWD /代码生成/ MEX / predictDigitECOC,其中PWD你当前的工作目录。在子目录,codegen产生,除其他事项外,MEX文件predictDigitECOC_mex.mexw64

验证MEX文件返回的标签与预测

mexLabels = predictDigitECOC_mex(testImages);verifyMEX = ISEQUAL(mexLabels,testLabels)
verifyMEX =逻辑1

isequal返回逻辑1 (真正),这意味着MEX文件产生预期的结果。

另请参阅

|||

相关的话题