主要内容

分類およびコド生成用の系统对象

この例では,学習済み分類モデルを使用して数字のイメージを分類するMATLAB®系统对象™からCコードを生成する方法を示します。また,金宝appSimulink®での分類に系统对象を使用する方法も示します。MATLAB関数ではなく System object を使用する利点は、System object の方が大量のストリーミング データの処理に適しているということです。詳細は、系统对象とはを参照してください。

この例は,Hog特徴を使用した数字の分類(计算机视觉工具箱)の代替ワ,クフロ,であるイメージ分類用のコードの生成をベ,スとしています。

デ,タの読み込み

digitimagesを読み込みます。

负载digitimages.mat

图片uint16整数の28 x 28 x 3000の配列です。各ペジは数字のラスタメジです。各要素はピクセル強度です。対応するラベルは3000行1列の数値ベクトルYに格納されています。詳細にいては,コマンドランで描述を入力してください。

観測値の個数と予測子変数の個数を格納します。デタの20%ホルドアウトを指定するデタ分割を作成します。学習セットと検定セットの▪▪ンデックスをデ▪▪タ分割から抽出します。

rng (1);%用于再现性N = size(图片,3);P = numel(images(:,:,1));CVP = cvpartition(n,“坚持”, 0.20);idxTrn = training(cvp);idxTest = test(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 =重塑(X,[p,n])';

分類モデルの学習と最適化

学習観測値に基づいて,SVMバイナリ学習器によるECOCモデルとランダムフォレストを交差検証します。5分割交差検証を使用します。

ECOCモデルについて,予測子の標準化を指定し,ECOCの符号化設計とSVMのボックス制約に対して分類誤差を最適化します。次の値の組み合わせをすべて探索します。

  • Ecocの符号化設計にいては,1対1と1対他を使用します。

  • SVMのボックス制約については,0.1から100の範囲にある対数間隔の3つの値を使用します。すべてのモデルにいて,5分割の交差検証済み誤分類率を格納します。

编码= {“onevsone”“onevsall”};Boxconstraint = logspace(-1,2,3);cvLossECOC = nan(数字(编码),数字(boxconstraint));预分配百分比I = 1:数字(编码)j = 1: number (boxconstraint) t = templateSVM(“BoxConstraint”boxconstraint (j),“标准化”,真正的);CVMdl = fitcecoc(X(idxTrn,:)),Y(idxTrn),“学习者”t“KFold”5,...“编码”、编码{我});cvLossECOC(i,j) = kfoldLoss(CVMdl);流('cvLossECOC =%f用于使用%s编码的模型,并且框约束=%f\n'...cvLossECOC (i, j),编码{我},boxconstraint (j))结束结束
使用onevsone编码的cvLossECOC = 0.058333,框约束=0.100000,使用onevsone编码的cvLossECOC = 0.057083,框约束=3.162278,使用onevsone编码的cvLossECOC = 0.050000,框约束=100.000000,使用onevsall编码的cvLossECOC = 0.120417,使用onevsall编码的cvLossECOC =0.100000,使用onevsall编码的cvLossECOC = 0.121667,使用onevsall编码的cvLossECOC = 0.127917,框约束=100.000000

ランダムフォレストにいて, 3. 2 3. 3. 3. という数列の値を使用して最大分割数を変化させます。Mは, 3. n- 1を超えない値です。無作為な予測子の選択を再現するため,“重现”,真的を指定します。

n = size(X,1);M = log(n - 1)/log(3);maxnumsplitting = 3.^(2:m);cvLossRF = nan(nummel (maxnumsplitting));i = 1:数字(maxnum) t = templateTree(“MaxNumSplits”maxNumSplits(我),“复制”,真正的);CVMdl = fitcensemble(X(idxTrn,:),Y(idxTrn),“方法”“包”“学习者”t...“KFold”5);cvLossRF(i) = kfoldLoss(CVMdl);流('cvLossRF = %f用于使用%d作为最大分割次数的模型\n'...cvLossRF(我),maxNumSplits(我))结束
cvLossRF = 0.319167,对于使用9作为最大分裂次数的模型,cvLossRF = 0.192917,对于使用27作为最大分裂次数的模型,cvLossRF = 0.066250,对于使用81作为最大分裂次数的模型,cvLossRF = 0.015000,对于使用729作为最大分裂次数的模型,cvLossRF = 0.013333,对于使用2187作为最大分裂次数的模型,cvLossRF = 0.009583

各アルゴリズムにいて,誤分類率が最小になるハパパラメタのンデックスを決定します。

