【CoreML】iPhoneのセンサーデータを機械学習させてロックダンスの動きを識別してみた


AIにロックダンスの動きを識別させてみた

以前、iPhoneの加速度や角速度といったセンサーデータをCoreMotionを使って取得し、CSVファイルとして記録するiOSアプリを作成しました。

【CoreMotion】iPhoneのモーションデータ(加速度や角速度など)をCSVで記録するアプリを作成してみた

このアプリを使ってストリートダンスの1つであるロックダンス(Lockin')のモーションデータを記録し、機械学習ライブラリのKerasで構築したモデルに学習させました。その学習済みモデルをCoreMLを使って上記のiOSアプリに組み込みリアルタイムでロックダンスの動作識別をしてみました。

見えづらくてすみません!こちらはロックダンス中のスマホ画面をキャプチャーしたものです(動画はTwitterの方にも載せてあります)。動作の順番は「トゥエル」→「ロック」→「ポイント」のつもり。

自分はダンサーではありますがロック専門ではないのでめちゃくちゃ下手ですし、今回は学習データ量も少ないのでモデルとしてはあまり良いものではありません(泣)。ただ、スマホでもある程度は動作の識別が可能ということが分かりました!

MLModelから予測結果のラベルを取得する例

今回のアプリのソースコードはGitHubにも載せているのですが(そのうちリポジトリ変えるかも)、組み込んだMLModelにデータを入力し予測結果のラベルを取得するまでの実装例を抜粋しておきます。

func getCoremlOutput(){
    // store sensor data in array for CoreML model
    let dataNum = NSNumber(value:inputDataLength)
    let mlarray = try! MLMultiArray(shape: [dataNum], dataType: MLMultiArrayDataType.double )

    for (index, data) in compAccArray.enumerated(){
        mlarray[index] = data as NSNumber
    }

    // input data to CoreML model
    let model = iPhoneModel()
    guard let output = try? model.prediction(input:
        iPhoneModelInput(input1: mlarray)) else {
                fatalError("Unexpected runtime error.")
    }

    classLabel = output.classLabel
}

今回は学習データとしてiPhone本体の加速度XYZを使っています。ただし、本体の向きの影響を受けないように実際にはその合成加速度を入力としています。compAccArrayにはその配列が格納されていると思ってください。データ長(inputDataLength)は今回50としました。
また、モデルに入力するデータの型としてMLMultiArrayに変換する必要があるので注意です。

Kerasでモデルを出力する際は「iPhoneModel.mlmodel」という名前にしました(モデルの出力手順はこちらの記事でも少し触れています)。そのためインスタンスの生成はlet model = iPhoneModel()となっています。
最終的な予測結果(分類クラスのラベル)はclassLabelに文字列として格納されます。

さいごに

今回はAIによるロックダンスの動作識別を試してみました。もちろん、データ次第で他の分野にも応用可能です。ちなみに私はブレイクダンサー(BBOY)なのでそちらのAIをメインに開発しています。

【深層学習】AI(人工知能)にブレイクダンスの動きを識別させてみた【行動認識】
【ダンスAI】情動状態の判別・可視化に関する動画を公開しました【機械学習】

他にもブログやSNSで自己満な情報を色々と発信していますので、よろしければ是非チェックしていただけると嬉しいです!