AI、ML、DL相關,  程式設計

【論文整理】《Magnus-Forces Analysis of Pitched-Baseball Trajectories Using YOLOv3-Tiny Deep Learning Algorithm》​

※ 論文概述

  主要研究棒球投球時的馬格努斯力(Magnus force)對球的飛行軌跡的影響,並使用 YOLOv3-tiny 深度學習演算法來自動偵測與分析棒球的軌跡、速度與旋轉速率。這項研究的主要貢獻包括:

  1. 基於電視轉播影像的棒球軌跡分析:透過 YOLOv3-tiny 演算法來偵測並追蹤棒球在飛行過程中的位置,並記錄投手投球點與捕手接球點的座標。
  2. 馬格努斯力與棒球軌跡的關係:研究馬格努斯力如何影響棒球的垂直位移,並進一步探討其對「late break(晚期變化)」的影響。
  3. 投球數據的準確性:該系統在測試時,相較於電視轉播提供的數據,球速的平均誤差為 1.88%,旋轉速率的平均誤差為 7.51%
  4. 分析投手表現:透過「旋轉速率與球速的比值」,研究投手投出四縫線速球(four-seam fastball)時的球變化特性,發現當該比值增加時,馬格努斯位移也會增加,導致晚期變化減少。

🔍 研究背景與動機

現今職業棒球隊伍使用高科技測量工具,如 Statcast 系統(Trackman 雷達技術) 來分析投手的表現,但這些設備昂貴且難以部署於各種場地。因此,本研究提出:

  • 基於電視轉播影片(1080p 或 4K) 來分析棒球軌跡
  • 利用 YOLOv3-Tiny 深度學習演算法 自動檢測並計算球速與自旋速率
  • 使用空氣動力學理論 計算 Magnus 效應對棒球飛行的影響

📌 研究方法

本研究的自動測量與分析系統包含兩大部分:

1️⃣ YOLOv3-Tiny 影像辨識

  • 透過 YOLOv3-Tiny 深度學習演算法 自動偵測電視轉播影片中的棒球位置
  • 標記 投手出手點、捕手接球點
  • 繪製棒球軌跡

2️⃣ 空氣動力學分析

分析棒球飛行中三大力:

  • 重力(F_g)
  • 空氣阻力(F_D)
  • Magnus 力(F_M, 旋轉產生的升力)

計算公式:

空氣阻力:

\[ F_D = -\frac{1}{2} C_D \rho A v^2 \]

Magnus 力:

\[ F_M = -\frac{1}{2} C_M \rho A v^2 (\omega \times v) \]

透過投影數據計算:

  • 球速(v)
  • 自旋速率(ω)
  • Magnus 位移(∆y,棒球受旋轉影響的垂直位移)

YOLOv3-Tiny 訓練流程

這篇論文探討如何使用 YOLOv3-Tiny 深度學習模型來分析棒球的投球軌跡,並計算其球速與旋轉速率。以下是詳細的訓練流程:

🔹 1. 數據準備(Data Preparation)

  • 數據來源: 來自棒球比賽的電視轉播,共 30 段影片
  • 影像數量: 485 張圖片
  • 訓練集: 388 張(80%)
  • 測試集: 97 張(20%)
  • 影像解析度: 608 × 608 pixels

🔹 2. 訓練超參數(Hyperparameters)

參數
批次大小(Batch Size) 64
學習率(Learning Rate) 0.001
Momentum 0.9
Weight Decay 0.0005
訓練 Epochs 12000

🔹 3. 模型架構與訓練流程

研究團隊選擇 YOLOv3-Tiny 608×608 進行訓練,並使用下列流程:

  • 載入 YOLOv3-Tiny 預訓練權重
  • 使用 SGD 優化器進行 12000 epochs 訓練
  • 使用 交叉熵損失(Cross-Entropy Loss) 訓練分類部分
  • 使用 Bounding Box Loss 訓練目標邊界框

🔹 4. 訓練成果與評估

評估指標 YOLOv3-Tiny(608×608) YOLOv3(608×608) YOLOv4(608×608)
IoU (%) 68.7 73.9 78.2
Precision (%) 89.1 97.2 99.8
Recall (%) 89.2 97.8 99.1
Frame Rate (FPS) 47.0 18.9 17.1

