主要内容

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

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

这个例子是基于代码生成图像分类,这是一个替代工作流程数字分类使用HOG功能(电脑视觉工具箱)

加载数据

加载数字贴图

加载digitimages.mat

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

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

RNG(1);重复性的%n =大小(图像,3);p = numel(图像(:,:,1));cvp = 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 = double(图像);为了i = 1:n minx = min(min(x(:,:,i)));maxx = max(max(x(:,:,i))));x(:,:,i)=(x(:,:,i) -  minx)/(maxx  -  minx);结尾

重塑数据

对于代码生成,用于训练的预测数据必须位于数字变量表或数字矩阵的表中。

将数据重新塑造到矩阵,使得预测变量对应于列和图像对应于行。因为重塑采用元素列 - 明智,转换结果。

x = RESHAPE(x,[p,n])';

火车和优化分类模型

基于培训观察,交叉验证SVM二进制学习者的ECOC模型和随机林。使用5倍交叉验证。

对于ecoC模型,请指定预测标准化并通过ECOC编码设计和SVM框约束优化分类错误。探索这些值的所有组合:

  • 对于ecoC编码设计,请使用一个与one-one-verse-all。

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

编码= {'Onevsone''Onevsall'};boxconstraint = logspace(-1,2,3);CVLOSSECOC = NAN(NUMER(编码),NUMER(BOXCONSTRAINT));预付百分比为了i = 1:numel(编码)为了j = 1:numel(boxconstraint)t = templatesvm('boxconstraint',boxconstraint(j),'标准化',真的);cvmdl = fitcecoc(x(idxtrn,:),y(idxtrn),'学习者',t,'kfold',5,......'编码',编码{i});cvlossecoc(i,j)= kfoldloss(cvmdl);fprintf('cvlossecoc =%f用于模型使用%s编码和框约束=%f \ n'......cvlossecoc(i,j),编码{i},boxconstraint(j))结尾结尾
CVLOSSECOC = 0.058333用于模型使用OneVSONE编码和框架约束= 0.057083用于使用Onevsone编码和框约束= 3.162278 CVLossecoc = 0.050000使用OneVSONE编码和框约束= 100.000000 CVLossecoc = 0.120417用于模型,使用OneVSALL编码和框约束= 0.100000 CVLOSSECOC = 0.121667用于型号使用OneVSALL编码和框约束= 3.162278 CVLOSSECOC = 0.127917使用OneVSALL编码和框约束约束= 100.000000

对于随机林,通过使用序列中的值来改变最大分割数 { 3. 2 3. 3. 3. m } 。m是这样的 3. m 不大于N- 1.重现随机预测指标选择,指定'可重复',真实

