主要内容

系统对象的分类和代码生成

这个例子展示了如何从一个MATLAB®系统生成C代码对象™分类的图像数字通过使用一个训练分类模型。这个示例还展示了如何使用分类的系统对象模型®。万博1manbetx使用MATLAB函数上的系统对象的好处是,系统对象更适合处理大量的流数据。更多细节,请参阅系统对象是什么?

这个例子是基于代码生成的图像分类,这是另一种工作流数字分类使用猪特性(计算机视觉工具箱)

加载数据

加载digitimages

负载digitimages.mat

图片是28 -通过- 28 - 3000组吗uint16整数。每一页是一个栅格图像的数字。每个元素都是一个像素强度。相应的标签在3000 -,- 1数字向量Y。更多细节,回车描述在命令行中。

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

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

重新调节数据

重新调节像素强度,以便他们在区间[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的风骚女子);结束

重塑数据

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

重塑数据矩阵,预测变量对应列和图像对应于行。因为重塑需要列元素,转置其结果。

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

火车和优化分类模型

旨在一个ECOC SVM模型的二进制学习者基于训练观察和随机森林。用5倍交叉验证。

ECOC模型,指定预测标准化和优化分类错误ECOC编码设计和支持向量机框约束。探讨所有这些值的组合:

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

  • 对于支持向量机框约束,使用三个对数间隔值从0.1到100年。所有模型、存储5倍旨在误分类率。

