| 论文章节 | 实现位置 | 对齐度 | 说明 |
|---|---|---|---|
| §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) tensor | src/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 prompt | src/talking_tennis/feedback.py | 一字不差 | "You are a precise, evidence-based tennis coach." 系统提示,Score X/10 + 2-3 句诊断 + 3 条 actionable 格式约束 |
公开版 VIDEO_Skelet3D/*.avi 是 mpeg4-XVID 编码的黑底火柴人 + XYZ 轴可视化视频,同目录无任何 .csv/.json/.npy 数值文件。论文 §3.2 输入是 (frames × joints × 3) tensor,但**未交代来源**。复现时必须自己用 pose estimator 在 RGB 上抽关节(我们用 MediaPipe 0.10.14)。
论文 §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%。
360 val clip 上 top-1 误判几乎都在 backhand 内、forehand 内、或 service+smash 内。这是 RGB-only 输入下 CNN-LSTM 架构对细粒度细分的固有瓶颈,非实现 bug。
GPT-4o 在 9 个 demo 上 100% 格式合规(Score X/10 + 诊断 + 3 corrections),且所有 mentioned 数值区间(2.50–5.00、60.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