主要内容

代码生成图像分类

这个例子展示了如何从MATLAB®函数生成C代码,该函数使用训练过的分类模型对数字图像进行分类。这个例子演示了另一个工作流数字分类使用HOG功能(电脑视觉工具箱).但是,要在该示例中支持代金宝app码生成,您可以遵循本示例中的代码生成步骤。

自动图像分类是一种普遍存在的工具。例如,培训的分类器可以部署到无人机,以自动识别捕获镜头的土地上的异常,或者到扫描字母上的手写邮政编码的机器。在后一种例子中,机器找到邮政编码并存储数字的单个图像后,部署的分类器必须猜测图像中的哪个数字以重建邮政编码。

此示例显示如何培训和优化多种误差校正输出代码(ECOC)分类模型,以基于光栅图像中的像素强度对数字进行分类。ECOC模型包含二进制支持向量机(SVM)学习者。金宝app然后,此示例显示如何生成使用培训的模型来对新图像进行分类的C代码。数据是各种字体的翘曲数字的合成图像,其模拟了手写的数字。

设置您的C编译器

要生成C / C ++代码,您必须访问正确配置的C / C ++编译器。Matlab Coder™定位并使用支持的安装编译器。金宝app您可以使用梅克斯-设置查看和更改默认编译器。有关更多详细信息,请参阅更改默认编译器

假设和局限性

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

  • 需要一个正确配置的编译器。

  • 需要支持的函数在您金宝app定义的MATLAB函数中。对于基本工作流程,请参阅代码生成简介

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

关于最后的限制,考虑一下:

  • 训练有素的分类模型是对象

  • Matlab编码器支持金宝app预测使用培训的型号对观察分类,但不支持拟合模型金宝app

要解决分类的代码生成限制,请使用MATLAB列车分类模型,然后将生成的模型对象传递给Savelarnerforcoder..这Savelarnerforcoder.函数删除了预测不需要的某些属性,然后将培训的模型保存为磁盘作为结构阵列。与模型一样,结构阵列包含用于对新观察分类的信息。

将模型保存到磁盘后,使用MATLAB功能加载模型loadlearnerforcoder..这loadlearnerforcoder.函数加载保存的结构阵列,然后重建模型对象。在MATLAB函数中,要对观察分类,可以通过模型和预测数据集,这可以是函数的输入参数,到预测

分类工作流的代码生成

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

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

  2. 确定从图像中提取的功能。

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

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

  5. 定义用于对新图像进行分类的函数。该功能必须通过使用加载模型loadlearnerforcoder.,并可以返回标签,例如分类分数。

  6. 设置您的C编译器。

  7. 确定执行生成的代码的环境。

  8. 为函数生成C代码。

加载数据

加载数字贴图数据集。

加载数字贴图

图片是一个28-×28-by-3000的数组uint16整数。每个页面都是数字的光栅图像。每个元素是像素强度。相应的标签位于3000×1数字矢量中y.有关更多详细信息,请输入描述在命令行。

存储预测变量的观测数量和数量。创建一个数据分区,指定持有20%的数据。从数据分区中提取训练和测试集合索引。

RNG(1)%的再现性n =大小(图像,3);p = numel(图像(:,:,1));cvp = cvpartition(n,'坚持',0.20);Idxtrn =培训(CVP);iDxtest =测试(CVP);

显示来自数据的九个随机图像。

数字为了j = 1:9子图(3,3,j)选择id = dataMple(图像,1,3);imshow(选择,[])结尾

重新划分数据

由于原始像素强度很大,因此在培训分类模型之前,您应该将其值正常化。重新归类像素强度,以便它们在间隔中的范围[0,1]。这是,假设 P. 一世 j 是像素强度 j 在图像中 一世 .对于图像 一世 ,使用此公式重新归类其所有像素强度:

P. 一世 j = P. 一世 j - j P. 一世 j 最大限度 j P. 一世 j - j P. 一世 j

x = double(图像);为了i = 1:n minx = min(min(x(:,:,i)));maxx = max(max(x(:,:,i))));x(:,:,i)=(x(:,:,i) -  minx)/(maxx  -  minx);结尾

