はじめに
前回の記事では、
生成AIを使いながら野球のスイング解析を作り始めた話を書いた。
人体の骨格検出については、
想像以上に簡単だった。
「MediaPipe」という仕組みを使うことで、
- 肩
- 肘
- 手首
- 腰
- 膝
などの位置を、今回の動画では比較的安定して推定できたからだ。これは今回の試作での印象であり、測定器と比較した精度保証ではない。
しかし、
実際にスイング解析を作ろうとすると、
次の大きな壁が現れた。
それが「バット検出」だった。
人体は認識できるのに、なぜバットは難しいのか?
最初は単純に考えていた。
「バットなんだから、
細長い棒状の物体を検出すればいいのでは?」
と。
人体認識がここまで進化しているなら、
バットぐらい簡単に認識できると思っていた。
しかし実際に試してみると、
これがかなり難しかった。
棒状物体の検出を試してみた
最初に試したのは、
「細長い形」を検出する方法だった。
バットは基本的に細長い。
そのため、
- 輪郭抽出
- エッジ検出
- 線分検出
などを使えば、
それっぽいものを追えるのではないかと考えた。
しかしここで問題が起きる。
背景にも“棒状のもの”が大量に存在していた。
例えば、
- ネット
- フェンス
- 地面のライン
- 影
- バットケース
- 柵
など。
人間なら簡単に区別できる。
しかしAI側から見ると、
どれも「細長い線」に見えてしまう。
結果として、
本来追いたいバットではなく、
背景側に吸われることがかなり多かった。
探索範囲を限定してみた
次に考えたのは、
「身体の近くだけを探せばいいのでは?」
という方法だった。
スイング中、
バットは基本的に身体の近くに存在する。
そのため、
骨格検出と組み合わせて、
- 手首周辺
- 腕の延長方向
- 一定範囲内
だけを探索対象にしてみた。
しかし、
これも簡単ではなかった。
スイング中のバットは想像以上に動く。
しかも、
- 高速移動
- モーションブラー
- フレーム端への移動
- 身体との重なり
などが発生する。
探索範囲を狭くしすぎると、
今度はバット自体を見失う。
逆に広げると、
また背景に吸われる。
かなり調整が難しかった。
先端の色を追う方式に変更
そこで次に試したのが、
「バット先端の色」を追う方法だった。
例えば、
先端部分に特徴的な色があれば、
色抽出で追跡しやすくなる。
OpenCVを使いながら、
- HSV色空間
- マスク処理
- 色抽出
などを試してみた。
これによって、
ある程度は改善した。
しかし、
やはり問題は残った。
背景に似た色が存在すると、
そちらに吸われてしまう。
さらに、
- 照明
- 反射
- 影
- 動画圧縮
などでも結果が変わる。
思っていた以上に、
「現実の映像」を扱うのは難しかった。
そこでYOLOを試してみることにした
ここまで試して感じたのは、
単純な画像処理だけでは限界があるということだった。
そこで次に試すことにしたのが、
「YOLO」という物体検出AIだ。
YOLOは、画像中の物体の種類と位置を推定するモデルの系列だ。学習済みモデルを使う方法と、対象に合わせてラベル付きの画像で追加学習する方法がある。
技術的な補足として、Ultralyticsの物体検出の公式説明では、検出結果は物体を囲む枠、クラス、信頼度などとして得られる。枠が検出できても、バットの先端位置や実際の速度がそのまま分かるわけではなく、追加の追跡や撮影条件の補正が必要になる。
今回目指しているのは、
- 背景
- 人体
- フェンス
- 影
などではなく、
“バットそのもの”を認識させる方向だ。
ただ、
これも簡単ではない。
バットは高速で動き、
映像によってはブレて形すら変わる。
それでも、
少しずつAIに学習させながら、
どこまで検出できるのか試してみたいと思っている。
関連記事
AIで野球のスイング解析を作ってみたら想像以上に難しかった|素人エンジニアがスポーツを科学する
まとめ
人体の骨格検出までは、
想像以上にスムーズに進んだ。
しかし、
実際にスイング解析を作ろうとすると、
最大の壁は「バット検出」だった。
- 背景に吸われる
- ブレる
- 見失う
- 身体と重なる
など、
人間には簡単に見えることが、
AIには非常に難しい。
それでも、
試行錯誤しながら少しずつ形になっていくのはかなり面白い。
次は、
YOLOによるバット検出と学習について試していきたい。


コメント