根據結果,YOLOv3-Tiny 608×608 雖然準確度略低於 YOLOv4,但運行速度更快(47 FPS),適合即時分析。

YOLOv3-Tiny 訓練程式碼

以下是 YOLOv3-Tiny 在 Python 中的訓練流程:


import torch
import torch.optim as optim
from yolov3_tiny import YOLOv3Tiny  # 假設這是YOLOv3-Tiny的模型定義

# 1. 載入 YOLOv3-Tiny 模型
model = YOLOv3Tiny()

# 2. 設定超參數
learning_rate = 0.001
epochs = 12000
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9, weight_decay=0.0005)
loss_fn = torch.nn.CrossEntropyLoss()

# 3. 訓練迴圈
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()

    # 假設 training_data 是加載好的訓練集
    images, labels = next(iter(training_data))  
    outputs = model(images)

    loss = loss_fn(outputs, labels)
    loss.backward()
    optimizer.step()

    if epoch % 1000 == 0:
        print(f"Epoch {epoch}/{epochs}, Loss: {loss.item()}")

# 4. 儲存訓練好的模型
torch.save(model.state_dict(), "yolov3_tiny_trained.pth")
print("訓練完成,模型已儲存!")

⚾ 針對 NPB 和 MLB 投手的投球狀態分析

📌 日本職棒(NPB)—— 2019年10月6日

投手: 美馬學(Tohoku Rakuten Golden Eagles)

  • 四縫線速球球速: 137-147 km/h
  • 自旋速率: 2219-2495 rpm
  • 自旋速率/球速比值: 15.10-18.21

關鍵分析:

  • 當該比值增加時,投球的晚期變化變小
  • 第3局時該比值升高,美馬學失3分

📌 美國職棒大聯盟(MLB)—— 2022年4月14日

投手: 大谷翔平(Los Angeles Angels)

  • 四縫線速球球速: 154-158 km/h
  • 自旋速率: 2157-2395 rpm
  • 自旋速率/球速比值: 13.93-15.59

關鍵分析:

  • 當該比值增加時,投球的晚期變化變小
  • 第2局和第4局時該比值升高,大谷翔平分別失4分與2分

📌 美國職棒大聯盟(MLB)—— 2022年4月18日

投手: Clayton Kershaw(Los Angeles Dodgers)

  • 四縫線速球球速: 143-146 km/h
  • 自旋速率: 2310-2467 rpm
  • 自旋速率/球速比值: 16.01-17.23

關鍵分析:

  • 第5局和第6局該比值升高,Clayton Kershaw 分別失1分與3分

🔍 研究貢獻與應用

📌 主要貢獻

  • 首次使用 YOLOv3-Tiny 演算法來追蹤棒球軌跡
  • 提出球速與自旋速率比值作為衡量投球晚期變化的參數
  • 提供可行的低成本解決方案(無需昂貴的 Statcast 設備)

📌 實際應用

  • 📈 提升投手訓練的科學化
  • 📡 即時提供轉播單位更精確的投球數據
  • 幫助球隊分析投手的表現變化

🎯 結論

這項研究提供了一種新穎且低成本的方法來分析棒球投手的表現。通過 YOLOv3-Tiny 深度學習演算法與空氣動力學理論,本系統成功計算 球速、自旋速率、Magnus 位移與晚期變化,並證明了 自旋速率/球速比值 是評估投球晚期變化的重要參數。

該系統不僅有助於提升投手訓練,亦可提供更準確的轉播數據,未來可進一步應用於各級棒球比賽及訓練系統

📌 評論

1️⃣ 訓練數據集過小,可能影響泛化能力

從深度學習(DL)的角度來看,30 段影片裡面找 485 張截圖,確實算是相對較小的訓練集,可能會影響模型的泛化能力,特別是在面對不同比賽場景、攝影角度、光照條件等變化時。

