主要内容

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

这个例子展示了如何从MATLAB®System对象™生成C代码,该对象使用训练过的分类模型对数字图像进行分类。这个例子还展示了如何在Simulink®中使用System对象进行分类。金宝app使用System对象比使用MATLAB函数的好处是System对象更适合处理大量的流数据。有关更多详细信息,请参阅什么是系统对象?

这个例子是基于代码生成图像分类,这是另一种工作流利用HOG特征进行数字分类(计算机视觉工具箱)

加载数据

加载数字贴图

加载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 minx = min(min(x(:,:,i)));maxx = max(max(x(:,:,i))));x(:,:i)=(x(:,:,i) -  minx)/(maxx  -  minx);结束

重塑数据

对于代码生成,用于训练的预测器数据必须在一个由数字变量或数字矩阵组成的表中。

将数据重塑为一个矩阵,以便预测变量对应列,图像对应行。因为重塑按列取元素,转置其结果。

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

训练和优化分类模型

基于训练观察,交叉验证支持向量机二值学习器和随机森林的ECOC模型。用5倍交叉验证。

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

  • 对于Ecoc编码设计,请使用一个与One和One Verse-All。

  • 对于SVM框约束,使用每次0.1到100的三个对数间隔值。对于所有型号,存储5倍交叉验证的错误分类率。

