Main Content

スマートフォン展開用の行動認識 Simulink モデル

この例では、スマートフォンのセンサー信号に基づいて人間の行動を分類する Simulink® モデルをコード生成およびスマートフォン展開用に準備する方法を示します。この例では、Android® デバイスへの展開に対応している Simulink モデルを提供します。必要なサポート パッケージをインストールした後で、分類モデルに学習をさせ、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 モデルでは生の加速度データも使用しており、較正および特徴抽出用のブロックが含まれています。

データの準備

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

rng('default') % For reproducibility
Partition = cvpartition(actid,'Holdout',0.10);
trainingInds = training(Partition); % Indices for the training set
XTrain = feat(trainingInds,:);
YTrain = actid(trainingInds);
testInds = test(Partition); % Indices for the test set
XTest = feat(testInds,:);
YTest = actid(testInds);

分類学習器アプリで学習データ セットを読み込むため、特徴量行列 XTrain と応答ベクトル YTrain をテーブルに変換します。

tTrain = array2table([XTrain YTrain]);

テーブルの各列の変数名を指定します。

tTrain.Properties.VariableNames = [featlabels' 'Activities'];

分類学習器アプリの使用によるブースティング木のアンサンブルの学習

分類学習器アプリを使用して分類モデルに学習をさせます。分類学習器アプリを開くため、コマンドラインで classificationLearner と入力します。または、[アプリ] タブをクリックし、[アプリ] セクションの右にある矢印をクリックして、ギャラリーを開きます。次に、[機械学習および深層学習][分類学習器] をクリックします。

[分類学習器] タブで、[ファイル] セクションの [新規セッション] をクリックし、[ワークスペースから] を選択します。

[ワークスペースからの新規セッション] ダイアログ ボックスで、[データ セット変数] の矢印をクリックしてから table tTrain を選択します。分類学習器は予測子と応答をテーブルから識別します。

slexHAR-import-dialog.png

既定のオプションは、過適合を防ぐ 5 分割の交差検証です。[セッションの開始] をクリックします。分類学習器がデータ セットを読み込み、はじめの 2 つの特徴量について散布図をプロットします。

slexHAR-scatter-plot.png

[分類学習器] タブで [モデル] セクションの右にある矢印をクリックしてギャラリーを開きます。次に、[アンサンブル分類器][ブースティング木] をクリックします。

HARDeploymentExample3.png

モデルの [概要] タブにブースティング木のアンサンブル モデルの既定設定が表示されます。

slexHAR-hyperparameters.png

[分類学習器] タブの [学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。学習が完了すると、5 分割で交差検証された分類精度が [モデル] ペインに表示されます。

HARDeploymentExample5.png

[分類学習器] タブで、[エクスポート] をクリックして [モデルのエクスポート] をクリックし、[モデルのエクスポート] を選択します。[Export Classification Model] ダイアログ ボックスで、学習データを除外してコンパクトなモデルをエクスポートするためにチェック ボックスをクリアし、[OK] をクリックします。構造体 trainedModel が MATLAB® ワークスペースに表示されます。trainedModelClassificationEnsemble フィールドにコンパクト モデルが含まれています。学習済みのモデルを構造体から抽出します。

classificationEnsemble = trainedModel.ClassificationEnsemble;

コマンドラインにおけるブースティング木のアンサンブルの学習

もう一つの方法として、コマンドラインで同じ分類モデルに学習をさせることができます。

template = templateTree('MaxNumSplits',20,'Reproducible',true);
classificationEnsemble = fitcensemble(XTrain,YTrain, ...
    'Method','AdaBoostM2', ...
    'NumLearningCycles',30, ...
    'Learners',template, ...
    'LearnRate',0.1, ...
    'ClassNames',[1; 2; 3; 4; 5]);

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

partitionedModel = crossval(classificationEnsemble,'KFold',5);
validationAccuracy = 1-kfoldLoss(partitionedModel)
validationAccuracy = 0.9833

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

テスト データ セットに対するパフォーマンスを評価します。

testAccuracy = 1-loss(classificationEnsemble,XTest,YTest)
testAccuracy = 0.9759

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

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

学習済みモデルの保存

分類モデル オブジェクトが含まれている場合のコード生成には、saveLearnerForCoderloadLearnerForCoderを使用します。

saveLearnerForCoderを使用して、学習済みモデルを保存します。

saveLearnerForCoder(classificationEnsemble,'EnsembleModel.mat');

Simulink モデルの関数ブロック "predictActivity"loadLearnerForCoderを使用して学習済みモデルを読み込み、学習済みモデルを使用して新しいデータを分類します。

デバイスへの Simulink モデルの展開

分類モデルを準備したので、Simulink モデルを開き、モデルをデバイスに展開できます。Simulink モデルには EnsembleModel.mat ファイルと較正行列ファイル slexHARAndroidCalibrationMatrix.mat が必要であることに注意してください。このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、これらの較正行列ファイルが含まれている例のフォルダーが開きます。

Android に展開する Simulink モデルを開くには、slexHARAndroidExample と入力します。

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

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

  • calibrate ブロックは、生の加速度データを較正する MATLAB Function ブロックです。このブロックでは slexHARAndroidCalibrationMatrix.mat ファイルの較正行列を使用します。このページの右上のセクションにあるボタンをクリックしてこの例を MATLAB で開くと、このファイルが含まれている例のフォルダーが開きます。

  • 表示ブロック Acc XAcc Y および Acc Z は、calibrate ブロックに接続されており、デバイスの各軸について較正されたデータ点を表示します。

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

  • extractFeatures ブロックは、バッファリングした 32 個の加速度サンプルが含まれているフレームから 60 個の特徴量を抽出する MATLAB Function ブロックです。この関数ブロックでは DSP System Toolbox™ と Signal Processing Toolbox™ を使用します。

  • predictActivity ブロックは、loadLearnerForCoder を使用して学習済みモデルを EnsembleModel.mat ファイルから読み込み、抽出された特徴量を使用して行動を分類する、MATLAB Function ブロックです。出力は、座る、立つ、歩く、走る、踊る、にそれぞれ対応する 1 ~ 5 の整数です。

  • Predicted Activity ブロックは、分類した行動の値をデバイスに表示します。

  • Video Output サブシステムは、複数端子のスイッチ ブロックを使用して対応する行動のイメージ データを選択し、デバイスに表示します。Convert to RGB ブロックは、選択されたイメージを別々の RGB ベクトルに分解し、このイメージを Activity Display ブロックに渡します。

Simulink モデルをデバイスに展開するには、Run Model on Android Devices (Simulink)の手順に従います。デバイスでモデルを実行し、前に説明したものと同じ方法でデバイスを配置して学習データを収集し、5 つの行動を試します。それに従って、分類された行動がモデルに表示されます。

slexHARAndroidExample.png

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

デバイスによって、モデルの精度がテスト データ セット (testaccuracy) の精度と異なる可能性があります。追加センサーの使用と較正行列の更新によるモデルの改善を検討できます。また、Audio Toolbox™ を使用して、音声フィードバック用に別の出力ブロックを出力サブシステムに追加することもできます。分類された行動と加速度データをデバイスから "モノのインターネット" にパブリッシュするには、ThingSpeak™ の書き込みブロックを使用します。詳細については、https://thingspeak.com/ を参照してください。

参考文献

[1] El Helou, A. 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.

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

参考

| | |

関連するトピック