はじめに
2026 年度 DeNA AIスペシャリスト職のサマーインターンに参加した矢島陽樹と申します。普段は東京大学の情報理工学系研究科で、AI の安全性についての研究をしています。
本インターンでは、バスケットボールのショット映像からそのショットの期待値を予測する機械学習モデルの改善に取り組みました。具体的な改善の取り組みと、新たに可能になった分析についてご紹介します。
DeNAにおけるバスケットボールデータ分析
川崎ブレイブサンダース はBリーグに所属するプロバスケットボールクラブで、2018 年よりDeNAがチームの運営を行っています。2026-27シーズンからはリーグが新体制に移行し、川崎ブレイブサンダースはその最上位のカテゴリである B.LEAGUE PREMIER で戦っています。
近年、多くのスポーツにおいてデータ分析を用いたチームの強化が盛んに行われています。Bリーグでも分析用のデータとして、表形式のボックススコアが公開されています。
出典:B.LEAGUE 川崎ブレイブサンダース スタッツ(https://www.bleague.jp/club_detail/?TeamID=727&tab=1)
しかし、ボックススコアからは細かいプレーの状況や選手の動きを把握することができず、分析の幅に限界がありました。
これに対してDeNAでは、独自のAI技術を活用することでより高度なデータ分析を行い、チームの強化を目的とするプロジェクトを進めています。本プロジェクトにおける取り組みの1つとして、選手の位置を時系列で示したトラッキングデータの自動作成があります。
トラッキングデータ自動作成やそれを使った分析については、DeNAの技術イベントやテックブログでも紹介されていますので合わせてご覧ください。
- バスケットボール試合映像を用いたボールトラッキングデータの作成(インターンレポート)
- バスケ試合映像からのトラッキングデータ生成(DeNA × AI Talks #8 資料)
- トラッキングデータを用いた分析事例のご紹介(DeNA × AI Talks #8 資料)
上に示したのは、トラッキングデータを活用した分析の1つである、ショットの期待値を推定する機械学習モデル (以下、ショット期待値モデル) です。ショット期待値モデルは、シューターやディフェンダーの位置を含むさまざまな情報を入力とし、そのショットの成功確率を出力します。この成功確率にショットの得点(2 点または 3 点)を掛けたものが、そのショットの期待値です。これにより、選手が決まりやすい状況を選んでショットを打てているか、という観点での分析を可能にしています。
インターン課題について
現状の課題
先ほど説明した現状のショット期待値モデルには、選手の姿勢情報を考慮できていないという課題がありました。例として、似た位置・状況における 2 つのショットシーンと、モデルの予測確率を上に示しています。直感的には、ディフェンダーに手を上げられている右のショットの方がずっと難しそうに見えますが、現状のショット期待値モデルではショットの予測成功確率がほぼ変わっていません。しかし、現在のモデルに入力されていないような情報、たとえばディフェンダーの手の上げ下げや、シューターの姿勢もショットの成功確率に大きく影響するはずです。
取り組みの概要
そこで今回は、選手の姿勢から取れる特徴量をショット期待値モデルに加えることで、より直感に近い確率予測と多様な分析を実現することを目指しました。まず、アリーナに 1 台あるカメラで撮影された試合映像から、映っている選手を一人ずつ3次元空間内の姿勢として復元します。
この3次元空間上の姿勢から、関節同士の距離や体の向きといった特徴量を抽出し、新たにショット期待値モデルの入力とします。実際に姿勢の特徴量を加えた新たなモデルでは、ディフェンダーの手が下がっている左の場面の予測が 38.7% から 41.6% に上がり、手を上げられている右の場面の予測は 36.4% から 32.2% に下がりました。このように選手の姿勢情報を考慮することで、より直感的な予測確率を出せるようになります。
以降では、映像から姿勢情報をどう取り出したのか、そこからどんな特徴量を作ったのか、そしてモデルがどう改善したのかを順に説明します。
本インターンでの取り組み
モデルの選定と課題
まずは ViTPose++ 1を用いた2次元姿勢推定から試しました。これは RGB 画像と選手のバウンディングボックス (bbox) を入力として、2次元座標上の関節のキーポイントを出力するモデルです。bbox は既存のパイプラインですでに取得しているため、そのまま入力に利用できます。
しかし、2次元の姿勢からは、関節同士の距離など3次元情報を考慮した特徴量が取りづらいという課題が存在します。下に示すように、画像上の見かけでは数pxしか離れていなくても、3次元空間上では遠く離れている場合があるためです。そこで、3次元空間内での姿勢が得られれば、関節同士の距離を実寸で測れるようになり、より詳細な分析ができると考えました。
続いて、3次元姿勢推定のモデルとして SAM 3D Body 2を採用しました。このモデルは 1 枚の画像から人物の全身の3次元メッシュを推定するモデルで、既存のパイプラインですでに取得できている bbox で選手を指定することで、映っている選手を一人ずつ推定できます。
はじめに、3次元空間上での位置の基準として、映像を撮影しているカメラとバスケットボールコートの位置を決めます。以下では、コートの隅を原点とし、床を $xy$ 平面、鉛直上向きを $z$ 軸にとった座標(以下、コート座標。単位は m)で位置を表します。床の高さは $z = 0$ です。映像からコートのラインを検出し、3次元空間上のコートと重ね合わせることで、コート座標におけるカメラの位置と向き、およびカメラから見えている範囲を推定します。
次に SAM 3D Body を用いて、映っている選手を一人ずつ3次元姿勢として推定します。
ぱっと見では綺麗に3次元姿勢を推定できているように見えますが、素の出力はカメラからの奥行き関係を上手く考慮できておらず、横からみると選手が床から浮いてしまっています。
この理由は、単眼の映像では奥行きと身長の関係を分離できないことにあります。すなわち、下図に示すようにカメラに近い小さめの人と、カメラから遠い大きめの人が、カメラから見たらまったく同じように写ってしまうのです。
具体的には、モデルが推定した選手の3次元姿勢についてカメラの位置を中心に丸ごと $s$ 倍すると、カメラからの距離と身長がどちらも $s$ 倍になり、画像上の写り方は変わりません。以下ではこの $s$ を倍率と呼びます。カメラからの見え方を変えないまま倍率を変えていく様子を以下に示します。ここまでの議論から、選手ごとの適切な倍率をなんらかの方法で決める必要があるとわかりました。
素朴なアプローチとして、トラッキングデータを用いた補正が挙げられます。コート座標上の選手の位置を記録したトラッキングデータの位置に合うような倍率を設定したところ、それでも選手全員が床から浮いてしまうということが分かりました。これは、トラッキングデータの位置と姿勢推定の結果には誤差があり、その誤差が奥行き方向のずれとして残ってしまうためだと考えられます。
提案アプローチ
ここからは、ボールがシューターの手から離れる瞬間の試合画像(以下、ショットフレーム)において、各選手の適切な倍率を決めるために実際に採用した提案手法について説明します。
接地の仮定
まず、問題を単純にするために、ほとんどの選手は床に立っている (接地している) という仮定をおくことにしました。各選手の足が床に接するように倍率を決めれば、ほとんどの選手が浮いてしまうという問題は解決します。
しかし、ショットフレームにおいて多くの場合、シューターと周辺のディフェンダーは跳んでいます。上記の単純な方法では、シューターと周辺ディフェンダーの位置関係を正しく推定できていないという課題があります。そのため、シューターの周辺の選手は別の情報を用いて奥行きを推定する必要があります。
前後のフレームを使った同時最適化
そこで、ショットフレームの前後のフレームの情報を併せて用いることで、シューターと周辺ディフェンダーの倍率を高い精度で決定する最適化手法を提案します。下の動画は、ショットフレーム前後の計 18 フレームについて、倍率を調整した後の身長が全フレームで同じになるよう、ナイーブに 1 フレームずつ独立に倍率を決めた結果を示しています。1 フレームだけで決める倍率にはばらつきがあり、足が床にめり込んでしまうといった問題があります。
ショットフレーム前後の計18フレームをそれぞれ $f = 1, 2, \dots, 18$ と番号付けし、フレーム $f$ の時刻を $t_f$[s]とします。フレーム $f$ におけるカメラの位置を $c_f \in \mathbb{R}^3$、モデルが推定した3次元姿勢をそのまま3次元空間に配置したときのカメラから足元へのベクトルを $b_f \in \mathbb{R}^3$ とすると、これを $s_f \gt 0$ 倍したときの足元の位置 $p_f \in \mathbb{R}^3$ は
$$ p_f = c_f + s_f b_f $$
です。このとき各フレームの未知数は $s_f$ の 1 つだけで、選手の足元の位置 $p_f$ は $s_f$ の 1 次式になります。この $s_1, \dots, s_{18}$ を、以下の 4 つの誤差の和が最小になるように決めます。
$$ E(s, v, B \mid T, L) = E_{\mathrm{body}} + E_{\mathrm{ground}} + E_{\mathrm{flight}} + E_{\mathrm{smooth}} $$
1 つ目は、倍率を調整した後の身長のばらつきに関する誤差です。フレーム $f$ でモデルが推定した3次元姿勢の身長を $h_f$[m]とすると、倍率 $s_f$ を調整した後の身長は $s_f h_f$ になります。選手の実際の身長はフレームによって変わらないので、全フレームで共通の値 $B$[m](これも未知数)に近いほど良いとします。
$$ E_{\mathrm{body}} = \sum_{f=1}^{18} \left( \frac{s_f h_f - B}{\sigma_b B_0} \right)^2 $$
ここで $\sigma_b = 0.02$ は許容する身長のばらつき(2%)で、$B_0$ は単位をそろえるための定数(全フレームで足元を床に置いたときの、倍率を調整した後の身長の中央値)です。全フレームで $s_f h_f = B$、つまり $s_f = B / h_f$ とするとこの誤差は 0 になります。先ほどの 1 フレームずつ決めた倍率は、この誤差だけを 0 にした解にあたります。
2 つ目は、接地に関する誤差です。踏み切りのフレームを $T$、着地のフレームを $L$ とし、これらはいったん決まっているものとします。ショットフレームの番号を $k$ とすると $T \le k \lt L$ です。空中にいるのは $T \lt f \le L$ のフレームで、その集合を $\mathcal{A}$、それ以外の床にいるフレームの集合を $\mathcal{G}$ と書きます。床にいるフレームでは、足元の高さ $z_f$($p_f$ の $z$ 成分)が 0 であるべきです。
$$ E_{\mathrm{ground}} = \sum_{f \in \mathcal{G}} \left( \frac{z_f}{\sigma_g} \right)^2 $$
ここで $\sigma_g = 0.02$ m は、床にいるフレームで許容する足元の高さのずれを表します。
3 つ目は、空中の軌道が放物線からずれる誤差です。空中にいる間、足元は踏み切りの位置 $p_T$ から速度 $v \in \mathbb{R}^3$[m/s](これも未知数)で飛び出し、重力だけを受けて動くはずです。踏み切りからの経過時間を $\tau_f = t_f - t_T$、重力加速度を $g = 9.81$ m/s²、鉛直上向きの単位ベクトルを $e_z = (0, 0, 1)^\top$ とすると、この軌道からのずれは次のように書けます。
$$ E_{\mathrm{flight}} = \sum_{f \in \mathcal{A}} \left( \frac{\lVert p_f - p_T - \tau_f v + \frac{1}{2} g \tau_f^2 e_z \rVert}{\sigma_a} \right)^2 $$
ここで $\sigma_a = 0.03$ m は、放物線から許容するずれを表します。床にいるフレームを空中にいる、と誤って推定した場合、この放物線の誤差項が大きくなってしまいます。
4 つ目は、水平方向の動きの滑らかさに関する誤差です。足元の水平位置は、連続する 3 フレーム間で急激に変化しないはずです。足元の位置 $p_f$ の水平成分だけを取り出す行列を $P = \mathrm{diag}(1, 1, 0)$ として、加速度にあたる 2 階差分を小さくします。
$$ E_{\mathrm{smooth}} = \sum_{f=2}^{17} \left( \frac{\lVert P \left( p_{f+1} - 2 p_f + p_{f-1} \right) \rVert}{\sigma_s} \right)^2 $$
ここで $\sigma_s = 0.03$ m は、2 階差分で許容する水平方向のずれです。本来は空中にいるフレームを接地している、と誤って推定した場合、足元が視線に沿って奥へずれるため、この滑らかさに関する誤差項が大きくなってしまいます。
踏み切りと着地のフレーム $T, L$ を決めたうえで、この 4 つを足した誤差
$$ E(s, v, B \mid T, L) = E_{\mathrm{body}} + E_{\mathrm{ground}} + E_{\mathrm{flight}} + E_{\mathrm{smooth}} $$
が最小になるように、倍率 $s = (s_1, \dots, s_{18})$、速度 $v$、倍率を調整した後の身長 $B$ を求めます。$p_f$ が $s_f$ の 1 次式なので、どの項も未知数の 1 次式の二乗和になり、$E$ を最小にする解は線形最小二乗法で 1 回で求まります。
下の動画は、身長のばらつきの誤差だけを 0 にした状態(1 フレームずつ決めた倍率)から、接地・放物線・滑らかさの誤差を 1 つずつ足して解き直した様子です。項を増やすにつれて、足元の軌跡が自然な動きに収束していく様子がわかります。
踏み切りと着地のフレーム $T, L$ は、候補となるフレームの組をすべて試し、誤差 $E$ がもっとも小さくなる組を選びます。候補は
- ショットフレーム $k$ が滞空時に含まれる
- 踏み切りがショットフレームの 8 フレーム前以降
- 空中にいる時間 $t_L - t_T$ が 0.20 秒以上 0.85 秒以下
となる組、と定めました。すなわち、どのフレームで空中にいるかは最適化の結果として決まります。
例として示したこのショットでは、踏み切りがショットフレームの 0.13 秒前、着地が 0.33 秒後と求まり、ショットフレームでの足元の高さは 0.25 m、跳躍の頂点は 0.38 m と推定されました。同じ最適化手法を、シューターと、シューターから 2 m 以内にいる相手チームの選手に対して適用しています。
以上のパイプラインを用いて、最終的に得られた3次元姿勢がこちらです。
ショット期待値モデルの改善
新たに得られた選手の3次元姿勢情報を用いて、ショット期待値モデルの精度改善に取り組みました。
姿勢特徴量の作成
復元した3次元姿勢から、ショットの難しさに関わりそうな特徴量を作成しました。いくつかの例を挙げます。
シューターの床からの肩の高さ
どれだけ高い打点で打てているかを測ります。
シューターのゴールに対する体幹の傾き
鉛直方向からどれだけ傾いているかを、ゴール方向を基準に測ります。
ショットまでの体の回転角度
Always Look on the Bright Side of the Field: Merging Pose and Contextual Data to Estimate Orientation of Soccer Players 3という論文で用いられている手法を参考に、2次元姿勢から体の向きを推定します。両肩・両腰のキーポイントを結ぶ線分をコート平面に射影し、その法線の向きを体の向きとするものです。2次元姿勢推定の誤差の影響を少なくするために、前後 1 秒で平滑化した上で、ショットまでにどれだけ体を回したかを測ります。
ディフェンダーの床からの手の高さ
ディフェンダーがどこまで手を伸ばしているかを測ります。
ディフェンダーの手が頭より上に出た高さ
床からの手の高さを測るだけでは、背の高い選手が手を下げている状況と、背の低い選手が手を上げている状況を区別しにくいという問題があります。そこで、頭を基準にした相対的な手の高さも取りました。
視界を遮るディフェンダーの体までの最短距離
シューターからゴールを見ている直線に対して、ディフェンダーの体がどれだけ近いかを測ります。
これらに シューターの体の伸び を加えた計 7 つの特徴量を作成しました。
定量評価
ショット期待値モデルには、勾配ブースティング決定木の一種である LightGBM 4 を採用しています。この既存のモデルの入力に、作成した 7 つの特徴量を加えて再学習しました。評価指標には Brier・LogLoss・AUC の 3 つを用いています。
| 追加した特徴量 | Brier (↓) | LogLoss (↓) | AUC (↑) |
|---|---|---|---|
| ベースライン | 0.22370 | 0.63774 | 0.6696 |
| + ディフェンダーの床からの手の高さ | 0.22344 | 0.63704 | 0.6700 |
| + シューターの肩の高さ | 0.22315 | 0.63630 | 0.6706 |
| + ショットまでの体の回転角度 | 0.22314 | 0.63628 | 0.6708 |
| + ディフェンダーの手が頭より上に出た高さ | 0.22287 | 0.63563 | 0.6712 |
| + シューターのゴールに対する体幹の傾き | 0.22264 | 0.63512 | 0.6720 |
| + 視界を遮るディフェンダーの体までの最短距離 | 0.22237 | 0.63451 | 0.6725 |
| + シューターの体の伸び | 0.22207 | 0.63373 | 0.6731 |
Brier:予測確率と結果(成功 = 1、失敗 = 0)の差の二乗の平均。どのショットにも 50% と予測すると 0.25 になり、小さいほど良い指標。
LogLoss:実際の結果に付けていた確率で負の対数をとった平均。自信を持って外すほど値が大きくなり(10% と予測したショットが決まると 2.30、50% なら 0.69)、小さいほど良い指標。
AUC:成功と失敗のショットを 1 本ずつ選んだとき、成功の方に高い確率を付けている割合。0.5 は当てずっぽう、1 は完全に見分けられる状態で、大きいほど良い指標。
姿勢から取得した特徴量を 1 つずつ足していったところ、3 つの指標がいずれも単調に改善していることが分かります。
定性評価
姿勢特徴量を加えたことによるモデルの予測確率の変化を、いくつか実際のショットの場面で示します。以下の例では、ディフェンダーに手を上げられている場面でミスをしたシーンにおいて、ショットの予測成功確率が 47.6% → 41.2% と 6.4pt 減少しました。
逆に、ディフェンダーの手が下がっている場面で成功したシーンにおいては、ショットの予測成功確率が 52.4% → 63.7% と 11.3pt 上昇しています。
どちらもトラッキングデータによる選手の位置情報だけでは説明できなかったショットの難しさ/易しさを、姿勢情報を用いることで新たに考慮できていることを示しています。
姿勢情報を使った分析の例
姿勢情報が得られたことで、モデルの改善だけでなく分析そのものの幅も広がります。一例として、ディフェンダーの手の高さとショット成功率の関係をエリア別に見てみましょう。下図は横軸にディフェンダーの手の高さ(頭を基準とした相対値)、縦軸に実際のショット成功率をとったものです。各線はシューターとディフェンダーの距離によって分かれており、青線が 0〜1m、オレンジ線が 1〜2m、緑線が 2〜3m 離れていた状況でのデータを表しています。
簡易的な分析にはなってしまいますが、たとえば以下のようなことが分かります。
- ペイント内では、手を上げるほど相手のショット成功率を下げられる傾向がある。
- 3 ポイントでは手の上げ下げによってショット成功率の変化は小さく、ディフェンダーの位置が近いかどうかの影響の方が大きい。
シューターとディフェンダーの距離が近い (0〜1m) 青線を見ると、手の高さが上がるほどショット成功率が 67% から 53% 程度まで右肩下がりになっていることが分かります。3 ポイントの成否はシューターの技量にも大きく左右されます。そのため、シュートが苦手な選手にあえて打たせるといったディフェンス側の戦略も影響している可能性があり、さらに深掘りできるポイントだと考えています。
まとめ・今後の展望
これまで分析に用いられていたショット期待値モデルは、主にトラッキングデータを利用した位置情報しか考慮できていませんでした。今回の取り組みによって単眼映像から3次元姿勢を復元して特徴量を作ることで、以下に例として示すようなより細かい分析が可能になりました。
オフェンスに対して:
- 手を伸ばされている厳しい状況でも打てる選手なのか?
- 普段と変わらず安定した姿勢で打てている選手は誰なのか?
ディフェンスに対して:
- 手を上げることで相手のショット成功率を下げられるのか?
- しっかり手を上げてプレッシャーをかけられる選手なのか?
- 相手の体勢を崩せる選手なのか?
一方で、今回のインターン期間では解決することができなかった残りの課題や、さらなる分析方法の案も存在します。そこで、以下にいくつか今後の展望としてまとめて紹介します。
体の向き推定を用いた戦術の自動検出
今回作成した体の向きの情報を用いることで、試合映像からさまざまな戦術を自動的に検出することができると考えています。たとえばオンボールスクリーン(ボールを持っている味方選手 (ハンドラー) をマークしているディフェンダーに対し、別の味方選手 (スクリーナー) が壁のように立ちふさがり進路を妨害する)と呼ばれるプレーは、トラッキングデータと体の向きを組み合わせることである程度自動的に検出することが可能です。このように戦術を検出することで、どのチームがどの戦術をどれくらい使用しているのか、その戦術によってショット成功確率はどのように変化しているのか、といった分析が可能になります。
遮蔽時の精度改善
ゴール付近では選手同士の遮蔽 (オクルージョン) が起こりやすく、姿勢情報が正しく取れないことがあります。数値が誤ったまま集計されると、そのまま誤った分析につながってしまう可能性があります。たとえば遮蔽を考慮した姿勢推定モデル( MIPNet 5など)を用いることが改善案として考えられます。
3次元姿勢の補正改善
今回用いた同時最適化でも、遮蔽などで姿勢推定の結果が崩れると最適化の結果が不自然になり、奥行きのずれが残ってしまうショットが全体の約 2 割あります。そのため、現状の手法をさらに改良する必要があります。改善案として、トラッキングデータを明示的に利用した奥行き補正や、単眼深度推定モデルの出力を床に合わせて使う方法などが考えられます。
おわりに
4 週間という短い期間ではありましたが、実際のプロジェクトに配属され、社員の方々と同じ裁量と責任のもとで仕事に取り組むことができました。自社でスポーツチームを運営している DeNA では、豊富なデータに触れながら、AI の専門性をそのままチームへの貢献につなげることができます。手法の新しさを競う普段の研究とは違い、この分析が現場で何の役に立つのかを日々考えることは、自分にとって非常に新鮮で、学びの多い経験でした。
メンターの吉川さんをはじめ、プロジェクトの皆様、人事の方々などお世話になったすべての皆様に感謝いたします。本当にありがとうございました。
参考文献
-
Yufei Xu, et al. “ViTPose++: Vision Transformer for Generic Body Pose Estimation”, IEEE TPAMI, 2024. ↩︎
-
Xitong Yang, et al. “SAM 3D Body: Robust Full-Body Human Mesh Recovery”, arXiv:2602.15989, 2026. ↩︎
-
Adrià Arbués-Sangüesa, et al. “Always Look on the Bright Side of the Field: Merging Pose and Contextual Data to Estimate Orientation of Soccer Players”, ICIP, 2020. ↩︎
-
Guolin Ke, et al. “LightGBM: A Highly Efficient Gradient Boosting Decision Tree”, NeurIPS, 2017. ↩︎
-
Rawal Khirodkar, et al. “Multi-Instance Pose Networks: Rethinking Top-Down Pose Estimation”, ICCV, 2021. ↩︎
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。