主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

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

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

データの読み込み

digitimagesを読み込みます。

负载digitimages.mat

图片uint163000年整数の28日28 xの配列です。各ページは数字のラスターイメージです。各要素はピクセル強度です。対応するラベルは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 =双(图片);minX = min(min(X(:,:,i)));maxX = max (max (X(:,:我)));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 =南(元素个数(编码),元素个数(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);流('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);流('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编码= {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は予測分類モデルですが,これらをコード生成用に準備する必要があります。saveLearnerForCoderを使用してMdlECOCMdlRFを現在の作業フォルダーに保存します。

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

予測用系统对象の作成

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

  • 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®で例のフォルダーが開きます。このフォルダーには,この例で使用しているファイルが含まれています。

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

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

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

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

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

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

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

类型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游戏を使用して検定セットのイメージを指定します。

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

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

万博1manbetx仿真软件で系统对象を使用したラベルの予測

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

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);

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

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

万博1manbetx仿真软件®モデルslexClassifyAndDisplayDigitImages.slxを読み込みます。

SimMdlName =“slexClassifyAndDisplayDigitImages”;open_system (SimMdlName);

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

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

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

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

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

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

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

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

sim (SimMdlName)

600年個の検定セットのイメージおよびその予測が素早く表示されます。最後のイメージがビデオ表示に残ります。代わりに[ステップを進める]ボタンをクリックすると,1つずつ予測を生成して対応するイメージと共に表示できます。

万博1manbetx仿真软件®编码器™のライセンスもある場合,仿真软件®のslexClassifyAndDisplayDigitImages.slxまたはコマンドラインからslbuild(万博1manbetx模型)を使用してCコードを生成できます。詳細は,モデル用Cコードの生成(万博1manbetx仿真软件编码器)を参照してください。

参考

|||

関連するトピック