主要内容

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

イメージ分類用のコードの生成

この例では,学習済み分類モデルを使用して数字のイメージを分類するMATLAB®関数からCコードを生成する方法を示します。この例では,猪特徴を使用した数字の分類(计算机视觉工具箱)に代わるワークフローを示します。ただし,この例のコード生成手順に従えば,上記の例におけるコード生成をサポートできます。

自動化されたイメージ分類は,どこにでもあるツールです。たとえば,学習済みの分類器は,撮影した映像で地上の異常を自動的に識別するためにドローンに配備したり,手紙に書かれている手書きの郵便番号をスキャンする機械に装備できます。後者の例では,機械が郵便番号を見つけて個々の数字のイメージを格納した後で,装備された分類器は郵便番号を再構成するためにどの数字がイメージに含まれているかを判断しなければなりません。

この例では,ラスターイメージのピクセル強度に基づいて数字を分類するようにマルチクラス誤り訂正出力符号(ECOC)分類モデルの学習と最適化を行う方法を示します。このECOCモデルにはバイナリサポートベクターマシン(SVM)学習器が含まれています。次に,学習済みモデルを使用して新しいイメージを分類するCコードを生成する方法を示します。データは各種のフォントのゆがんだ数字による人工的なイメージで,手書きの数字をシミュレートしています。

Cコンパイラの設定

C / c++コードを生成するには,適切に設定されているC / c++コンパイラにアクセスできなければなりません。MATLAB编码器™は,サポートされているインストール済みのコンパイラを探して使用します。墨西哥人设置を使用すると,既定のコンパイラを表示および変更できます。詳細は,既定のコンパイラの変更を参照してください。

前提条件と制限

Cコードを生成するため,MATLAB编码器は,

  • 適切に設定されたコンパイラを必要とします。

  • サポートされる関数を,定義するMATLAB関数内に含める必要があります。基本的なワークフローについては,コード生成の紹介を参照してください。

  • 定義した関数の入力引数としてオブジェクトを禁止します。

最後の制限については,以下に注意してください。

  • 学習済みの分類モデルはオブジェクトです。

  • MATLAB编码器は学習済みモデルを使用して観測値を分類するための预测をサポートしますが,モデルのあてはめはサポートしません。

分類に関するコード生成の制限に対処するには,MATLABを使用して分類モデルに学習をさせてから,生成されたモデルオブジェクトをsaveLearnerForCoderに渡します。関数saveLearnerForCoderは,予測には必要ないプロパティを削除してから,学習済みモデルを構造体配列としてディスクに格納します。モデルと同じように,構造体配列には新しい観測値の分類に使用される情報が格納されます。

モデルをディスクに保存した後で,loadLearnerForCoderを使用してMATLAB関数でモデルを読み込みます。関数loadLearnerForCoderは,保存された構造体配列を読み込んでから,モデルオブジェクトを再構築します。MATLAB関数では、観測値を分類するためにモデルと予測子データセット (これらは関数の入力引数として使用可能) を预测に渡すことができます。

分類用のコード生成のワークフロー

イメージ分類器をデバイスに展開する前に,以下を行います。

  1. 十分な量のラベル付けされたイメージを取得する。

  2. イメージから抽出する特徴量を決定する。

  3. 分類モデルに学習をさせ,最適化する。この手順には,適切なアルゴリズムの選択とハイパーパラメーター,つまり学習時にあてはめが行われないモデルパラメーターの調整が含まれます。

  4. saveLearnerForCoderを使用してモデルをディスクに保存する。

  5. 新しいイメージを分類する関数を定義する。この関数は,loadLearnerForCoderを使用してモデルを読み込む必要があり,分類スコアなどのラベルを返せるものです。

  6. Cコンパイラを設定する。

  7. 生成されたコードを実行する環境を決定する。

  8. 関数のCコードを生成する。

データの読み込み

digitimagesデータセットを読み込みます。

负载digitimages

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

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

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

データから9つのランダムなイメージを表示します。

数字j = 1:9 subplot(3,3,j) selectImage = datasample(images,1,3);imshow (selectImage [])结束

データの再スケーリング

生のピクセル強度はばらつきが大きいので,分類モデルに学習をさせる前に値を正規化する必要があります。範囲が区間[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);结束

または、图像处理工具箱™のライセンスがある場合は,mat2grayを使用して効率的にイメージのピクセル強度を[0,1]に再スケーリングできます。詳細は,mat2gray(图像处理工具箱)を参照してください。

データの形状変更

コードを生成する場合,学習用の予測子データは数値変数の表または数値行列に格納されていなければなりません。

データの形状を行列に変更して,予測子変数(ピクセル強度)を列,イメージ(観測値)を行に対応させます。重塑は列単位で要素を処理するので,結果を転置しなければなりません。

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

