主要内容

代码生成图像分类

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

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

这个例子展示了如何训练和优化一个多类纠错输出码(ECOC)分类模型,以根据光栅图像中的像素强度对数字进行分类。ECOC模型包含二进制支持向量机(SVM)学习者。金宝app然后,这个例子展示了如何生成C代码,使用训练过的模型对新的图像进行分类。数据是模拟手写数字的各种字体的变形数字的合成图像。

设置您的C编译器

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

假设和局限性

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

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

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

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

关于最后一个限制,请考虑:

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

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

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

将模型保存到磁盘后,使用MATLAB功能加载模型loadlearnerforcoder..的loadlearnerforcoder.函数加载保存的结构数组,然后重构模型对象。在MATLAB函数中,要对观察结果进行分类,可以将模型和预测器数据集作为函数的输入参数传递给预测

分类工作流的代码生成

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

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

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

  3. 训练和优化分类模型。这一步包括选择合适的算法和调优超参数,即训练过程中模型参数不适合的情况。

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

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

  6. 设置您的C编译器。

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

  8. 为函数生成C代码。

加载数据

加载数字贴图数据集。

加载数字贴图

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

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

RNG(1)%的再现性n =大小(图片3);p =元素个数(图片(:,:1));本量利= cvpartition (n,'坚持',0.20);Idxtrn =培训(CVP);iDxtest =测试(CVP);

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

数字为了j = 1:9 subplot(3,3,j) selectImage = datasample(images,1,3);imshow (selectImage [])结尾

重新调节数据

因为原始像素强度变化很大,所以应该在训练分类模型之前对其值进行归一化。重新调整像素强度,使其在区间[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”'合身'

提取特征

计算机视觉工具箱™提供了几种图像特征提取技术。其中一种技术是梯度直方图特征的提取。要学习如何使用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:元素个数(编码)为了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))结尾结尾
使用onevsone cvLoss = 0.052083的模型编码和盒子使用onevsone约束= 0.100000 cvLoss = 0.055000模型编码和盒子使用onevsone约束= 3.162278 cvLoss = 0.050000模型编码和盒子使用onevsall约束= 100.000000 cvLoss = 0.116667模型编码和盒子约束= 0.100000 cvLoss = 0.123750模型使用onevsall编码和框约束=3.162278 cvLoss = 0.125000的模型使用onevsall编码和框约束=100.000000

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

minCVLoss = min (cvLoss (:))
Mincvloss = 0.0500.
linIdx = find(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'编码',最佳崇拜);

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

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

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

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

将分类模型保存到磁盘

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

saveLearnerForCoder (Mdl“DigitImagesECOC”

saveLearnerForCoder紧凑型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 /墨西哥人/ predictDigitECOC / html / report.mldatx”)在命令窗口。如果代码生成不成功,那么报告可以帮助您进行调试。

Codegen.创建目录pwd / codegen /墨西哥人/ predictDigitECOC,在那里松材线虫病是您当前的工作目录。在子目录中,Codegen.在其他事情中生成mex文件predictigigitecoc_mex.mexw64

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

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

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

也可以看看

|||(MATLAB编码器)

相关话题