ボクシングにAIを導入したい!
こんにちは!NISLab小板研所属M1の岡島です。
本日は、ボクシングにAIを導入するための第1歩目として、深層学習を用いて打撃を比較してみたので紹介したいと思います!
私たちの研究室
アドベントカレンダー 27日目
なぜボクシングにAIを導入するのか
近年、デジタル技術の急速な発展により、さまざまな分野でデジタル化が進んでいます。
スポーツ業界も例外ではなく、野球やサッカー、テニスといったメジャー競技では、デジタル技術を活用した判定補助システムやパフォーマンス分析が一般的になりつつあります。
しかし、ボクシングのような競技では、デジタル化がまだ十分に進んでいないのが現状です。
特に問題視されているのが、試合の判定における主観性です。
現在のボクシングの判定方法では、審判の主観が試合結果に影響を与えることがあり、公平性の欠如が議論の対象となっています。
他のスポーツで実現されているように、センサデータや映像解析を活用することで、ボクシングでも客観的な判定を行う仕組みを構築できるのではないでしょうか。
深層学習を用いてみた
今回、Apple Watchで取得したジャブの打撃データを用い、深層学習モデルで分析を行いました。
1. データの読み込みと整理
最初に、Apple Watchで記録した3軸加速度データを100個のExcelファイルから読み込み、リスト形式で格納します。
import os
import pandas as pd
# フォルダに移動
folder_path = '/content/drive/MyDrive/jyabu2'
os.chdir(folder_path)
# ファイル読み込み例(100個のファイルがあると仮定)
data = []
for i in range(1, 101):
file_name = f'{i}.xls'
file_path = os.path.join(folder_path, file_name)
df = pd.read_excel(file_path)
data.append(df)
- 目的: Excel形式のデータを効率的に読み込むため、ループ処理を使用。
- ポイント: pandas.read_excel() で各ファイルをデータフレームとして読み込み、リスト data に格納しています。
2. 特徴量とラベルの選択、データ分割
次に、データからモデルの入力(特徴量)と出力(ラベル)を定義し、トレーニング用と検証用に分割します。
from sklearn.model_selection import train_test_split
# 特徴量とラベルの選択
features = df[['X', 'Y', 'Z']]
labels = df['Time(sec)']
# データの分割
train_data, val_data, train_labels, val_labels = train_test_split(features, labels, test_size=0.2, random_state=42)
- 目的: モデルが学習するためのデータを準備する。
- ポイント:
- features: X, Y, Z軸の加速度データを使用。
- labels: 打撃タイミングを表す時間データ。
- train_test_split(): データを8:2の割合で分割。
3. 時系列データの前処理
時系列データをLSTMに適した形式に変換するため、シーケンスデータを作成します。
import numpy as np
# データの前処理
def prepare_sequences(data, labels, time_steps):
x, y = [], []
for i in range(len(data) - time_steps):
x.append(data.iloc[i:(i + time_steps)].values)
y.append(labels.iloc[i + time_steps])
return np.array(x), np.array(y)
# シーケンスの長さ
time_steps = 10
# シーケンスデータの作成
train_data, train_labels = prepare_sequences(train_data, train_labels, time_steps)
val_data, val_labels = prepare_sequences(val_data, val_labels, time_steps)
- 目的: 時系列データを一定の時間窓で区切り、学習可能な形に変換。
- ポイント:
- time_steps: シーケンスの長さ(今回は10)。
- 各シーケンスは10ステップ分のデータを含み、次のステップのラベルを予測。
4. モデルの構築
LSTM層を含む深層学習モデルを構築します。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
# モデルの定義
model = Sequential()
# LSTM層を追加
model.add(LSTM(units=64, activation='relu', input_shape=(None, 3))) # 3は特徴の数(X, Y, Z)
# Dense層を追加(出力層)
model.add(Dense(units=1, activation='linear')) # 1は出力の次元数
# モデルのコンパイル
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae'])
# モデルの概要表示
model.summary()
- 目的: 時系列データを解析し、未来の値を予測するモデルを作成。
- ポイント:
- LSTM: 時系列データに適したニューラルネットワーク。
- Dense: 出力層で1つの値を予測。
5. モデルのトレーニング
準備したデータを用いてモデルを学習させます。
history = model.fit(train_data, train_labels, epochs=20, batch_size=32, validation_data=(val_data, val_labels))
- 目的: データに基づいてモデルを学習。
- ポイント:
- epochs: 学習回数(20)。
- batch_size: ミニバッチサイズ(32)。
6. モデルの評価と可視化
トレーニングと検証の損失や誤差を可視化します。
import matplotlib.pyplot as plt
# トレーニングデータと検証データの損失
train_loss = history.history['loss']
val_loss = history.history['val_loss']
# トレーニングデータと検証データのMAE
train_mae = history.history['mae']
val_mae = history.history['val_mae']
# エポック数
epochs = range(1, len(train_loss) + 1)
# 損失の可視化
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(epochs, train_loss, 'bo-', label='Training Loss')
plt.plot(epochs, val_loss, 'ro-', label='Validation Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
# MAEの可視化
plt.subplot(1, 2, 2)
plt.plot(epochs, train_mae, 'bo-', label='Training MAE')
plt.plot(epochs, val_mae, 'ro-', label='Validation MAE')
plt.title('Training and Validation MAE')
plt.xlabel('Epochs')
plt.ylabel('MAE')
plt.legend()
plt.show()
- 目的: モデルの性能を視覚的に確認。
- ポイント: 損失と誤差を比較して学習の進捗を確認。
上記を実行すると以下の結果が得られました。
今回はデータ数を100としたため、今後はさらに多くのデータ数で実験を行いたいと思います。
最後に
今回は、深層学習を活用してボクシングの判定における客観性を高める可能性を探りました。
具体的には、センサデータをもとにモデルを構築し、打撃の解析を行うことで、AIを活用した新たな判定システムの基礎を検討しました。
私はAI技術の活用により、ボクシングの判定がより公平で信頼性の高いものになる未来を目指しています。
ボクシングにおけるAI活用の可能性に興味を持った方は、ぜひ一緒にこの課題に取り組みましょう!
Discussion