이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

스마트폰에 배포 가능한 사용자 동작 인식 Simulink 모델

이 예제에서는 코드 생성 및 스마트폰 배포를 목적으로, 스마트폰 센서 신호에 기반하여 사용자의 동작을 분류하는 Simulink® 모델을 준비하는 방법을 보여줍니다. 이 예제는 Android 기기와 iOS 기기에 배포할 수 있는 두 개의 Simulink 모델을 제공합니다. 대상 기기에 필요한 지원 패키지를 설치한 후 분류 모델을 훈련시키고 Simulink 모델을 기기로 배포합니다.

선행 조건

이 예제에서는 Simulink 모델을 위한 Simulink 지원 패키지가 필요합니다.

샘플 데이터 세트 불러오기

humanactivity 데이터 세트를 불러옵니다.

load humanactivity

humanactivity 데이터 세트에는 사람의 서로 다른 5가지 신체 동작인 앉기, 서기, 걷기, 뛰기, 춤추기에 대한 24,075개의 관측값이 포함되어 있습니다. 각 관측값에는 스마트폰 가속도계 센서가 측정한 가속도 데이터에서 추출한 60가지 특징이 들어 있습니다. 데이터 세트에는 다음 변수가 포함되어 있습니다.

  • actid - 정수형의 동작 ID가 포함된 응답 벡터. 1, 2, 3, 4, 5는 각각 앉기, 서기, 걷기, 뛰기, 춤추기를 나타냄

  • actnames - 정수형 동작 ID에 상응하는 행동 이름

  • feat - 24,075개 관측값에 대한 60가지 특징으로 구성된 특징 행렬

  • featlabels - 60가지 특징의 레이블

humanactivity 데이터 세트는 Sensor HAR(사용자 동작 인식) 앱 [1] (Statistics and Machine Learning Toolbox)을 사용해서 생성했습니다. 이 앱으로 원시 가속도 데이터를 측정할 당시 측정 대상자는 스마트폰을 주머니에 거꾸로 넣고 있었고 화면은 이 사람을 향해 있었습니다. 이 앱은 측정된 원시 데이터를 적절히 보정한 후 보정된 데이터에서 60개의 특징을 추출했습니다. 보정과 특징 추출 방법에 대한 자세한 내용은 [2] (Statistics and Machine Learning Toolbox) 항목 및 [3] (Statistics and Machine Learning Toolbox) 항목을 각각 참조하십시오. 이후에 설명할 Simulink 모델에도 원시 가속도 데이터가 사용되고 보정과 특징 추출을 위한 블록이 포함됩니다.

데이터 준비하기

이 예제에서는 관측값의 90%를 사용하여 5가지 유형의 사용자 동작을 분류하는 모델을 훈련시키고, 관측값의 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를 입력하십시오. 또는 탭을 클릭하고 섹션의 오른쪽에 있는 화살표를 클릭하여 갤러리를 엽니다. 그런 다음 기계 학습에서 분류 학습기를 클릭합니다.

분류 학습기 탭의 파일 섹션에서 새 세션을 클릭하고 작업 공간에서를 선택합니다.

새 세션 대화 상자에서 작업 공간 변수 화살표를 클릭한 다음 테이블 tTrain을 선택합니다. 분류 학습기가 이 테이블에서 예측 변수와 응답 변수를 찾아냅니다.

디폴트 옵션은 5겹 교차 검증이며 이를 통해 과적합을 방지합니다. 세션 시작을 클릭합니다. 분류 학습기가 데이터 세트를 불러오고 처음 두 가지 특징에 대한 산점도 플롯을 플로팅합니다.

분류 학습기 탭에서 모델 유형 섹션의 오른쪽에 있는 화살표를 클릭하여 갤러리를 엽니다. 그런 다음 앙상블 분류기에서 부스팅 트리를 클릭합니다.

데이터 브라우저의 현재 모델 창에 부스팅 트리 앙상블 모델의 디폴트 설정이 표시됩니다.

분류 학습기 탭의 훈련 섹션에서 훈련을 클릭합니다. 훈련이 완료되면 데이터 브라우저의 내역 창에 5겹 교차 검증된 분류 정확도가 표시됩니다.

분류 학습기 탭의 내보내기 섹션에서 모델 내보내기를 클릭한 다음 간소 모델 내보내기를 선택합니다. 대화 상자에서 확인을 클릭합니다. MATLAB 작업 공간에 구조체 trainedModel이 나타납니다. trainedModel의 필드 ClassificationEnsemble에 간소 모델이 포함되어 있습니다. 훈련된 모델을 구조체에서 추출합니다.

classificationEnsemble = trainedModel.ClassificationEnsemble;

명령줄에서 부스팅 트리 앙상블 훈련시키기

동일한 분류 모델을 명령줄에서도 훈련시킬 수 있습니다.

template = templateTree('MaxNumSplits',20);
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.9831

테스트 데이터에 대한 성능 평가하기

테스트 데이터 세트에 대한 성능을 평가합니다.

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

훈련된 모델은 테스트 데이터 세트에서 사용자 동작의 97.63%를 올바르게 분류합니다. 이 결과를 통해 훈련된 모델이 훈련 데이터 세트에 대해 과적합하지 않음을 알 수 있습니다.

정확도 값은 운영 체제에 따라 다소 달라질 수 있습니다.

훈련된 모델 저장하기

분류 모델 객체를 포함한 코드를 생성하려면 saveCompactModelloadCompactModel을 사용하십시오.