编码= {'OneVsone'“onevsall”};boxconstraint = logspace(1、2、3);cvLossECOC =南(元素个数(编码),元素个数(boxconstraint));%的预先配置为了i = 1:元素个数(编码)为了j = 1:numel(boxconstraint) t = templateSVM(“BoxConstraint”,boxconstraint(j),“标准化”,真正的);CVMdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“KFold”5,...'编码'、编码{我});cvLossECOC (i, j) = kfoldLoss (CVMdl);FPRINTF('cvLossECOC =%f for model using %s coding and box constraint=%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模型编码和盒子约束= 0.100000 cvLossECOC =0.121667 for model using oneevsall coding and box constraint=3.162278 cvLossECOC = 0.127917 for model using oneevsall coding and box constraint=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: nummel (maxnumpartitions) t = templateTree(“MaxNumSplits”maxNumSplits(我),“复制”,真正的);CVMdl = fitcensemble (X (idxTrn:), Y (idxTrn),“方法”“包”“学习者”t...“KFold”5);cvlossrf(i)= kfoldloss(cvmdl);FPRINTF('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的最大数量split cvLossRF = 0.009583使用2187作为分割的最大数量的模型

对于每个算法,确定产生最小误分类率的超参数指标。

mincvlossecoc = min(cvlossecoc(:))
Mincvlossecoc = 0.0500.
linidx = find(cvlossecoc == mincvlossecoc,1);[besti,bestj] = Ind2sub(大小(cvlossecoc),linidx);Bestcoding = Coding {Besti}
bestCoding = ' onevsone '
bestBoxConstraint = boxconstraint (bestJ)
bestBoxConstraint = 100
mincvlossrf = min(cvlossrf(:))
minCVLossRF = 0.0096
linidx = find(cvlossrf == mincvlossrf,1);[besti,bestj] = Ind2sub(大小(cvlossrf),linidx);BESTMNS = MAXNUMSPLITS(BESTI)
BESTMNS = 2187.

随机森林达到较小的交叉验证错误分类率。

使用训练数据训练ECOC模型和随机森林。提供最优超参数组合。

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

SavelAlnerForCoder(MDLecoc,“DigitImagesECOC”);saveLearnerForCoder (MdlRF'digitimagesrf');

为预测创建系统对象

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

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

  • 按顺序预测一步方法。

  • 强制输入数据不改变大小。

  • 强制双精度、标量输出。

类型ECOCClassifier.m%显示ECOCClassifier内容。m文件
< matlab. classdef ECOCClassifier% ECOCCLASSIFIER从% |'DigitImagesECOC加载训练过的ECOC模型。Mat '|,并根据训练模型预测新观测值%的标签。在% |'DigitImagesECOC。米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文件
< matlab。系统% RFCLASSIFIER从训练的随机森林预测图像标签% % RFCLASSIFIER从% |'DigitImagesRF加载训练的随机森林。Mat '|,并根据训练模型的%预测新观测值的标签。|'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%predictigitecocso使用ecoc模型系统对象%predictigitecocso使用系统对象eCocclassifier中的Compact Ecoc模型分类X%行中的28×28图像中的28×28图像然后返回标签中的类标签。分类器= eCocclassifier;标签=(分类器,X)步;结束
类型predictDigitRFSO.m%显示predictDigitRFSO的内容。m文件
函数标签= predictDigitRFSO (X) % # codegen % predictDigitRFSO数字使用射频模型在图像分类系统对象% predictDigitRFSO分类28-by-28图像的行X %使用紧凑的系统对象RFClassifier随机森林,和%然后返回类标签的标签。分类器= RFClassifier;标签=(分类器,X)步;结束

编译MATLAB函数到MEX文件

通过使用,对MEX文件编写预测函数,实现更好的测试样本精度codegen.使用使用指定测试设置图像arg游戏论点。

如果(mincvlosecoc <= minCVLossRF) codegen预测附图arg游戏testImages别的codegenpredictdigitrfso.arg游戏testImages结束
代码生成成功。

验证生成的MEX文件是否生成与MATLAB函数相同的预测。

如果(mincvlosecoc <= minCVLossRF) mexLabels = predictDigitECOCSO_mex(testestimages);verifyMEX = sum(mexLabels == testLabelsECOC) == numel(testLabelsECOC)别的mexLabels = predictDigitRFSO_mex (testImages);verifyMEX = sum(mexLabels == testLabelsRF) == numel(testLabelsRF)结束
verifyMEX =逻辑1

verifyMEX1,这表明由生成的MEX文件和相应的MATLAB函数所做的预测是相同的。

在Simulink中使用系统对象预测标签金宝app

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

v = VideoWriter ('testimages.avi''未压缩的avi');V.Framerate = 1;开放(v);dim = sqrt(p)* [1 1];为了j = 1:size(testImages,1) writeVideo(v,重塑(testImages(j,:),dim));结束关闭(v);

定义一个调用的函数scalePixelIntensities.m该算法将RGB图像转换为灰度,然后对得到的像素强度进行缩放,使其值处于区间[0,1]。

类型scalePixelIntensities.m%显示scalepixelintensity内容。m文件
函数x = scalepixelInceities(IMDAT)%ScalepixelIntsities尺度图像像素强度%scalepixelitions尺寸缩放图像的像素强度,结果x是间隔中值的值的行矢量%。imdat = rgb2gray(imdat);最小值= min(min(imdat));maximdat = max(max(imdat));X =(IMDAT  -  MILEDDAT)/(MAXIMDAT  -  MINEDDAT);结束

加载Simulin金宝appk®模型slexClassifyAndDisplayDigitImages.slx

simmdlname =.“slexClassifyAndDisplayDigitImages”;open_system (SimMdlName);

图中显示了Simulink®模型。金宝app在仿真开始时,从多媒体文件块加载测试集图像的视频文件。对于视频中的每个图像:

  • 从多媒体文件块转换并输出图像为28 × 28像素强度矩阵。

  • 过程数据块通过使用缩放像素强度scalePixelIntensities.m,并输出一个按比例放大的1乘784的强度向量。

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

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

  • 插入文本块将预测的标签嵌入到当前帧中。

  • 到视频显示块显示注释的帧。

模拟模型。

sim (SimMdlName)

该模型快速显示所有600个测试设置图像及其预测。最后一个图像保留在视频显示中。您可以通过单击“逐个”生成预测并将其显示相应的图像向前一步按钮。

如果您还有Simulink®Coder金宝app™许可证,那么您可以生成C代码slexClassifyAndDisplayDigitImages.slx在Si金宝appmulink®或从命令行使用slbuild(金宝appSimulink).有关更多详细信息,请参阅为模型生成C代码(金宝app仿真软件编码器)

另请参阅

|||

相关话题