Main Content

固定小数点展開用の行動認識 Simulink モデル

この例では、センサー信号に基づいて人間の行動を分類する Simulink® モデルをコード生成および低電力ハードウェアへの展開用に準備する方法を示します。この例では、BBC micro:bit デバイスへの展開に対応している Simulink の分類モデルを提供します。まず、BBC micro:bit 用の Simulink Coder™ サポート パッケージをアドオン エクスプローラーからダウンロードしてインストールします。その後、分類モデルに学習させ、Simulink モデルをターゲット デバイスに展開します。

標本データ セットの読み込み

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

load humanactivity

humanactivity データ セットには、人間の次の 5 種類の身体動作についての 24,075 個の観測値が含まれています。座る、立つ、歩く、走る、踊るです。各観測値には、スマートフォンの加速度センサーによって測定された加速度データから抽出した 60 個の特徴量が含まれています。このデータ セットには、以下の変数が含まれています。

  • actid — 整数による行動 ID が格納されている応答ベクトル。1 ~ 5 はそれぞれ、座る、立つ、歩く、走る、踊る、を表します。

  • actnames — 整数の行動 ID に対応する行動名。

  • feat — 24,075 個の観測値に対する 60 個の特徴量が格納されている特徴量行列。

  • featlabels — 60 個の特徴量のラベル。

humanactivity データ セットの作成には、センサー HAR (行動認識) アプリ [1] が使用されました。このアプリで生の加速度データを測定するときに、人間はスマートフォンを上下逆さまにして画面が人間側を向く状態でポケットに入れていました。ソフトウェアでは、測定した生データをこれに従って較正し、較正したデータから 60 個の特徴量を抽出しました。較正と特徴抽出の詳細については、[2][3] をそれぞれ参照してください。後で説明する Simulink モデルでは生の加速度データも使用しており、較正および特徴抽出用のブロックが含まれています。

固定小数点展開用にメモリ フットプリントを減らすために、学習させた分類器でデータ セットの最初の 15 個の特徴量のみを使用するように指定します。

feat = feat(:,1:15);
featlabels = featlabels(1:15);

データの準備

この例では、5 種類の行動を分類するモデルに学習をさせるために観測値の 90% を、学習済みモデルの検証に観測値の 10% を使用します。cvpartition を使用して、テスト セット用に 10% のホールドアウトを指定します。

rng('default') % For reproducibility
Partition = cvpartition(actid,'Holdout',0.10);

学習インデックスとテスト インデックスを抽出します。

trainInds = training(Partition);
testInds = test(Partition);

学習データ セットとテスト データ セットを指定します。

XTrain = feat(trainInds,:);
YTrain = actid(trainInds);
XTest = feat(testInds,:);
YTest = actid(testInds);

コマンド ラインにおける決定木の学習

予測子 XTrain とクラス ラベル YTrain を使用して、当てはめたバイナリ分類決定木に学習させます。クラス名を指定することが推奨されます。また、決定木用に最大 20 の枝ノードを指定します。

classificationTree = fitctree(XTrain,YTrain,...
    'ClassNames',[1;2;3;4;5],...
    'MaxNumSplits',20)
classificationTree = 
  ClassificationTree
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [1 2 3 4 5]
           ScoreTransform: 'none'
          NumObservations: 21668


classificationTree について 5 分割の交差検証を実行し、検証精度を計算します。

partitionedModel = crossval(classificationTree,'KFold',5);
validationAccuracy = 1-kfoldLoss(partitionedModel)
validationAccuracy = 0.9700

代わりに、分類学習器アプリを使用して同じ分類モデルの学習と交差検証を行うこともできます。同様の例については、スマートフォン展開用の行動認識 Simulink モデルを参照してください。

テスト データに対するパフォーマンスの評価

テスト標本分類誤差を推定して、アルゴリズムの一般化の精度を特定します。

testAccuracy = 1-loss(classificationTree,XTest,YTest)
testAccuracy = 0.9617

学習済みモデルは、テスト データ セットについて行動の 96.17% を正しく分類します。この結果は、学習済みモデルが学習データ セットに対して過適合にはなっていないことを示します。

正確な値はオペレーティング システムによってわずかに変化する可能性があることに注意してください。

Simulink モデルにおける予測

分類モデルを準備したので、Simulink モデルを開くことができます。決定木 classificationTree を含む学習済みの分類オブジェクトをClassificationTree Predictブロックにインポートできます。このブロックは Statistics and Machine Learning Toolbox™ ライブラリから追加できます。ClassificationTree Predict ブロックを含むモデルを作成する方法の詳細については、ClassificationTree Predict ブロックの使用によるクラス ラベルの予測を参照してください。ここでは、この例で用意されている Simulink モデル slexHARFixedPointExample を使用します。

Simulink モデルへの入力として使用する加速度計の大規模なデータ セット ts を作成します。

inData = load('rawAccData');
Xacc = inData.acc_data;
t = 0:size(Xacc,1)-1;
ts = timeseries(Xacc,t,'InterpretSingleRowDataAs3D',true);
numSteps = numel(t)-1;

コマンド ラインで次のように入力して、Simulink モデル slexHARFixedPointExample を開きます。この Simulink モデルには、前処理サブシステム用の必要な変数をベース ワークスペースに読み込むコールバックが含まれることに注意してください。

slexHARFixedPointExample

model.png