2️⃣ YOLO 模型通常需要大量數據

  • YOLO 系列(尤其是 YOLOv3 及其變種)本來就依賴大量標註數據來學習目標特徵。
  • 即使 YOLOv3-Tiny 是輕量化版本,485 張圖片的訓練集仍然可能不足。
  • 深度學習模型的效果通常會隨著數據量的增加而顯著提升。

3️⃣ 可能會導致模型過擬合(Overfitting)

如果訓練數據來自 相似的攝影角度或場景,模型可能會學習到特定背景或燈光條件,而不是泛化到其他場景。

4️⃣ 缺乏不同類型的投球訓練數據

這篇論文主要關注 四縫線速球(Four-seam fastball)、指叉球(Forkball)、變速球(Change-up) 等特定類型的球種。

然而,若數據集中這些球種的樣本數不均衡(例如變速球的樣本較少),模型可能無法準確區分不同類型的投球。


📌 改進建議

✅ 方法 1:擴增數據(Data Augmentation)

數據增強(Data Augmentation) 是提升準確度最有效的方法之一,特別是在數據量不足的情況下。

  • 旋轉 & 翻轉(Rotation & Flip):旋轉影像(±10~15°),模擬不同攝影角度。
  • 調整亮度 & 對比度(Brightness & Contrast):模擬不同燈光條件。
  • 添加模糊 & 雜訊(Blur & Noise):模擬轉播畫面品質下降的影響。
  • 隨機遮擋(Random Erasing):讓模型學會在有干擾物的情況下仍能偵測棒球。

📌 Python 代碼示例


import cv2
import albumentations as A

augment = A.Compose([
    A.Rotate(limit=15, p=0.5),  # 隨機旋轉
    A.RandomBrightnessContrast(p=0.5),  # 亮度對比度
    A.GaussianBlur(p=0.2),  # 模糊
    A.CoarseDropout(max_holes=2, max_height=20, max_width=20, p=0.3)  # 遮擋部分影像
])

# 讀取圖片並增強
image = cv2.imread("baseball.jpg")
augmented = augment(image=image)['image']
cv2.imwrite("augmented.jpg", augmented)

🚀 這樣可以輕鬆把 485 張影像擴增到 3000+ 張,有效提升模型泛化能力!


✅ 方法 2:使用高幀率影片擷取更多影像

目前論文是從 30 段影片中截取 485 張圖,這數量可能遠遠不夠。

如果 每段影片是 30 FPS,那 1 秒鐘的影片就有 30 張影像。

如果改為從 每秒擷取 5~10 張影像,可以將訓練數據提升 10 倍!


✅ 方法 3:嘗試更強大的 YOLO 模型

  • YOLOv4 / YOLOv5
    • YOLOv4 有更好的 backbone(CSPDarknet)。
    • YOLOv5 使用 PyTorch,訓練更容易。
  • 使用更適合小物體偵測的 YOLOv8
    • YOLOv8 針對小物件(如棒球)進行優化。
    • 訓練時可以加入 Mosaic Augmentation,提升泛化能力。

✅ 方法 4:使用遷移學習(Transfer Learning)

YOLOv3-Tiny 原始權重來自 COCO dataset,但 COCO 主要包含大物件(人、車等),不適合偵測小型棒球。

📌 Python 代碼示例


model = YOLOv3Tiny(pretrained=True)
for param in model.backbone.parameters():
    param.requires_grad = False  # 凍結 backbone,僅訓練最後幾層

🚀 這樣可以讓模型更專注於棒球偵測,而不是一般物件偵測!


📌 結論:如何提升 YOLOv3-Tiny 的準確度?

方法 效果提升 適合的場景
擴增數據(Data Augmentation) ✅ 大幅提升泛化能力 適合小數據集
擷取更多影像(Video Frame Extraction) ✅ 提高數據量 10 倍 影片來源豐富
使用 YOLOv4 / YOLOv5 / YOLOv8 ✅ 模型更強大 計算資源足夠
遷移學習(Transfer Learning) ✅ 更專注於棒球偵測 需要已有預訓練模型

📌 綜合建議: 👉 短期內:先進行 數據增強,並從影片擷取更多影像。
👉 長期方案:改用 YOLOv8,並使用遷移學習。

Views: 1

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料