ゴルフ × AI
昨今、「AI(=人工知能)」が日常生活に浸透してきているのを皆様も感じているかと思います
その波に乗るべく(?)、ゴルフにも何かAIを導入できないかと考え、AIがリアルタイムにナイスショットかどうかを判定できたら面白いんじゃないかと思い立ち、実際に取り組んでみました
とりあえず、まずは完成した動画をご覧下さい
結果としては、「全てナイスショットとAIが判定してしまう失敗」となってしまいました…
その原因や今後の展望なども含めて、アプリがどのような仕組みで動いているかについてを記事にしましたので、少しアカデミックな内容にはなりますが、最後まで読んでもらえたら幸いです
※何か疑問点などあれば、コメント等いただければお返しします
仮説『ナイスショットはインパクトの瞬間に決まる』
まず、「打球」というのがどうやって生まれるのかということを考えると、全て「インパクトの瞬間で決まる」ということが考えられます
これはあくまで「仮説」ではありますが、ゴルフシミュレーターでもインパクトの情報だけで打球を推定していることを鑑みると、大きく間違ってはいないと思われます
この仮説を元に、少し飛躍はしますが、「インパクトの瞬間のヒトの姿勢を切り取れば、ナイスショットかどうかを判定出来るのではないか?」と考えました
少しかみ砕くと、「きちんとした姿勢でインパクトが出来ていれば、打球もナイスショットが生まれる(可能性が高い)」ということです
(↑これをAIにナイスショットかどうか判定させる)
この仮説を元に、以降ではアプリの概要について話を進めていきます
アプリ概要
スイング動画を使ってリアルタイムでAIがナイスショットか否かを判定する
これを実現するために、次のように工程を分けました
- カメラまたは動画ファイルから動画データを取得する
- インパクトの瞬間を切り出す
- AIが判定しやすいように画像を加工する(第一のAI、姿勢推定)
- ナイスショットか否かを判定する(第二のAI、ナイスショット判定)
- 結果を画面に表示する
次からは、これら工程毎の詳細を見ていきます
カメラまたは動画ファイルから動画データを取得する
Pythonという言語を使用し、その中のOpenCVというライブラリを使うと、カメラや動画データから連続した画像情報を取得できます
今回は作業の都合上、動画データを使用しました
インパクトの瞬間を切り出す
「連続した画像の中からインパクトの瞬間の画像だけを抜き出す」という工程です
今回は、
「マイクから音量を取得し、一定音量以上を検出したら画像を切り出す」
という方法を用いました
音量の取得はOpenCVではできないので、PyAudioというライブラリを使用しています
動画内でも、他人のショット音を拾ってしまい、AIが判定してしまっている箇所がありますが、オーバーキル(漏れが無いように小さめの音でも検出する)しているので、甘めの解釈をお願いします
(周波数解析などを用いて特定の音質のものだけを拾うことはできるかも?)
※少し余談にはなりますが、動画内ではマイクからではなく、
「Windows内で再生されている音量をマイク代わりにして取得」
という方法を用いています
これは「Windowsのステレオミキサー」という機能を有効化することで可能です
なぜこのような方法を用いているかというと、先ほども述べたとおり、OpenCVだけでは音声の取得ができないので画像と音声の同期が取れません
そこで、Windows上でメディアプレーヤーを再生し、そこで流れている画像と音声データを同時に取得するという若干回りくどいやり方を用いています
動画データからではなく、実際にリアルタイムでアプリを動かす場合は、カメラとマイクの同期が取れているので、このようなやり方は不要です
『第一のAI、姿勢推定』AIが判定しやすいように画像を加工する
AIにとって出来るだけ判定しやすい画像というのは、無駄な情報が無い画像です
人の服装や周りの風景などはナイスショットとは無関係なので無駄な情報です
これらを除外するために、姿勢推定AIを用いて、画像から人間の骨格のみを抜き出します
抜き出した後は、背景を黒にして骨格をセンタリングした画像に変換します
これでAIが判定するための、必要最低限の情報が抽出できました
『第二のAI、ナイスショット判定』ナイスショットか否かを判定する
前処理した骨格画像を用いて、AIでナイスショット判定を行います
畳み込みニューラルネットワーク(CNN,Convolutional Neural Network)と呼ばれる、画像識別AIでよく普及されている手法でAIを学習・判定を行います
今回学習に用いた画像枚数
①ナイスショット画像:58枚(評価用画像16枚)
②ナイスショットではない画像:60枚(評価用画像14枚)
画像サイズ
240×240 白黒画像
※結果:学習に失敗※
「全てナイスショット」と判定してしまうAIになってしまいました…(課題)
➾原因考察
- インパクトの画像からではナイスショット判定が難しい(仮説ミス)
または、インパクトの画像とナイスショットには関連性が無い? - 学習用の画像枚数が少ない
- 姿勢推定の時点で不明確さが生まれている
→手書きで骨格を付けるなどの対応
これらは次回への課題です…
結果を画面に表示する
AIの学習には失敗してしまいましたが、仮に成功したとして話を進めます…
AIが判定した結果を画面に表示します
姿勢推定画像と骨格画像と「○×」ナイスショット判定表示、そしてサウンド(ピンポン、ブブー)を鳴らします
以上が、アプリの一連の流れとなります
まとめ
肝心のAIの学習が上手くいかず、全てナイスショットと判定してしまう結果にはなりましたが、
アプリとしてのフレームワークの部分、というのはなんとか作れたのではないかと思います
今回の結果をもし、「仮説が否定された」と解釈するのであれば、
「インパクトの瞬間とナイスショットは無関係」
ということが言えるのかも(?)しれません
今後の展望ですが、インパクトの瞬間だけではなくその前後のスイング軌道なども含めることでAIの判定が上手くいくかもしれません
そういった今回の反省を踏まえて、更なる進化が出来るように進めていきたいと思います
環境
ノートPC TOSHIBA 2013年製
OS:Windows8.1
CPU:Core i7-4710MQ 2.50GHz
メモリ:8.0GB
使用言語:Python