モデル slexHARFixedPointExample には次のブロックが含まれています。

  • X ブロック (入力端子) は、信号 ts をワークスペースからシステムにリンクします。

  • Buffer and Calibration ブロックには、3 つの Buffer ブロックが含まれています。X BufferY Buffer、および Z Buffer です。これらの各ブロックは、バッファリングしたフレーム間のオーバーラップが 12 サンプル分含まれている、32 個の加速度計軸のサンプルをバッファリングします。20 個のサンプルを収集した後で、各 Buffer ブロックはそれらを前のフレームの 12 サンプルと結合し、合計で 32 個のサンプルを Preprocessing ブロックに渡します。各 Buffer ブロックは、入力サンプルを 0.1 秒ごとに受け取り、32 個のサンプルが含まれているバッファリングしたフレームを 2 秒ごとに出力します。

  • Preprocessing ブロックは、バッファリングされた 32 個の加速度計サンプルのフレームから 15 個の特徴量を抽出します。このサブシステム ブロックでは DSP System Toolbox™ と Signal Processing Toolbox™ を使用します。

  • ClassificationTree Predict ブロックは、Statistics and Machine Learning Toolbox ライブラリのライブラリ ブロックで、抽出された特徴量を使用して人間の行動を分類します。出力は、座る、立つ、歩く、走る、踊る、にそれぞれ対応する 1 ~ 5 の整数です。

固定小数点への変換

モデル slexHARFixedPointExample を固定小数点モデル slexHARFixedPointConvertedExample に変換します。その後、slexHARFixedPointConvertedExample を BBC micro:bit ボードに展開します。ターゲット デバイスには浮動小数点演算装置 (FPU) がなく、固定小数点の計算の方が浮動小数点の計算よりも効率的に実行されます。

モデル slexHARFixedPointExampleLabel 端子を右クリックし、[選択した信号のログ] を選択します。その後、[アプリ] タブにあるアプリ ギャラリーから [固定小数点ツール] アプリを選択して開きます。固定小数点ツールの [新規] ワークフローで、Iterative Fixed-Point Conversion を選択します。

SelectedIterative.png

[固定小数点の反復的変換] タブの [信号許容誤差] セクションで、label 信号の許容される誤差 (元の値と新しい設計の値の差) のレベルを指定します。分類モデルについては、絶対許容誤差 0 を指定することが推奨されます。この設定の場合、固定小数点の分類モデルで返されるラベルは、浮動小数点モデルで返されるラベルと同じでなければなりません (回帰モデルの場合は許容誤差をユーザー指定の非ゼロの値にすることができます)。

SignalTolerances.png

次に、浮動小数点モデルから固定小数点モデルへの変換 (Fixed-Point Designer)の例の手順を参照して、固定小数点に変換される Simulink モデルの作成方法を確認します。

コマンド ラインで次のように入力して、固定小数点の Simulink モデル slexHARFixedPointConvertedExample を開きます。Subsystem ブロックに、前に示したモデル slexHARFixedPointExampleBuffer and CalibrationPreprocessing、および ClassificationTree Predict の各ブロックが含まれています。

slexHARFixedPointConvertedExample

modelFixedPoint.png

別の方法として、固定小数点ツール アプリで Optimized Fixed-Point Conversion ワークフローを選択したり、ブロックのダイアログ ボックスで手動でデータ型を定義することもできます。詳細については、固定小数点出力を使用したブロックの設定 (Fixed-Point Designer)を参照してください。

ハードウェアへの展開

コマンド ラインで次のように入力して、BBC micro:bit デバイスへの展開用の Simulink モデルを開きます。モデル slexHARFixedPointDeployExample は固定小数点に変換されており、ターゲット デバイスの加速度計とディスプレイの端子に対応する I/O ブロックがあります。

slexHARFixedPointDeployExample

modelDeploy.png

Simulink モデル slexHARFixedPointDeployExample は、スマートフォンのセンサーで測定した加速度データに基づいて人間の行動を分類します。このモデルには次のブロックが含まれています。

  • Accelerometer ブロックは、生の加速度データをデバイスの加速度センサーから受け取ります。

  • Buffer and CalibrationPreprocessing、および ClassificationTree Predict の各ブロックは、前に示したモデル slexHARFixedPointExample と同じです。

  • Predicted Activity ブロックは、分類された人間の行動の値を BBC micro:bit デバイスの 5x5 の LED マトリックスに表示します。各文字はそれぞれ、"S" は座る、"T" は立つ、"W" は歩く、"R" は走る、"D" は踊るを表します。

Simulink モデルをデバイスに展開するには、Getting Started with Simulink Coder Support Package for BBC micro:bit (Simulink Coder)の手順に従います。デバイスでモデルを実行し、前に説明したものと同じ方法でデバイスを配置して学習データを収集し、5 つの行動を試します。それに従って、分類された行動がモデルに表示されます。

モデルの精度を確保するには、前に説明したものと同じ方法でデバイスを配置して学習データを収集しなければなりません。別の場所や異なる方向でデバイスを配置する場合は、各自の方法でデータを収集し、そのデータを使用して分類モデルに学習させます。

デバイスによって、モデルの精度がテスト データ セット (testAccuracy) の精度と異なる可能性があります。モデルの精度を改善するには、ジャイロスコープなどの追加センサーの使用を検討してください。

参考文献

[1] El Helou, Amine. Sensor HAR Recognition App. MathWorks File Exchange https://www.mathworks.com/matlabcentral/fileexchange/54138-sensor-har-recognition-app

[2] STMicroelectronics, AN4508 Application note. “Parameters and calibration of a low-g 3-axis accelerometer.” 2014. https://www.st.com/resource/en/application_note/dm00119044-parameters-and-calibration-of-a-lowg-3axis-accelerometer-stmicroelectronics.pdf

[3] El Helou, Amine. Sensor Data Analytics. MathWorks File Exchange https://www.mathworks.com/matlabcentral/fileexchange/54139-sensor-data-analytics-french-webinar-code

参考

| |

関連するトピック