编码= {“onevsone”“onevsall”};boxconstraint = logspace (1、2、3);cvLossECOC =南(元素个数(编码),元素个数(boxconstraint));%的预先配置i = 1:元素个数(编码)j = 1:元素个数(boxconstraint) t = templateSVM (“BoxConstraint”boxconstraint (j),“标准化”,真正的);CVMdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“KFold”5,“编码”、编码{我});cvLossECOC (i, j) = kfoldLoss (CVMdl);流(“cvLossECOC使用% s = % f模型编码和盒子约束= % f \ n ',cvLossECOC (i, j),编码{我},boxconstraint (j))结束结束
使用onevsone cvLossECOC = 0.058333的模型编码和盒子使用onevsone约束= 0.100000 cvLossECOC = 0.057083模型编码和盒子使用onevsone约束= 3.162278 cvLossECOC = 0.050000模型编码和盒子使用onevsall约束= 100.000000 cvLossECOC = 0.120417模型编码和盒子使用onevsall约束= 0.100000 cvLossECOC = 0.121667模型编码和盒子使用onevsall约束= 3.162278 cvLossECOC = 0.127917模型编码和盒子约束= 100.000000

随机森林的不同分歧的最大数量使用序列中的值 { 3 2 , 3 3 , , 3 } 。m是这样 3 不大于n- 1。复制随机预测的选择,指定“重现”,真的

n =大小(X, 1);m =地板(log (n - 1) / log (3));maxNumSplits = 3。^ (2: m);cvLossRF =南(元素个数(maxNumSplits));i = 1:元素个数(maxNumSplits) t = templateTree (“MaxNumSplits”maxNumSplits(我),“复制”,真正的);CVMdl = fitcensemble (X (idxTrn:), Y (idxTrn),“方法”,“包”,“学习者”t“KFold”5);cvLossRF (i) = kfoldLoss (CVMdl);流(' cvLossRF = % f模型使用% d分裂\ n的最大数量的,cvLossRF(我),maxNumSplits(我))结束
cvLossRF使用9 = 0.319167为模型的最大数量的分裂cvLossRF = 0.192917模型使用27分裂cvLossRF = 0.066250的最大数量的模型使用81作为分裂cvLossRF = 0.015000的最大数量模型使用243作为分裂cvLossRF = 0.013333的最大数量模型使用729作为分裂cvLossRF = 0.009583的最大数量模型使用2187作为分裂的最大数量

对于每一个算法,确定hyperparameter指数收益率最小误分类率。

minCVLossECOC = min (cvLossECOC (:))
minCVLossECOC = 0.0500
linIdx =找到(cvLossECOC = = minCVLossECOC, 1);[bestI, bestJ] = ind2sub(大小(cvLossECOC), linIdx);bestCoding编码= {bestI}
bestCoding = ' onevsone '
bestBoxConstraint = boxconstraint (bestJ)
bestBoxConstraint = 100
minCVLossRF = min (cvLossRF (:))
minCVLossRF = 0.0096
linIdx =找到(cvLossRF = = minCVLossRF, 1);[bestI, bestJ] = ind2sub(大小(cvLossRF), linIdx);bestMNS = maxNumSplits (bestI)
bestMNS = 2187

随机森林达到一个更小的旨在误分类率。

火车一个ECOC模型使用训练数据和随机森林。提供最优hyperparameter组合。

t = templateSVM (“BoxConstraint”bestBoxConstraint,“标准化”,真正的);MdlECOC = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“编码”,bestCoding);t = templateTree (“MaxNumSplits”,bestMNS);MdlRF = fitcensemble (X (idxTrn:), Y (idxTrn),“方法”,“包”,“学习者”t);

为测试样本图像创建一个变量,使用训练模型预测测试样品标签。

testImages = X (idxTest:);testLabelsECOC =预测(MdlECOC testImages);testLabelsRF =预测(MdlRF testImages);

分类模型保存到磁盘

MdlECOCMdlRF预测分类模型,但是你必须准备代码生成。保存MdlECOCMdlRF你现在的工作文件夹使用saveLearnerForCoder

saveLearnerForCoder (MdlECOC“DigitImagesECOC”);saveLearnerForCoder (MdlRF“DigitImagesRF”);

创建系统对象的预测

创建两个系统对象,一个用于ECOC模型,另一个用于随机森林,:

  • 通过使用加载以前保存的训练模型loadLearnerForCoder

  • 顺序的预测一步方法。

  • 执行没有大小改变输入数据。

  • 实施双精度,标量输出。

类型ECOCClassifier.m%显示ECOCClassifier内容。m文件
classdef ECOCClassifier < matlab。从训练ECOC模型系统% ECOCCLASSIFIER预测图像标签% % ECOCCLASSIFIER加载训练从% | DigitImagesECOC ECOC模型。垫|,新的观察和预测标签%基于训练模型。% |“DigitImagesECOC ECOC模型。米at'| was cross-validated using the training data % in the sample data |digitimages.mat|. properties(Access = private) CompactMdl % The compacted, trained ECOC model end methods(Access = protected) function setupImpl(obj) % Load ECOC model from file obj.CompactMdl = loadLearnerForCoder('DigitImagesECOC'); end function y = stepImpl(obj,u) y = predict(obj.CompactMdl,u); end function flag = isInputSizeMutableImpl(obj,index) % Return false if input size is not allowed to change while % system is running flag = false; end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end end end
类型RFClassifier.m%显示RFClassifier内容。m文件
classdef RFClassifier < matlab。系统% RFCLASSIFIER预测图像标签从训练随机森林% % RFCLASSIFIER加载从% |“DigitImagesRF训练随机森林。垫|,预测新观察%基于标签训练模型。随机森林DigitImagesRF |”。米at'| % was cross-validated using the training data in the sample data % |digitimages.mat|. properties(Access = private) CompactMdl % The compacted, trained random forest end methods(Access = protected) function setupImpl(obj) % Load random forest from file obj.CompactMdl = loadLearnerForCoder('DigitImagesRF'); end function y = stepImpl(obj,u) y = predict(obj.CompactMdl,u); end function flag = isInputSizeMutableImpl(obj,index) % Return false if input size is not allowed to change while % system is running flag = false; end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end end end

注意:如果单击按钮位于这个页面的右上角部分并在MATLAB®开设这个例子,然后用MATLAB®打开示例文件夹。这个文件夹包含的文件中使用这个例子。

系统对象基本要求,请参阅定义基本系统对象

定义代码生成的预测功能

定义两个MATLAB函数调用predictDigitECOCSO.mpredictDigitRFSO.m。功能:

  • 包括代码生成指令% # codegen

  • 接受的图像数据X

  • 预测标签使用ECOCClassifierRFClassifier分别系统对象。

  • 回归预测标签。

类型predictDigitECOCSO.m%显示predictDigitECOCSO内容。m文件
函数标签= predictDigitECOCSO (X) % # codegen % predictDigitECOCSO数字使用ECOC模型在图像分类系统对象% predictDigitECOCSO分类28-by-28图像的行X %使用紧凑ECOC模型系统中的对象ECOCClassifier和%然后返回类标签标签。分类器= ECOCClassifier;标签=(分类器,X)步;结束
类型predictDigitRFSO.m%显示predictDigitRFSO内容。m文件
函数标签= predictDigitRFSO (X) % # codegen % predictDigitRFSO数字使用射频模型在图像分类系统对象% predictDigitRFSO分类28-by-28图像的行X %使用紧凑的系统对象RFClassifier随机森林,和%然后返回类标签的标签。分类器= RFClassifier;标签=(分类器,X)步;结束

墨西哥人文件编制MATLAB函数

编译的预测功能,达到更好的一个墨西哥人文件用测试样本的准确性codegen。通过使用指定测试集的图像arg游戏论点。

如果(minCVLossECOC < = minCVLossRF) codegenpredictDigitECOCSOarg游戏testImages其他的codegenpredictDigitRFSOarg游戏testImages结束
代码生成成功。

确认生成的墨西哥人文件产生相同的预测MATLAB函数。

如果(minCVLossECOC < = minCVLossRF) mexLabels = predictDigitECOCSO_mex (testImages);verifyMEX =总和(mexLabels = = testLabelsECOC) = =元素个数(testLabelsECOC)其他的mexLabels = predictDigitRFSO_mex (testImages);verifyMEX =总和(mexLabels = = testLabelsRF) = =元素个数(testLabelsRF)结束
verifyMEX =逻辑1

verifyMEX1,这表明所做的预测生成的墨西哥人文件和相应的MATLAB函数是相同的。

通过使用系统对象模型预测标签万博1manbetx

创建一个视频文件,显示测试集的图像帧。

v = VideoWriter (“testImages.avi”,未压缩的AVI的);v。帧速率= 1;开放(v);昏暗的= sqrt (p) * [1];j = 1:尺寸(testImages, 1) writeVideo (v,重塑(testImages (j:),暗));结束关闭(v);

定义一个函数调用scalePixelIntensities.m将RGB图像转换为灰度图,然后天平结果像素强度,这样他们的价值观在区间[0,1]。

类型scalePixelIntensities.m%显示scalePixelIntensities内容。m文件
函数x = scalePixelIntensities (imdat) % scalePixelIntensities尺度图像像素强度% scalePixelIntensities尺度图像的像素强度%,结果x是一个行向量的值区间[0,1]。imdat = rgb2gray (imdat);minimdat = min (min (imdat));maximdat = max (max (imdat));x = (imdat - minimdat) / (maximdat - minimdat);结束

加载仿真软件®模型万博1manbetxslexClassifyAndDisplayDigitImages.slx

SimMdlName =“slexClassifyAndDisplayDigitImages”;open_system (SimMdlName);

图显示仿真软件®模型。万博1manbetx开始模拟,从多媒体文件块加载测试集图像的视频文件。每个图像的视频:

  • 从多媒体文件块的28-by-28矩阵转换和输出图像像素强度。

  • 过程数据块鳞片像素强度使用scalePixelIntensities.m,输出1 -到- 784矢量的强度。

  • 分类子系统块预测标签的图像数据进行处理。块选择最小化分类误差的系统对象。在这种情况下,块选择随机森林。块输出双精度标量标签。

  • 数据类型转换块把标签转换为int32标量。

  • 插入文本块嵌入预测当前帧标签。

  • 视频显示块显示注释。

模拟模型。

sim (SimMdlName)

600年模型显示所有测试集图像和它的快速预测。最后的形象依然在视频显示。您可以生成预测,显示相应的图片一个一个点击一步按钮。

如果你也有一个仿真软件®编码器™许可证万博1manbetx,然后你可以从生成C代码slexClassifyAndDisplayDigitImages.slx在仿真万博1manbetx软件®或从命令行slbuild(万博1manbetx模型)。更多细节,请参阅为一个模型生成C代码(万博1manbetx仿真软件编码器)

另请参阅

|||

相关的话题