saveCompactModel을 사용하여 훈련된 모델을 저장합니다.

saveCompactModel(classificationEnsemble,'EnsembleModel.mat');

Simulink 모델의 함수 블록 predictActivityloadCompactModel을 사용하여 훈련된 모델을 불러오고 이 훈련된 모델을 사용해서 새 데이터를 분류합니다.

기기에 Simulink 모델 배포하기

이제 분류 모델이 준비되었으므로 스마트폰 유형에 따라 적합한 Simulink 모델을 열어서 스마트폰에 배포할 수 있습니다. Simulink 모델에는 EnsembleModel.mat 파일과 보정 행렬 파일 slexHARAndroidCalibrationMatrix.mat 또는 slexHARiOSCalibrationMatrix.mat가 필요합니다. 이 페이지의 오른쪽 위 섹션에 있는 버튼을 클릭하고 이 예제를 MATLAB®에서 열면, 이러한 보정 행렬 파일이 포함된 예제 폴더가 열립니다.

Android 기기에 배포할 Simulink 모델을 열려면 slexHARAndroidExample을 입력하십시오.

iOS 기기에 배포할 Simulink 모델을 열려면 slexHARiOSExample을 입력하십시오.

이 두 개의 Simulink 모델은 스마트폰 센서에서 측정한 가속도 데이터를 기준으로 사용자 동작을 분류합니다. 모델에는 다음 블록이 포함되어 있습니다.

  • Accelerometer 블록은 기기의 가속도계 센서로부터 원시 가속도 데이터를 받습니다.

  • calibrate 블록은 원시 가속도 데이터를 보정하는 MATLAB Function 블록입니다. 이 블록은 slexHARAndroidCalibrationMatrix.mat 파일 또는 slexHARiOSCalibrationMatrix.mat 파일의 보정 행렬을 사용합니다. 이 페이지의 오른쪽 위 섹션에 있는 버튼을 클릭하고 이 예제를 MATLAB®에서 열면, 이러한 파일이 포함된 예제 폴더가 열립니다.

  • 표시 블록 Acc X, Acc Y, Acc Zcalibrate 블록에 연결되며 각 축의 보정된 데이터 점을 기기에 표시합니다.

  • Buffer 블록 X Buffer, Y Buffer, Z Buffer 각각은 버퍼링되는 프레임 간에 12개의 샘플이 중첩되도록 하여 가속도계 축의 32개 샘플을 버퍼링합니다. 각 Buffer 블록은 20개 샘플을 수집한 후 이 20개 샘플과 이전 프레임의 12개 샘플을 결합하여 총 32개 샘플을 extractFeatures 블록에 전달합니다. 각 Buffer 블록은 입력 샘플을 0.1초마다 수신하고, 32개 샘플을 포함하는 버퍼링된 프레임을 2초마다 출력합니다.

  • extractFeatures 블록은 32개 가속도계 샘플의 버퍼링된 프레임에서 60개의 특징을 추출하는 MATLAB Function 블록입니다. 이 Function 블록은 DSP System Toolbox™와 Signal Processing Toolbox™를 사용합니다.

  • predictActivity 블록은 loadCompactModel을 사용하여 EnsembleModel.mat 파일에서 훈련된 모델을 불러오고 추출된 특징을 사용하여 사용자 동작을 분류하는 MATLAB Function 블록입니다. 출력값은 1과 5 사이의 정수이며 각각 앉기, 서기, 걷기, 뛰기, 춤추기에 해당합니다.

  • Predicted Activity 블록은 분류된 사용자 동작 값을 기기에 표시합니다.

  • Video Output 서브시스템은 multiport switch 블록을 사용하여 기기에 표시할 사용자 동작 이미지 데이터를 선택합니다. Convert to RGB 블록은 선택한 이미지를 별개의 RGB 벡터로 분해하고, 그 이미지를 Activity Display 블록에 전달합니다.

Simulink 모델을 기기로 배포하려면 Run Model on Android Devices 또는 Run Model on iOS Devices에 나와 있는 단계를 따르십시오. 구성 프로세스가 완료되면 Deploy to Hardware를 클릭하여 모델과 동일한 이름의 앱을 생성합니다. 앱을 실행하고 앞서 훈련 데이터를 수집할 때 설명한 것과 동일한 상태로 기기를 놓고 5가지 동작을 시도해 보십시오. 그러면 앱이 분류된 동작을 표시합니다.

앱 정확도를 보장하려면 앞서 훈련 데이터를 수집할 때 설명한 것과 동일한 상태로 기기를 두어야 합니다. 기기를 다른 위치나 방향으로 두고 싶으면 원하는 방식으로 데이터를 수집한 다음 그 데이터를 사용하여 분류 모델을 훈련시키십시오.

기기에 따라 앱의 정확도는 테스트 데이터 세트의 정확도(testaccuracy)와 다를 수 있습니다. 추가 센서를 사용하거나 보정 행렬을 업데이트하여 앱을 향상시킬 수 있습니다. 또한 Audio System Toolbox™를 사용하면 오디오 피드백을 위한 또 다른 출력 블록을 출력 서브시스템에 추가할 수 있습니다. 분류된 동작과 가속도 데이터를 기기에서 사물 인터넷 플랫폼으로 퍼블리시하려면 ThingSpeak™ write 블록을 사용합니다. 자세한 내용은 https://thingspeak.com/을 참조하십시오.