代码生成的图像分类
这个例子展示了如何从一个MATLAB®函数,生成C代码使用训练分类模型的分类图像数字。这个例子演示了另一种工作流数字分类使用猪特性(计算机视觉工具箱)。然而,支持代码生成在这个万博1manbetx示例中,您可以按照这个例子中的代码生成步骤。
自动图像分类是一个无处不在的工具。例如,训练分类器可以部署到陆地上的无人机自动识别异常捕捉镜头,或机器扫描手写信件的邮政编码。在后者的例子中,机器后发现位数的邮政编码和存储个人图片,已部署的分类器必须猜数字图像重建的邮政编码。
这个例子显示了如何训练和优化多级纠错输出编码(ECOC)分类模型对数字进行分类基于像素强度的光栅图像。ECOC模型包含二进制支持向量机(SVM)的学习者。万博1manbetx然后,这个例子展示了如何生成C代码,使用训练模型对新图像进行分类。数据合成的图像扭曲的各种字体、数字模拟手写数字。
设置您的C编译器
生成C / c++代码,您必须访问一个C / c++编译器配置正确。MATLAB编码器™定位和使用支持,安装编译器。万博1manbetx您可以使用墨西哥人
设置
查看和更改默认编译器。更多细节,请参阅改变默认的编译器。
假设和限制
生成C代码,MATLAB编码器:
需要一个正确配置的编译器。
需要支持的功能在一万博1manbetx个定义的MATLAB函数。基本工作流程,明白了介绍代码生成。
禁止对象作为输入参数的函数定义。
关于过去的限制,考虑到:
训练分类模型对象
MATLAB编码器支持万博1manbetx
预测
观察使用训练模型进行分类,但不支持拟合模型万博1manbetx
为了解决分类代码生成的局限性,使用MATLAB训练分类模型,然后通过生成的模型对象saveLearnerForCoder
。的saveLearnerForCoder
函数删除一些属性不需要预测,训练模型到磁盘,然后保存为一个结构数组。喜欢模型,结构数组中包含了用于分类新观测的信息。
模型保存到磁盘后,加载模型的MATLAB函数使用loadLearnerForCoder
。的loadLearnerForCoder
函数加载保存结构数组,然后重建模型对象。在MATLAB函数中,分类的观察,可以通过模型和预测数据集,可以是一个函数的输入参数,预测
。
代码生成的分类工作流程
在部署一个图像分类器在设备:
获得足够多的标记图像。
决定哪些特征提取的图像。
火车和优化分类模型。这一步包括选择一个适当的算法和调优hyperparameters,也就是说,模型参数不适合在培训。
通过使用模型保存到磁盘
saveLearnerForCoder
。定义一个函数分类新图像。通过使用的函数必须加载模型
loadLearnerForCoder
,可以返回标签,如分类的分数。设置您的C编译器。
决定的环境执行生成的代码。
为函数生成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]区间。也就是说,假设 是像素强度 在图像 。的图像 ,重新调节它的所有像素强度使用这个公式:
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模型特性,明白了数字分类使用猪特性(计算机视觉工具箱)。其他受支持的技术细节,请参阅万博1manbetx当地的特征检测和提取(计算机视觉工具箱)。下面的例子使用了新像素强度作为预测变量。
培训和优化分类模型
线性支持向量机模型通常被应用于图像数据集分类。然而,支持向量机二元分类器,可能有10类的数据集。
您可以创建多个二进制SVM学习者使用的多级模型fitcecoc
。fitcecoc
结合多个二进制学习者使用的编码设计。默认情况下,fitcecoc
one-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编码器)。外部命令可以包含函数,没有代码生成的支持。万博1manbetx所有外在的命令在墨西哥人函数在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
,在那里松材线虫病
是你现在的工作目录。在子目录中,codegen
MEX-file生成等predictDigitECOC_mex.mexw64
。
验证墨西哥人文件返回相同的标签预测
。
mexLabels = predictDigitECOC_mex (testImages);verifyMEX = isequal (mexLabels testLabels)
verifyMEX =逻辑1
isequal
返回逻辑1 (真正的
),这意味着MEX-file收益预期的结果。
另请参阅
saveLearnerForCoder
|loadLearnerForCoder
|预测
|codegen
(MATLAB编码器)