n =尺寸(x,1);m =楼层(日志(n  -  1)/ log(3));maxnumsplits = 3. ^(2:m);cvlossrf = nan(numel(maxnumsplits));为了i = 1:numel(maxnumsplits)t = templatetree('maxnumsplits',maxnumsplits(i),'可重复',真的);cvmdl = fitcensemble(x(idxtrn,:),y(idxtrn),'方法''包''学习者',t,......'kfold'5);cvlossrf(i)= kfoldloss(cvmdl);fprintf(“CVLOSSRF =%f用于模型使用%d作为最大分裂数\ n'......cvlossrf(i),maxnumsplits(i))结尾
用于模型的CVLOSSRF = 0.319167使用27使用27的模型的最大分割CVLOSSRF = 0.192917,作为使用81的模型的最大分割数,因为使用243使用243作为最大数量的SPLITS CVLOSSRF = 0.015000的最大数量使用2187使用2187作为最大分割CVLOSSRF = 0.009583的型号的型号的分裂CVLOSSRF = 0.013333。使用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 =查找(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,'编码',最佳崇拜);t = templatetree('maxnumsplits',bestmns);mdlrf = fitcensemble(x(idxtrn,:),y(idxtrn),'方法''包''学习者',t);

为测试样本图像创建一个变量,并使用经过培训的模型来预测测试样本标签。

testimages = x(iDxtest,:);testlabelsecoc = predict(mdlecoc,testimages);testlabelsrf = predict(mdlrf,testimages);

将分类模型保存到磁盘

mdlecoc.mdlrf.是预测性分类模型,但您必须为代码生成做好准备。保存mdlecoc.mdlrf.使用您的当前工​​作文件夹Savelarnerforcoder.

SavelAlnerForCoder(MDLecoc,'digitimagesecoc');SavelAlnerForCoder(MDLRF,'digitimagesrf');

为预测创建系统对象

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

  • 通过使用加载先前保存的培训模型loadlearnerforcoder.

  • 通过序列预测方法。

  • 强制对输入数据进行大小更改。

  • 强制执行双精度,标量输出。

类型Ecocclassifier.m.%显示ecocclassifier.m文件的内容
ClassDef Ecocclassifier 
              
类型rfclassifier.m.%显示rfclassifier.m文件的内容
classdef rfclassifier 
              

笔记:如果单击此页面的右上角的按钮,请在MATLAB®中打开此示例,然后Matlab®打开示例文件夹。此文件夹包括此示例中使用的文件。

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

定义代码生成的预测函数

定义调用的两个MATLAB函数预测地迪立索索姆predictdigitrfso.m.。功能:

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

  • 接受与之相称的图像数据X

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

  • 返回预测标签。

类型预测地迪立索索姆%显示predictdigitecoco.mm文件的内容
函数标签= predictigitecocso(x)%#codegen%predictigigocso使用ecoc模型系统对象%predictigiTecocso使用系统对象eCocclassifier中的Compact Ecoc模型分类x%行中的28×28图像中的28×28图像然后返回标签中的类标签。分类= ecocclassifier;标签=步骤(分类器,x);结尾
类型predictdigitrfso.m.%显示predictdigitrfso.m文件的内容
函数标签= predictdigitrfso(x)%#codegen%predictdigitrfso使用rf模型系统对象%predictdigitrfso使用系统对象Rfclassifier中的Compact随机林等行中分类了28×28的图像,以及%然后返回标签中的类标签。分类器= RFCLAssifier;标签=步骤(分类器,x);结尾

将MATLAB函数编译为MEX文件

编译通过使用实现更好地测试 - 样本精度的预测功能Codegen.。使用该测试设置图像- args.争论。

如果(mincvlossecoc <= mincvlossrf)codegen预测附图标准索索-  args.testimages别的Codegen.predictdigitrfso.-  args.testimages结尾
代码成功。

验证生成的MEX文件会产生与MATLAB功能相同的预测。

如果(mincvlossecoc <= mincvlossrf)mexlabels = predictdigitecocso_mex(testimages);verifymex = sum(mexlabels == testlabelsecoc)== numel(testlabelsecoc)别的mexlabels = predictdigitrfso_mex(testimages);verifymex = sum(mexlabels == testlabelsrf)== numel(testlabelsrf)结尾
验证ex =.逻辑1

验证ex.1,表示由生成的MEX文件和相应的MATLAB函数所做的预测是相同的。

通过使用Simulink中的系统对象预测标签金宝app

创建一个视频文件,该文件显示逐帧测试设置图像。

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

定义一个调用的函数scalepixelintensities.m将RGB图像转换为灰度,然后缩放结果的像素强度,以使其值在间隔中[0,1]。

类型scalepixelintensities.m%显示scalepixelintensities.m文件的内容
函数X = ScalepixelIntsities(IMDAT)%scalepixelIntsities尺度图像像素强度%scalepixelitions缩放图像的像素强度这样的百分比,结果x是间隔中的值的一行向量[0,1]。imdat = rgb2gray(imdat);最小值= min(min(imdat));maximdat = max(max(imdat));X =(IMDAT  - 最小DAT)/(maximdat  - 最小DAT);结尾

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

simmdlname ='slexclassifyanddisplaypigitimages';Open_System(SIMMDLNAME);

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

  • 来自多媒体文件块转换并将图像输出到像素强度的28×28矩阵。

  • 过程数据块通过使用缩放像素强度scalepixelintensities.m,并输出一个1×784向量的缩放强度。

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

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

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

  • TO键显示块显示注释帧。

模拟模型。

SIM(SIMMDLNAME)

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

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

也可以看看

|||

相关话题