データを前処理してもイメージが変化しないことを確認するため,Xの1番目の観測値をプロットします。

图imshow(重塑(X (1:), sqrt (p) * [1]), [],“InitialMagnification”“健康”

特徴量の抽出

计算机视觉工具箱™には,イメージの特徴量を抽出する手法がいくつか用意されています。このような手法の1つは,勾配方向ヒストグラム(猪)という特徴量の抽出です。猪特徴量を使用してECOCモデルに学習をさせる方法については,猪特徴を使用した数字の分類(计算机视觉工具箱)を参照してください。サポートされる他の手法の詳細については、局所特徴の検出と抽出(计算机视觉工具箱)を参照してください。この例では,再スケーリングしたピクセル強度を予測子変数として使用します。

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

多くの場合,分類用のイメージデータセットには線形SVMモデルが適用されます。しかし,SVMはバイナリ分類器であり,データセット内には10のクラスがある可能性があります。

複数のバイナリSVM学習器が含まれているマルチクラスモデルは,fitcecocを使用して作成できます。fitcecocは符号化設計を使用して複数のバイナリ学習器を結合します。既定では,fitcecocは対1の設計を適用します。この設計では,クラスのペアの組み合わせすべての観測値に基づいてバイナリ学習器に学習をさせるよう指定します。たとえば10個のクラスがある問題の場合,fitcecocは45個のバイナリSVMモデルに学習をさせなければなりません。

一般に,分類モデルに学習をさせる場合は,満足できる汎化誤差が得られるまでハイパーパラメーターを調整する必要があります。つまり,特定のハイパーパラメーターのセットについてモデルを交差検証し,分割外誤分類率を比較する必要があります。

独自のハイパーパラメーターの値のセットを選択するか,ベイズ最適化を実装するよう指定できます(ベイズ最適化の全般的な詳細についてはベイズ最適化のワークフローを参照)。この例では,選択した値のグリッドに対して交差検証を行います。

学習観測値に基づいてSVMバイナリ学習器のECOCモデルを交差検証するため,5分割の交差検証を使用します。予測子の値は同じ範囲にありますが,学習時の数値的な問題を回避するため,予測子を標準化します。また,ECOCの符号化設計とSVMのボックス制約を最適化します。以下の値の組み合わせをすべて使用します。

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

  • SVMのボックス制約については,0.1から100の範囲にある対数間隔の3つの値を使用します。

すべてのモデルについて,5分割の交差検証済み誤分類率を格納します。

编码= {“onevsone”“onevsall”};boxconstraint = logspace(1、2、3);cvLoss =南(元素个数(编码),元素个数(boxconstraint));%的预先配置i = 1:元素个数(编码)j = 1:numel(boxconstraint) t = templateSVM(“BoxConstraint”boxconstraint (j),“标准化”,真正的);CVMdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“KFold”5,“编码”、编码{我});cvLoss (i, j) = kfoldLoss (CVMdl);流('cvLoss =%f for model using %s coding and box constraint=%f\n'cvLoss (i, j),编码{我},boxconstraint (j))结束结束
使用onevsone cvLoss = 0.052083的模型编码和盒子使用onevsone约束= 0.100000 cvLoss = 0.055000模型编码和盒子使用onevsone约束= 3.162278 cvLoss = 0.050000模型编码和盒子使用onevsall约束= 100.000000 cvLoss = 0.116667模型编码和盒子约束= 0.100000 cvLoss = 0.123750模型使用onevsall编码和框约束=3.162278 cvLoss = 0.125000的模型使用onevsall编码和框约束=100.000000

誤分類率が最小になるハイパーパラメーターのインデックスを決定します。学習データを使用してECOCモデルに学習をさせます。学習データを標準化し,観測された最適なハイパーパラメーターの組み合わせを指定します。

minCVLoss = min (cvLoss (:))
minCVLoss = 0.0500
linIdx = find(cvLoss == minCVLoss);[bestI, bestJ] = ind2sub(大小(cvLoss), linIdx);bestCoding编码= {bestI}
bestCoding = ' onevsone '
bestBoxConstraint = boxconstraint (bestJ)
bestBoxConstraint = 100
t = templateSVM (“BoxConstraint”bestBoxConstraint,“标准化”,真正的);Mdl = fitcecoc (X (idxTrn:), Y (idxTrn),“学习者”t“编码”, bestCoding);

検定セットのイメージについて混同行列を作成します。

testImages = X (idxTest:);testImages testLabels =预测(Mdl);confusionMatrix = confusionchart (Y (idxTest), testLabels);

対角線上の要素は正しく分類された観測値に,対角線外の要素は誤って分類された観測値に対応します。Mdlはほとんどのイメージを正しく分類すると考えることができます。

