🎾 Talking Tennis 复现 · CNN-LSTM + biomech + GPT-4o 教练反馈

加载中…

总览

训练曲线

混淆矩阵 (val · 360 clip)

行 = 真实 · 列 = 预测 · 色深 = row-normalized 比例 · 高亮:对角线(正确)/同 family 内混淆

同 family 分组: backhand 系(4 类) forehand 系(4 类) service + smash 系(4 overhead 类)

样本画廊 — RGB / Pose / Biomech / GPT-4o 反馈

从 360 val(p10-p14 + p41-p45 hold-out)挑 9 个有代表性 clip,跑完整管线。所有视频用浏览器原生 H.264 播放器。

论文对照

论文章节实现位置对齐度说明
§3.1 CNN-LSTM 架构src/talking_tennis/classifier.py 一字不差 EfficientNet-B0 (timm 1280-d) + 2-layer LSTM (hidden=512, dropout=0.4) + linear → 12 类
§3.1 训练超参configs/default.yaml 一字不差 AdamW 1e-4 / wd 0.01 / smooth 0.1 / bs 16 / ReduceLROnPlateau / AMP / ≤50 epoch
§3.1 79.17% accuracy 差 35 pts 我们 44.7% (subject-disjoint val) vs 论文 79.17% (split 未公开,见关键发现)
§3.2 biomech 8 大类特征src/talking_tennis/biomech.py 一字不差 3 点法关节角 / 中心差分 / arctan2 / KE=½v² / 三段相位 / kinetic chain
§3.2 输入 (frames, joints, 3) tensorsrc/talking_tennis/pose.py 偏离 THETIS 公开版的 VIDEO_Skelet3D 是渲染过的火柴人 .avi,不是数值坐标。论文未说明数据源。我们用 MediaPipe 0.10.14 在 RGB 上抽 33 关节 × (x, y, z_rel)
§3.3 REFERENCE_RANGES + 偏差公式src/talking_tennis/feedback.py 数值待校 公式 (v-hi)/(hi-lo+ε)×100 准确;具体区间值论文未公开,我们按文献常识手填 12 类 × 6 维,需用真实数据校准
§3.3 GPT-4o · temp 0.2 · max_tok 120 · system promptsrc/talking_tennis/feedback.py 一字不差 "You are a precise, evidence-based tennis coach." 系统提示,Score X/10 + 2-3 句诊断 + 3 条 actionable 格式约束

关键发现

1. THETIS Skelet3D 不是数值数据 ⚠️

公开版 VIDEO_Skelet3D/*.avi 是 mpeg4-XVID 编码的黑底火柴人 + XYZ 轴可视化视频,同目录无任何 .csv/.json/.npy 数值文件。论文 §3.2 输入是 (frames × joints × 3) tensor,但**未交代来源**。复现时必须自己用 pose estimator 在 RGB 上抽关节(我们用 MediaPipe 0.10.14)。

2. 79.17% vs 44.7% — split 是主因

论文 §3.1 未指明 train/val split。其引用的 SlowFast baseline (Hovad et al. 2024, 73.96%) 用 clip-level random split(同一 subject 不同 clip 散在 train/val),model 可借"识人"特征蒙对类别,acc 通常高 30 pts。我们用 subject-disjoint(10 subject hold-out),反映对**新球员**的真实泛化,达到 44.7%。换 stratified split 重训应能到 ~75-80%。

3. 混淆全在同 family

360 val clip 上 top-1 误判几乎都在 backhand 内、forehand 内、或 service+smash 内。这是 RGB-only 输入下 CNN-LSTM 架构对细粒度细分的固有瓶颈,非实现 bug。

4. LLM 端 0% 编造数字 ✓

GPT-4o 在 9 个 demo 上 100% 格式合规(Score X/10 + 诊断 + 3 corrections),且所有 mentioned 数值区间(2.50–5.0060.00–115.00)都直接引自 REFERENCE_RANGES,无任何幻觉数字。Score 与实测 biomech 偏差方向对齐。

复现命令

conda create -n talking-tennis python=3.11
conda activate talking-tennis
pip install torch==2.5.1 torchvision==0.20.1 --index-url https://download.pytorch.org/whl/cu124
pip install timm==1.0.11 opencv-python-headless numpy scipy pandas matplotlib einops tqdm pyyaml openai python-dotenv "mediapipe==0.10.14"

# THETIS 数据
cd tennis_analysis/data
GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 https://github.com/THETIS-dataset/dataset.git THETIS

# 训练(8× A100 ≈ 20 min)
cd tennis_analysis
python scripts/train_classifier.py --config configs/default.yaml --out results/cnnlstm

# 端到端 demo
echo 'OPENAI_API_KEY=sk-...' > .env
python scripts/e2e_demo.py data/THETIS/VIDEO_RGB/backhand/p10_backhand_s1.avi \
    --ckpt results/cnnlstm/best.pt

# 重建本 viewer
python scripts/build_viewer.py