機械学習を使って、ストリートファイターを認識するアプリを作ってみました。アイパッドを使ってリアルタイムに認識します。ゲームだからキャプチャーすればいいのですが、これが上手くいけば実写へと期待しています。
モデルの作成とSwiftのコードは前回の記事にあります。
iPhoneで顔認識 - Qiita
使用環境
-
Xcode
iOSとSwiftを使います。 -
CoreML Framework
iOSの機械学習ライブラリ。
一般的な学習済みモデルは Apple Developer からダウンロードできます。
https://developer.apple.com/machine-learning/
モデルには1000個のカテゴリーが入っており、画像を与えると1000個の中で「強いて言えば何か」を分類します。例えばマウスであったり、コンピューターキーボードであったり、PCモニターの前に座った人をバーバーと分類したりします。 -
Turi Create
学習モデルを作成します。TuriはAppleがを2016年に買収しました。学習モデルとは拡張子.mlmodelのファイルのことで、Xcodeに置いてCoreMLからファイル名を指定するだけで使えます。TuriCreateはPC上でPythonで実行します。
モデルの作成
機械学習とは分類です。今回は10個のカテゴリーを作成しました。表示していませんが立ち状態があります。分類結果は、10個足して100%になるように値が出ます。なので、その他である立ち状態をしっかりと定義することが大切になります。
プレイ
1秒間に10回程度認識させます。認識したモーションには5点与えます。点数は徐々に減っていきます。
失敗
今回は Vision.framework にあるオブジェクトトラッキングを試してみました。動画の場合に物体を追跡してくれます。マウスやペットボトルなど、カメラを揺らしても追跡してくれます。ただ今回のようにゲームキャラだと変化が激しいためか、すぐに追跡が外れてしまいました。他にも色々試しましたが、位置がズレたりしてボツにしました。
画面上を捜査する機能も作ってみました。リュウ、春麗、背景の3つに分類して、リュウの一致度が高いものを探します。しかしこれだと秒間10回の処理に追いつきませんでした。
ジャンプ攻撃について、画像を切り出してMLに与えるので、ML側はジャンプしているとは認識しません。何か別のパラメータと組み合わせる必要があります。ただ現実でこれだけジャンプする人はいないので、考えなくてもいいのかも知れません。
しゃがみ状態を外しました。上半身に絞った方が認識率が上がったためです。野球とかボクシングなどは上半身のみでいいと思うので、競技によると思います。てなことを考えながら黙々とトレーニング画像を切り出していました。とにかくトレーニング画像を集めるのが大変なので、このあたり自動化できたらいいと思います。
これから
iPhoneやiPadを使ってリアルタイムに処理が出来たら面白いと思っています。今回の実験を経て色々思い付いたので、次回につなげたいと思います。