はじめに
野球のバッティング解析ソフトを作っているうちに、その人体検出の仕組みをソフトボールの投手にも使えないかと考えた。今回の対象は、腕を大きく回して投げるウインドミル投法だ。
ただ、いきなり球速やフォームの良し悪しを判定するソフトを目指したわけではない。まずは身体の各部を追いかけ、投球中に姿勢がどう変わるかを見られるようにしたい。今回は、そのための表示機能を組み立てていく過程を書いていく。
3行まとめ
バッター編をベースに、ソフトボール投手用の骨格追跡ソフトへ作り替えた。
肩・腰・足首の中心を使い、上半身と下半身の軸を分けて表示する処理を追加した。
最終版の実機動作と追跡精度は未確認で、数値解析や投球比較は今後の課題だ。
※この記事は開発途中の記録です。「実装した」はコードに機能を組み込んだ段階を指し、動作や測定精度を検証済みという意味ではありません。
バッター編から何を引き継ぎ、何を外したのか?
土台にしたのは、これまで作ってきた野球のバッティング解析ソフトだ。動画を読み込み、再生しながら身体の位置を確認するGUIの構成を、投手用にも使うことにした。
一方で、バット検出は今回の目的から外れる。スイング速度や角度の解析指標、過去の動きを重ねるゴースト比較もいったん削除した。機能を増やす前に、投球フォームの骨格追跡と表示に絞るためだ。
前回のバット検出で苦労した部分を、そのまま投手用に持ち込むのではなく、まず人体を見る道具として組み直す。今回の開発はそこから始まった。
どんな環境で作っているのか?
| 使用するもの | 今回の役割 |
|---|---|
| Python 3.10 | プログラム本体 |
| VS Code | コードの編集 |
| Tkinter | 操作画面の構築 |
| OpenCV | 動画の読み込み・再生・描画 |
| MediaPipe Pose | 身体の関節位置の推定 |
| Pillow | GUIへの動画表示 |
構成は、単独のPythonファイルを起点に起動できる形へ変更した。ただし、Pythonや必要なライブラリまで不要になるわけではない。ここでいう「単独」は、機能の断片を別々に貼り合わせるのではなく、起動用のコードを一つのファイルにまとめるという意味だ。
投球フォームのどこを追跡するのか?
追跡対象は、左右それぞれの肩・肘・手首・腰・膝・足首。合計12か所の位置を取得し、動画上に点と線で重ねる処理を組み込んだ。関節の座標をGUI上で確認する表示も用意した。
この12か所は、今回のソフトで選んだ対象数だ。MediaPipe全体が12点しか推定しないという意味ではない。参考として、現在のMediaPipe Pose Landmarkerの公式資料では33点の姿勢ランドマークが説明されている。使用APIやバージョンの違いもあるため、この記事では今回の実装対象と公式機能の説明を分けている。
検出できない関節を非表示にする処理も追加した。ただし、表示されている点が常に正しい位置とは限らない。高速な動きや身体の重なりに対して、位置が飛んだり、取り違えたりしないかは、動画で確かめる必要がある。
上半身と下半身の軸を分けると何を見たいのか?
今回、骨格の点と線に加えて作ったのが、身体の軸を表示する機能だ。腰の中心を境界に、上半身と下半身を別々の線として扱うことにした。
| 表示 | 色 | 線や点の作り方 |
|---|---|---|
| 肩ライン | 紫 | 左右の肩を結ぶ |
| 骨盤ライン | 緑 | 左右の腰を結ぶ |
| 上半身軸 | 赤 | 肩の中点と腰の中点を結ぶ |
| 下半身軸 | 水色 | 腰の中点と左右の足首の中点を結ぶ |
| 中心点 | 白 | 肩・腰・足首それぞれの中点を示す |
これによって見たいのは、投球の各場面で、上半身側と下半身側の線がどう傾き、どのような位置関係になるかだ。身体全体を一本の線として見るよりも、腰を境に分けたほうが、確認したい変化を整理しやすいと考えた。
ただし、この「軸」は2D画像上の目安の線だ。身体の内部にある本当の回転軸や重心を測っているわけではない。肩ラインと骨盤ラインの見かけの角度差も、そのまま身体の3次元的なひねりの角度にはならない。
撮影方向が変われば、同じ姿勢でも画像上の線の見え方は変わる。まずは「画面上でどう見えるか」を確認する機能として扱い、数値の意味を大きく言い過ぎないようにしたい。
フォームを見返すための操作はどうしたのか?
投球の一瞬を確認するには、ただ再生するだけでは足りない。バッター編のGUIをベースに、次の操作を組み込んだ。これらも、最終版で一通りの動作確認が必要な項目だ。
| 目的 | 組み込んだ操作 |
|---|---|
| 動画を開く・見る | ファイル読み込み、再生・停止、先頭フレームへ移動 |
| 特定の瞬間を探す | 1フレームずつ前後移動、フレームスライダー |
| 動きをゆっくり見る | 再生速度の調整(0.1〜2.0倍) |
| 向きを合わせる | 動画の左右反転、右投げ・左投げ設定 |
| 見たい部分を選ぶ | 骨格点・ラベル、腕・体幹・足、軸ラインの表示切り替え |
再生速度を下げる機能は、動きを見返すためのものだ。元動画に写っていない瞬間を復元したり、撮影時のブレを消したりするものではない。また、左右反転と右投げ・左投げ設定が表示に正しく反映されるかも確認していく。
開発中はどんな問題でつまずいたのか?
開発は、そのまますんなり完成へ進んだわけではない。最初に作ったのは骨格追跡の部分だけで、それだけでは単独で動作しない構成だった。そこで、バッター編と同じようにGUIから操作できる独立したソフトへ変更した。
さらに軸ラインを追加する過程で、部分的な修正コードと、全体をまとめた版の管理が混乱した。簡略化した全体版では、動画の表示が黒画面になる問題も起きた。
その後は元のGUI構成に戻し、動画のリサイズ、画面中央への表示、フレーム操作を含めた全体版を作り直した。ここまでが今回進めた作業だ。
黒画面の原因を特定して解消を確認した、という段階ではない。再作成した最終版を実機で動かし、動画が正しく表示されるか、操作と描画が連動するかを確かめる必要がある。コードが一つにまとまったことと、ソフトとして動くことは分けて考えたい。
次は何を検証するのか?
最初に確認したいのは、動画を開いて再生・停止し、フレームを前後に動かせるかという基本動作だ。そのうえで、関節の点や軸ラインが動画の拡大縮小や左右反転にずれずに重なるかを見たい。
追跡精度については、ウインドミル投法の速い腕の回転や、腕が身体と重なる場面が課題になる。前のフレームと急に違う位置へ点が飛ばないか、左右を取り違えていないか、非表示になった関節が戻るときにどう見えるかを確認していく。
次回は、動画の撮影方向、フレームレート、明るさなどの条件と、追跡できた場面・できなかった場面をセットで記録したい。きれいに線が出た一場面だけで「精度が高い」と判断しないためだ。
数値解析やフォーム比較はどこまで考えているのか?
今後は、リリース位置とリリースフレームの推定、手首の移動速度と最大速度、投球腕の回転角度、ステップ幅と身長に対する比率などを検討している。上半身軸・下半身軸の傾斜、肩と骨盤のラインの角度差、投球ごとの再現性、ゴースト表示による比較も候補だ。
これらは現時点で検証済みの解析機能ではない。例えば手首の画像上の移動量を実際の速度へ換算するには、時間間隔や距離の基準、撮影方向の扱いを決める必要がある。手首の速度とボールの球速も同じではない。リリースの推定にも、手首の位置だけで何が判断できるかを含めた検討が必要になる。
数値を出すだけなら、それらしい表示を作ることはできるかもしれない。けれど、元になる関節の位置がずれていれば、その数値も信頼しにくい。だから今回は、解析指標より追跡精度と表示機能の確認を優先することにした。
関連記事
AIスイング解析、次の壁は“バット検出”だった|素人エンジニアがスポーツを科学する
AIで野球のスイング解析を作ってみたら想像以上に難しかった|素人エンジニアがスポーツを科学する
まとめ
バッティング解析で使っていた人体検出の仕組みを、ソフトボール投手用に組み替えた。単純な骨格表示から、腰を境に上半身と下半身の軸を分けて可視化する処理まで、コード上の形は進んだ。
一方で、最終版が実機で問題なく動くか、速い腕の回転をどこまで追えるかは、これから確かめる段階だ。「投球解析ソフトが完成した」ではなく、「何を見たいかを絞り、検証するための形を作った」というのが今の到達点になる。
次は実際の投球動画で表示と追跡を確認する。うまくいく場面だけでなく、見失う場面も見ながら、数値解析につなげられる土台を少しずつ作っていきたい。

コメント