主要内容

代码生成的图像分类

这个例子展示了如何从一个MATLAB®函数,生成C代码使用训练分类模型的分类图像数字。这个例子演示了另一种工作流数字分类使用猪特性(计算机视觉工具箱)。然而,支持代码生成在这个金宝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. 火车和优化分类模型。这一步包括选择一个适当的算法和调优hyperparameters,也就是说,模型参数不适合在培训。

  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 = min (min (X (:,:, i)));maxX = max (max (X(:,:我)));X (:,:, i) = (X(:,:我)——风骚女子)/ (maxX的风骚女子);结束

或者,如果你有一个图像处理工具箱™许可证,你就可以有效地重新调节图像的像素强度[0,1]使用mat2gray。更多细节,请参阅mat2gray(图像处理工具箱)

重塑数据

代码生成的预测数据训练必须在一个表中数值变量或一个数字矩阵。

重塑数据矩阵,预测变量(像素强度)对应列,和图像(观测)行。因为重塑需要列元素,你必须转置其结果。

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

以确保预处理数据维护形象,情节第一次观察到X

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

提取的特征

计算机视觉工具箱™提供了几种特征提取图像的技术。这样一个面向技术是提取直方图的梯度(猪)特性。学习如何使用猪火车ECOC模型特性,明白了数字分类使用猪特性(计算机视觉工具箱)。其他受支持的技术细节,请参阅金宝app当地的特征检测和提取(计算机视觉工具箱)。下面的例子使用了新像素强度作为预测变量。

培训和优化分类模型

线性支持向量机模型通常被应用于图像数据集分类。然而,支持向量机二元分类器,可能有10类的数据集。

您可以创建多个二进制SVM学习者使用的多级模型fitcecocfitcecoc结合多个二进制学习者使用的编码设计。默认情况下,fitcecocone-versus-one设计,适用于指定培训二进制学习者基于观测对类的组合。例如,在10类的问题,fitcecoc必须训练45二进制SVM模型。

一般来说,当你训练一个分类模型,你应该调整hyperparameters直到你达到一个令人满意的泛化误差。也就是说,你应该旨在为特定组hyperparameters模型,然后比较out-of-fold误分类率。

你可以选择你自己的组hyperparameter值,或您可以指定实现贝叶斯优化。(一般贝叶斯优化的细节,请参阅贝叶斯优化工作流程)。这个例子执行交叉验证选择网格的值。

旨在一个ECOC模型的二进制学习者基于SVM训练观察,使用5倍交叉验证。虽然预测的值具有相同的范围内,以避免数值困难在训练,规范预测。同时,优化ECOC编码设计和支持向量机框约束。使用所有这些值的组合:

  • ECOC编码设计,使用one-versus-one和one-versus-all。

  • 对于支持向量机框约束,使用三个对数间隔值从0.1到100年。

所有模型、存储5倍旨在误分类率。

编码= {“onevsone”“onevsall”};boxconstraint = logspace (1、2、3);cvLoss =南(元素个数(编码),元素个数(boxconstraint));%的预先配置i = 1:元素个数(编码)j = 1:元素个数(boxconstraint) t = templateSVM (“BoxConstraint”boxconstraint (j),“标准化”,真正的);CVMdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“KFold”5,“编码”、编码{我});cvLoss (i, j) = kfoldLoss (CVMdl);流(“cvLoss使用% s = % f模型编码和盒子约束= % 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模型编码和盒子使用onevsall约束= 0.100000 cvLoss = 0.123750模型编码和盒子使用onevsall约束= 3.162278 cvLoss = 0.125000模型编码和盒子约束= 100.000000

确定hyperparameter指数收益率最小误分类率。火车一个ECOC模型使用训练数据。标准化的训练数据和观察到的供应,优化hyperparameter组合。

minCVLoss = min (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:);testImages testLabels =预测(Mdl);confusionMatrix = confusionchart (Y (idxTest), testLabels);

对角线和非对角元素对应于正确和错误分类的观察,分别。Mdl似乎大多数图像正确分类。

如果你是满意的性能Mdl预测,那么你可以继续生成代码。否则,你可以继续调整hyperparameters。例如,您可以尝试使用不同的核函数训练SVM学习者。

分类模型保存到磁盘

Mdl是一个预测分类模型,但是你必须准备代码生成。保存Mdl你现在的工作目录saveLearnerForCoder

saveLearnerForCoder (Mdl“DigitImagesECOC”)

saveLearnerForCoder契约Mdl,将其转换为一个结构数组,并将它保存在MAT-fileDigitImagesECOC.mat

定义代码生成的预测函数

定义一个入口点函数命名predictDigitECOC.m做以下几点:

  • 包括代码生成指令% # codegen在这个函数。

  • 接受的图像数据X

  • 负载DigitImagesECOC.mat使用loadLearnerForCoder

  • 回归预测标签。

类型predictDigitECOC.m%显示predictDigitECOC内容。m文件
函数标签= predictDigitECOC (X) % # codegen % predictDigitECOC分类数字使用ECOC模型在图像% predictDigitECOC分类28-by-28图像行X使用%紧凑DigitImagesECOC ECOC模型文件。垫,然后%返回类标签标签。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环境中运行。产生这样一个墨西哥人文件允许您测试使用MATLAB工具生成的代码部署函数之前在MATLAB环境。在墨西哥人的功能,您可以包括验证的代码,而不是代码生成,通过声明外部使用的命令coder.extrinsic(MATLAB编码器)。外部命令可以包含函数,没有代码生成的支持。金宝app所有外在的命令在墨西哥人函数在MATLAB运行,但是codegen不生成代码。

如果你计划部署代码在MATLAB环境,那么你必须生成一个独立的可执行文件。指定你的编译器选择的一种方法是通过使用配置选择codegen。例如,生成一个静态C可执行文件,指定配置:exe当你打电话codegen。设置代码生成选项的更多细节,请参阅配置选择codegen(MATLAB编码器)

墨西哥人文件编制MATLAB函数

编译predictDigitECOC.m墨西哥人文件使用codegen。指定这些选项:

  • 报告编译,生成一个报告,该报告将原始的MATLAB代码和相关的文件codegen创建在代码生成。

  • arg游戏——MATLAB编码器要求您指定的属性函数输入参数。一种方法是提供codegen与输入值的一个例子。因此,MATLAB编码器推断的属性示例值。指定测试集的图像X

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

codegen成功地预测函数的代码生成。您可以查看报告通过单击查看报告链接或通过输入打开(“codegen /墨西哥人/ predictDigitECOC / html / report.mldatx”)在命令窗口中。如果代码生成失败,那么该报告可以帮你调试。

codegen创建目录pwd / codegen /墨西哥人/ predictDigitECOC,在那里松材线虫病是你现在的工作目录。在子目录中,codegenMEX-file生成等predictDigitECOC_mex.mexw64

验证墨西哥人文件返回相同的标签预测

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

isequal返回逻辑1 (真正的),这意味着MEX-file收益预期的结果。

另请参阅

|||(MATLAB编码器)

相关的话题