このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
スマートフォン展開用の行動認識 Simulink モデル
この例では、スマートフォンのセンサー信号に基づいて人間の行動を分類する Simulink® モデルをコード生成およびスマートフォン展開用に準備する方法を示します。この例では、Android™ デバイスおよび iOS デバイスへの展開に対応している 2 つの 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
を選択します。分類学習器は予測子と応答をテーブルから識別します。
既定のオプションは、過適合を防ぐ 5 分割の交差検証です。[セッションの開始] をクリックします。分類学習器がデータセットを読み込み、はじめの 2 つの特徴量について散布図をプロットします。
[分類学習器] タブで [モデル] セクションの右にある矢印をクリックしてギャラリーを開きます。次に、[アンサンブル分類器] の [ブースティング木] をクリックします。
モデルの [概要] タブにブースティング木のアンサンブル モデルの既定設定が表示されます。
[分類学習器] タブの [学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。学習が完了すると、5 分割で交差検証された分類精度が [モデル] ペインに表示されます。
[分類学習器] タブの [エクスポート] セクションで、[モデルのエクスポート] をクリックしてから [コンパクト モデルのエクスポート] を選択します。ダイアログ ボックスの [OK] をクリックします。構造体 trainedModel
が MATLAB® のワークスペースに現れます。trainedModel
の ClassificationEnsemble
フィールドにコンパクト モデルが含まれています。学習済みのモデルを構造体から抽出します。
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% を正しく分類します。この結果は、学習済みモデルが学習データセットに対して過適合にはなっていないことを示します。
正確な値はオペレーティング システムによってわずかに変化する可能性があることに注意してください。
学習済みモデルの保存
分類モデル オブジェクトが含まれている場合のコード生成には、saveLearnerForCoder
とloadLearnerForCoder
を使用します。
saveLearnerForCoder
を使用して、学習済みモデルを保存します。
saveLearnerForCoder(classificationEnsemble,'EnsembleModel.mat');
Simulink モデルの関数ブロック predictActivity が loadLearnerForCoder
を使用して学習済みモデルを読み込み、学習済みモデルを使用して新しいデータを分類します。
デバイスへの Simulink モデルの展開
分類モデルを準備したので、スマートフォンのタイプに応じて Simulink モデルを開き、モデルをデバイスに展開できるようになりました。Simulink モデルには EnsembleModel.mat
ファイルと較正行列ファイル slexHARAndroidCalibrationMatrix.mat
または slexHARiOSCalibrationMatrix.mat
が必要であることに注意してください。このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、これらの較正行列ファイルが含まれている例のフォルダーが開きます。
Android に展開する Simulink モデルを開くには、slexHARAndroidExample
と入力します。
iOS に展開する Simulink モデルを開くには、slexHARiOSExample
と入力します。Mac OS プラットフォームでモデルを開くことができます。
この 2 つの Simulink モデルは、スマートフォンのセンサーで測定した加速度データに基づいて人間の行動を分類します。モデルには以下のブロックが含まれています。
Accelerometer ブロックは、生の加速度データをデバイスの加速度センサーから受け取ります。
calibrate ブロックは、生の加速度データを較正する MATLAB Function ブロックです。このブロックでは
slexHARAndroidCalibrationMatrix.mat
ファイルまたはslexHARiOSCalibrationMatrix.mat
ファイルの較正行列を使用します。このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、これらのファイルが含まれている例のフォルダーが開きます。表示ブロック Acc X、Acc Y および Acc Z は、calibrate ブロックに接続されており、デバイスの各軸について較正されたデータ点を表示します。
X Buffer、Y 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 Support Package for Android Devices) または Run Model on Apple iOS Devices (Simulink Support Package for Apple iOS Devices) の手順に従います。デバイスでモデルを実行し、前に説明したものと同じ方法でデバイスを配置して学習データを収集し、5 つの行動を試します。それに従って、分類された行動がモデルに表示されます。
モデルの精度を確保するには、前に説明したものと同じ方法でデバイスを配置して学習データを収集する必要があります。異なる場所または方向でデバイスを配置する場合は、各自の方法でデータを収集し、そのデータを使用して分類モデルに学習をさせます。
デバイスによって、モデルの精度がテスト データ セット (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
参考
loadLearnerForCoder
| saveLearnerForCoder
| fitcensemble
| predict