Mdlの性能が満足できるものになった場合は,予測用のコードの生成に進むことができます。それ以外の場合は,引き続きハイパーパラメーターを調整します。たとえば,異なるカーネル関数を使用してSVM学習器の学習を試すことができます。

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

Mdlは予測分類モデルですが,コード生成用に準備しなければなりません。saveLearnerForCoderを使用してMdlを現在の作業ディレクトリに保存します。

saveLearnerForCoder (Mdl“DigitImagesECOC”

saveLearnerForCoderMdlをコンパクトにし,構造体配列に変換し,垫ファイルDigitImagesECOC.matに保存します。

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

以下を行うpredictDigitECOC.mという名前のエントリポイント関数を定義します。

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

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

  • loadLearnerForCoderを使用してDigitImagesECOC.matを読み込む。

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

类型predictDigitECOC.m%显示predictDigitECOC内容。m文件
% predictDigitECOC使用文件DigitImagesECOC中的compact ECOC模型%对X行中28 × 28的图像进行分类。,然后%返回label中的类标签。CompactMdl = loadLearnerForCoder(“DigitImagesECOC.mat”);标签=预测(CompactMdl X);结束

メモ:このページの右上にあるボタンをクリックしてこの例をMATLABで開くと,MATLABで例のフォルダーが開きます。このフォルダーには,エントリポイント関数のファイルが含まれています。

予測関数が预测と同じ検定セットのラベルを返すことを確認します。

pfLabels = predictDigitECOC (testImages);verifyPF = isequal (pfLabels testLabels)
verifyPF =逻辑1

isequalは,すべての入力が等しいことを意味する逻辑1 (真正的)を返します。predictDigitECOCは,予想された結果を生成します。

生成されたコードを実行する環境の決定

生成されたコードは,以下のように実行できます。

  • MATLAB環境内でC-MEXファイルとして

  • MATLAB環境外でスタンドアロンの実行可能ファイルとして

  • MATLAB環境外で別のスタンドアロンの実行可能ファイルにリンクされた共有ユーティリティとして

この例では,MATLAB環境で実行する墨西哥人ファイルを生成します。このような墨西哥人ファイルを生成すると,関数をMATLAB環境外に展開する前にMATLABのツールを使用して,生成されたコードをテストできます。coder.extrinsic(MATLAB编码器)を使用してコマンドを外部コマンドとして宣言すると,コード生成用ではなく検証用のコードを墨西哥人関数に含めることができます。外部コマンドには,コード生成をサポートしない関数を含められます。墨西哥人関数内の外部コマンドはすべてMATLABで動作しますが,codegenはそれらについてコード生成を行いません。

MATLAB環境外にコードを展開する場合,スタンドアロンの実行可能ファイルを生成しなければなりません。コンパイラの選択を指定する方法の1つは,codegen配置オプションの使用です。たとえば,静的なC実行可能ファイルを生成するには,codegenを呼び出すときに配置:exeを指定します。コード生成オプションの設定の詳細については、配置codegen(MATLAB编码器)オプションを参照してください。

墨西哥人ファイルへのMATLAB関数のコンパイル

codegenを使用してpredictDigitECOC.mをコンパイルし,墨西哥人ファイルを生成します。次のオプションを指定します。

  • 报告——コンパイルレポートを生成します。このレポートでは,元のMATLABコードと,コード生成時にcodegenが作成した関連ファイルを識別できます。

  • arg游戏——MATLAB编码器を使用するには,関数の入力引数すべてのプロパティを指定する必要があります。これを行う方法の1つとして,入力値の例をcodegenに与えます。すると,MATLAB编码器は値の例からプロパティを推測します。Xに相応する検定セットのイメージを指定します。

codegenpredictDigitECOC报告arg游戏{testImages}
代码生成成功:查看报告

codegenは予測関数のコードを正常に生成しました。コマンドウィンドウで查看报告リンクをクリックするか,打开(“codegen /墨西哥人/ predictDigitECOC / html / report.mldatx”)と入力するとレポートを表示できます。コードの生成に失敗した場合,レポートはデバッグに役立ちます。

codegenpwd / codegen /墨西哥人/ predictDigitECOCというディレクトリを作成します。松材线虫病は現在の作業ディレクトリです。codegenは,predictDigitECOC_mex.mexw64という墨西哥人ファイルも子ディレクトリ内に生成します。

墨西哥人ファイルが预测と同じラベルを返すことを確認します。

mexLabels = predictDigitECOC_mex (testImages);verifyMEX = isequal (mexLabels testLabels)
verifyMEX =逻辑1

関数isequalは,墨西哥人ファイルが期待どおりの結果になったことを示す逻辑1 (真正的)を返します。

参考

|||(MATLAB编码器)

関連するトピック