或者,如果您有图像处理工具箱™许可证,则可以通过使用将图像的像素强度恢复为[0,1]mat2gray..有关更多详细信息,请参阅mat2gray.(图像处理工具箱)

重塑数据

对于代码生成,用于训练的预测数据必须位于数字变量表或数字矩阵的表中。

将数据重新塑造到矩阵,使得预测变量(像素强度)对应于列的列和图像(观察)。因为重塑如果按列取元素,则必须对其结果进行转置。

x = RESHAPE(x,[p,n])';

为确保预处理数据维护图像,请参阅第一次观察X

图imshow(Reshape(x(1,:),sqrt(p)* [1 1]),[],'InitialMagnification''合身'

提取特征

计算机Vision Toolbox™提供了几种用于图像的特征提取技术。一种这样的技术是取向梯度(HOG)特征的直方图的提取。要了解如何使用猪功能训练ecoc模型,请参阅数字分类使用HOG功能(电脑视觉工具箱).有关其他支持技术的详细信息,请参阅金宝app本地特征检测和提取(电脑视觉工具箱).此示例使用重新定义的像素强度作为预测变量。

火车和优化分类模型

线性SVM模型通常应用于分类的图像数据集。但是,SVM是二进制分类器,数据集中有10个可能的类。

您可以使用以下方法创建多个二进制支持向量机学习者的多类模型fitcecoc.fitcecoc.使用编码设计结合多个二进制学习者。默认情况下,fitcecoc.应用一个与一个设计,这指定了基于来自类成对的所有组合的观察来培训二元学习者。例如,在10个类的问题中,fitcecoc.必须培训45个二进制SVM型号。

一般情况下,当您培训分类模型时,您应该调整超级参数,直到达到满意的泛化误差。也就是说,您应该对特定的Hyper参数集进行交叉验证模型,然后比较倍增折叠错误分类率。

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

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

  • 对于ecoC编码设计,请使用一个与one-one-verse-all。

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

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

编码= {'Onevsone''Onevsall'};boxconstraint = logspace(-1,2,3);CVLOSS = NaN(Numel(编码),NumEr(BoxConstraint));%的预先配置为了i = 1:numel(编码)为了j = 1:numel(boxconstraint)t = templatesvm('boxconstraint',boxconstraint(j),'标准化',真正的);CVMdl = fitcecoc (X (idxTrn:), Y (idxTrn),'学习者',t,'kfold'5,......'编码',编码{i});cvloss(i,j)= kfoldloss(cvmdl);fprintf('cvLoss =%f for model using %s coding and box constraint=%f\n'......cvLoss (i, j),编码{我},boxconstraint (j))结尾结尾
CVLOSS = 0.052083对于使用Onevsone编码和框架约束= 0.055000的模型使用OneVsone编码和框架约束= 0.055000,使用OneVSONE编码和框约束= 0.050000使用OneVSALL编码和框约束进行模型的模型= 0.116667= 0.100000 CVLOSS = 0.123750用于使用OneVSALL编码和框约束= 3.162278 CVLOSS = 0.125000使用OneVSALL编码和框约束= 100.000000

确定产生最小错误分类率的超参数指数。使用培训数据列车ecoc模型。标准化培训数据并提供所观察到的最佳的高参数组合。

minCVLoss = min (cvLoss (:))
Mincvloss = 0.0500.
linidx =查找(cvloss == mincvloss);[besti,bestj] = Ind2sub(大小(cvloss),linidx);Bestcoding = Coding {Besti}
Bestcoding ='OneVsone'
bestBoxConstraint = boxconstraint (bestJ)
bestBoxConstraint = 100
t = templatesvm('boxconstraint',bestboxconstraint,'标准化',真正的);mdl = fitcecoc(x(idxtrn,:),y(idxtrn),'学习者',t,'编码',最佳崇拜);

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

testImages = X (idxTest:);testImages testLabels =预测(Mdl);confusionMatrix = confusionchart (Y (idxTest), testLabels);

对角线和偏差元素分别对应于正确和错误的分类观察。MDL.似乎正确分类了大多数图像。

如果您对性能感到满意MDL.,然后您可以继续生成预测代码。否则,您可以继续调整HyperParameters。例如,您可以尝试使用不同的内核函数培训SVM学习者。

将分类模型保存到磁盘

MDL.是一个预测的分类模型,但您必须为代码生成做好准备。节省MDL.到您当前的工作目录使用Savelarnerforcoder.

SavelAlnerForCoder(MDL,“DigitImagesECOC”

Savelarnerforcoder.紧凑型MDL.,将其转换为结构阵列,并将其保存在Mat文件中DigitimageCoc.mat.

定义代码生成的预测函数

定义命名的入口点函数预测地伊提克这有以下内容:

  • 包括代码生成指令%#codegen.在函数的某个地方。

  • 接受与之相称的图像数据X

  • 加载DigitimageCoc.mat.使用loadlearnerforcoder.

  • 返回预测标签。

类型预测地伊提克%显示predictigigitecoc.m文件的内容
函数标签= predictdigitecoc(x)%#codegen%predictigitecoc使用ecoc型号%predictigitecoc对图像中的数字进行分类,在文件DigitimageCoc.mat中的Compact Ecoc模型中使用%Compact Ecoc模型在x行中分类28×28图像。返回标签中的类标签。CompactMDL = LoadLearnerForCoder('digitimageCoc.mat');标签=预测(compactmdl,x);结尾

笔记:如果单击此页面右上角的按钮,请在MATLAB中打开此示例,然后MATLAB打开示例文件夹。此文件夹包含入口点函数文件。

验证预测功能是否返回相同的测试集标签预测

pflabels = predictdigitecoc(testimages);verifypf = isequal(pflabels,testlabels)
verifypf =逻辑1

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

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

生成的代码可以运行:

  • 在Matlab环境中作为C-MEX文件

  • 在Matlab环境之外作为独立可执行文件

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

此示例生成要在MATLAB环境中运行的MEX文件。生成这样的MEX文件允许您使用MATLAB工具在部署MATLAB环境外的函数之前测试生成的代码。在MEX函数中,您可以包括验证的代码,但不能通过将命令声明为外在使用来包括代码生成编码器.Extrinsic.(MATLAB编码器).外部命令可以包括没有代码生成支持的功能。金宝appMEX函数中的所有内在命令在MATLAB中运行,但Codegen.不为它们生成代码。

如果计划在MATLAB环境之外部署代码,则必须生成独立的可执行文件。指定编译器选择的一种方法是使用-Config.选择Codegen..例如,要生成静态C可执行文件,请指定-config:exe.当你打电话Codegen..有关设置代码生成选项的更多详细信息,请参阅-Config.选择Codegen.(MATLAB编码器)

将MATLAB函数编译为MEX文件

编译预测地伊提克使用Codegen..指定这些选项:

  • -报告- 生成一个编译报告,标识原始MATLAB代码和关联的文件Codegen.在代码生成期间创建。

  • - args.- MATLAB编码器要求您指定所有功能输入参数的属性。这样做的一种方法是提供Codegen.使用输入值的示例。因此,MATLAB编码器从示例值中介绍属性。指定与之相称的测试集图像X

Codegen.predictdigitecoc-报告-  args.{testimages}
代码成功:查看报告

Codegen.成功生成了预测函数的代码。单击您可以查看报告查看报告链接或进入打开('codegen / mex / predictdigitecoc / html / export.mldatx')在命令窗口。如果代码生成不成功,那么报告可以帮助您进行调试。

Codegen.创建目录PWD / Codegen / MEX / predictdigitecoc, 在哪里PWD是你的现在的工作目录。在孩子目录中,Codegen.在其他事情中生成mex文件predictigigitecoc_mex.mexw64

验证MEX文件是否返回相同的标签预测

mexlabels = predictdigitecoc_mex(testimages);verifymex = isequal(mexlabels,testlabels)
verifyMEX =逻辑1

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

也可以看看

|||(MATLAB编码器)

相关话题