minCVLossECOC = min(cvLossECOC(:)))
minCVLossECOC = 0.0500
linIdx = find(cvLossECOC == minCVLossECOC,1);[bestI,bestJ] = ind2sub(size(cvlossecc),linIdx);bestCoding =编码{bestI}
bestCoding = 'onevsone'
bestBoxConstraint = boxconstraint(bestJ)
bestBoxConstraint = 100
minCVLossRF = min(cvLossRF(:))
minCVLossRF = 0.0096
linIdx = find(cvLossRF == minCVLossRF,1);[bestI,bestJ] = ind2sub(size(cvLossRF),linIdx);bestMNS = maxnumsplitting (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 = predict(MdlECOC,testImages);testLabelsRF = predict(MdlRF,testImages);

ディスクへの分類モデルの保存

MdlECOCMdlRFは予測分類モデルですが,これらをコ,ド生成用に準備する必要があります。saveLearnerForCoderを使用してMdlECOCMdlRFを現在の作業フォルダ,に保存します。

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

予測用系统对象の作成

ECOCモデル用とランダムフォレスト用に1つずつ,以下を行う2つの系统对象を作成します。

  • loadLearnerForCoderを使用して,以前に保存された学習済みモデルを読み込む。

  • 一步メソッドにより逐次予測を行う。

  • 入力デタのサズ変更を抑止する。

  • 倍精度のスカラ,出力を強制する。

类型ECOCClassifier.m显示ECOCClassifier的内容。m文件
classdef ECOCClassifier < matlab。从训练好的ECOC模型中预测图像标签% % ECOCCLASSIFIER从% |' digittimagesecoc中加载训练好的ECOC模型。Mat '|,并基于训练过的模型预测新观测值%的标签。ECOC模型在% |' digittimagesecoc中。米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加载训练好的随机森林。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®で例のフォルダーが開きます。このフォルダには,この例で使用しているファルが含まれています。

系统对象の基本的な要件にいては,基本的な系统对象の定義を参照してください。

コ,ド生成用の予測関数の定義

predictDigitECOCSO.mおよびpredictDigitRFSO.mという名前の2のmatlab関数を定義します。これらの関数では以下を行います。

  • コ,ド生成命令% # codegenを含める。

  • Xに相応するメジデタを受け入れる。

  • 系统对象ECOCClassifierおよびRFClassifierをそれぞれ使用してラベルを予測する。

  • 予測したラベルを返す。

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

Mexファaapl . exeルへのmatlab関数のコンパaapl . exeル

codegenを使用して,検定標本精度が優れている予測関数をコンパesc escルしてmexファesc escルにします。引数arg游戏を使用して検定セットの▪▪メ▪▪ジを指定します。

如果(minCVLossRF)代码原predictDigitECOCSOarg游戏testImages其他的codegenpredictDigitRFSOarg游戏testImages结束
代码生成成功。

生成されたmexファesc escルがmatlab関数と同じ予測を行うことを確認します。

如果(minCVLossRF <= minCVLossRF) mexLabels = predictDigitECOCSO_mex(testImages);verifyMEX = sum(mexLabels == testLabelsECOC) == numel(testLabelsECOC)其他的mexLabels = predictDigitRFSO_mex(testImages);verifyMEX = sum(mexLabels == testLabelsRF) == nummel (testLabelsRF)结束
verifyMEX =逻辑1

verifyMEX1です。これは,生成された墨西哥人ファイルおよび対応するMATLAB関数で予測が同じであることを示します。

金宝appSimulinkで系统对象を使用したラベルの予測

検定セットのメジをフレム単位で表示するビデオファルを作成します。

v = VideoWriter(“testImages.avi”未压缩的AVI的);v.FrameRate = 1;开放(v);Dim =√(p)*[1 1];j = 1:大小(testImages,1) writeVideo(v,重塑(testImages(j,:),dim));结束关闭(v);

RGBイメージをグレースケールに変換してから,生成されたピクセル強度を値が区間[0,1]に収まるようにスケーリングする,scalePixelIntensities.mという名前の関数を定義します。

类型scalePixelIntensities.m显示scalePixelIntensities的内容。m文件
函数x = scalepixelintenties (imdat) % scalepixelintenties缩放图像像素强度% scalepixelintenties缩放图像像素强度%,使得结果x是区间[0,1]中的值的行向量。Imdat = rgb2gray(Imdat);Minimdat = min(min(imdat));Maximdat = max(max(imdat));X = (imdat - minimdat)/(maximdat - minimdat);结束

金宝appSimulink®モデルslexClassifyAndDisplayDigitImages.slxを読み込みます。

SimMdlName =“slexClassifyAndDisplayDigitImages”;open_system (SimMdlName);

金宝appSimulink®モデルが图に表示されます。シミュレーションの最初に,从多媒体文件ブロックで検定セットのイメージのビデオファイルが読み込まれます。ビデオの各▪▪メ▪▪ジに▪▪いて以下を行います。

  • 从多媒体文件ブロックで,イメージを変換して28行28列のピクセル強度の行列を出力します。

  • 过程数据ブロックで,scalePixelIntensities.mを使用してピクセル強度をスケーリングし,行784列のスケーリングされた強度のベクトルを出力します。

  • 分类子系统ブロックで,与えられた処理済みイメージデータからラベルを予測します。このブロックでは,分類誤差が最小になる系统对象を選択します。この場合,ランダムフォレストが選択されます。このブロックでは,倍精度スカラ,のラベルを出力します。

  • 数据类型转换ブロックで,ラベルをint32スカラ,に変換します。

  • 插入文本ブロックで,予測されたラベルを現在のフレ,ムに埋め込みます。

  • 视频显示ブロックで,注釈付きのフレ,ムを表示します。

モデルをシミュレ,トします。

sim (SimMdlName)

600個の検定セットのメジおよびその予測が素早く表示されます。最後の▪▪メ▪▪ジがビデオ表示に残ります。代わりに[ステップを進める]ボタンをクリックすると,1ず。

金宝appSimulink®Coder™のラセンスもある場合,Simulink®のslexClassifyAndDisplayDigitImages.slxまたはコマンドラ@ @ンからslbuild(金宝app模型)を使用してcコ,ドを生成できます。詳細は,モデル用cコ,ドの生成(金宝app仿真软件编码器)を参照してください。

参考

|||

関連するトピック