Skip to content

ZSHYC/TrackNet-V3-based-Badminton

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

73 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TrackNetV3: Enhancing ShuttleCock Tracking with Augmentations and Trajectory Rectification

We present TrackNetV3, a model composed of two core modules: trajectory prediction and rectification. The trajectory prediction module leverages an estimated background as auxiliary data to locate the shuttlecock in spite of the fluctuating visual interferences. This module also incorporates mixup data augmentation to formulate complex scenarios to strengthen the network’s robustness. Given that a shuttlecock can occasionally be obstructed, we create repair masks by analyzing the predicted trajectory, subsequently rectifying the path via inpainting. [paper]

Performance

Model Accuracy Precision Recall F1 FPS
YOLOv7 57.82% 78.53% 59.96% 68.00% 34.77
TrackNetV2 94.98% 99.64% 94.56% 97.03% 27.70
TrackNetV3 97.51% 97.79% 99.33% 98.56% 25.11

Installation

  • Develop Environment

    Ubuntu 16.04.7 LTS
    Python 3.8.7
    torch 1.10.0
    
  • Clone this reposity.

    git clone https://github.com/qaz812345/TrackNetV3.git
    
  • Install the requirements.

    pip install -r requirements.txt
    

Inference

  • Download the checkpoints
  • Unzip the file and place the parameter files to ckpts
    unzip TrackNetV3_ckpts.zip
    
  • Predict the label csv from the video
    python predict.py --video_file test.mp4 --tracknet_file ckpts/TrackNet_best.pt --inpaintnet_file ckpts/InpaintNet_best.pt --save_dir prediction
    
  • Predict the label csv from the video, and output a video with predicted trajectory
    python predict.py --video_file test.mp4 --tracknet_file ckpts/TrackNet_best.pt --inpaintnet_file ckpts/InpaintNet_best.pt --save_dir prediction --output_video
    
  • For large video
    • Enable the --large_video flag to use an IterableDataset instead of the normal Dataset, which prevents memory errors. Note that this will decrease the inference speed.
    • Use --max_sample_num to set the number of samples for background estimation.
    • Use --video_range to specify the start and end seconds of the video for background estimation.
    python predict.py --video_file test.mp4 --tracknet_file ckpts/TrackNet_best.pt --inpaintnet_file ckpts/InpaintNet_best.pt --save_dir prediction --large_video --video_range 324,330
    

Training

1. Prepare Dataset

  • Download Shuttlecock Trajectory Dataset
  • Adjust file structure:
    1. Merge the Professional and Amateur match directories into a single train directory.
    2. Rename the Amateur match directories to start from match24 through match26.
    3. Rename the Test directory to test.
  • Dataset file structure:
  data
    ├─ train
    |   ├── match1/
    |   │   ├── csv/
    |   │   │   ├── 1_01_00_ball.csv
    |   │   │   ├── 1_02_00_ball.csv
    |   │   │   ├── …
    |   │   │   └── *_**_**_ball.csv
    |   │   ├── frame/
    |   │   │   ├── 1_01_00/
    |   │   │   │   ├── 0.png
    |   │   │   │   ├── 1.png
    |   │   │   │   ├── …
    |   │   │   │   └── *.png
    |   │   │   ├── 1_02_00/
    |   │   │   │   ├── 0.png
    |   │   │   │   ├── 1.png
    |   │   │   │   ├── …
    |   │   │   │   └── *.png
    |   │   │   ├── …
    |   │   │   └── *_**_**/
    |   │   │
    |   │   └── video/
    |   │       ├── 1_01_00.mp4
    |   │       ├── 1_02_00.mp4
    |   │       ├── …
    |   │       └── *_**_**.mp4
    |   ├── match2/
    |   │ ⋮
    |   └── match26/
    ├─ val
    |   ├── match1/
    |   ├── match2/
    |   │ ⋮
    |   └── match26/
    └─ test
        ├── match1/
        ├── match2/
        └── match3/
  • Attributes in each csv files: Frame, Visibility, X, Y
  • Data preprocessing
    python preprocess.py
    
  • The frame directories and the val directory will be generated after preprocessing.
  • Check the estimated background images in <data_dir>/median
    • If available, the dataset will use the median image of the match; otherwise, it will use the median image of the rally.
    • For example, you can exclude train/match16/median.npz due to camera angle discrepancies; therefore, the dataset will resort to the median image of the rally within match 16.
  • Set the data root directory to data_dir in dataset.py.
    • dataset.py will generate the image mapping for each sample and cache the result in .npy files.
    • If you modify any related functions in dataset.py, please ensure you delete these cached files.

2. Train Tracking Module

  • Train the tracking module from scratch

    python train.py --model_name TrackNet --seq_len 8 --epochs 30 --batch_size 10 --bg_mode concat --alpha 0.5 --save_dir exp --verbose
    
  • Resume training (start from the last epoch to the specified epoch)

    python train.py --model_name TrackNet --epochs 30 --save_dir exp --resume_training --verbose
    

3. Generate Predicted Trajectories and Inpainting Masks

  • Generate predicted trajectories and inpainting masks for training rectification module
    • Noted that the coordinate range corresponds to the input spatial dimensions, not the size of the original image.
    python generate_mask_data.py --tracknet_file ckpts/TrackNet_best.pt --batch_size 16
    

4. Train Rectification Module

  • Train the rectification module from scratch.

    python train.py --model_name InpaintNet --seq_len 16 --epoch 300 --batch_size 32 --lr_scheduler StepLR --mask_ratio 0.3 --save_dir exp --verbose
    
  • Resume training (start from the last epoch to the specified epoch)

    python train.py --model_name InpaintNet --epochs 30 --save_dir exp --resume_training
    

Evaluation

  • Evaluate TrackNetV3 on test set

    python generate_mask_data.py --tracknet_file ckpts/TrackNet_best.pt --split_list test
    python test.py --inpaintnet_file ckpts/InpaintNet_best.pt --save_dir eval
    
  • Evaluate the tracking module on test set

    python test.py --tracknet_file ckpts/TrackNet_best.pt --save_dir eval
    
  • Generate video with ground truth label and predicted result

    python test.py --tracknet_file ckpts/TrackNet_best.pt --video_file data/test/match1/video/1_05_02.mp4 
    

Error Analysis Interface

  • Evaluate TrackNetV3 on test set and save the detail results for error analysis

    python test.py --tracknet_file ckpts/TrackNet_best.pt --inpaintnet_file ckpts/InpaintNet_best.pt --save_dir eval --output_pred
    
  • Add json path of evaluation results to the file list in error_analysis.py

    30  # Evaluation result file list
    31  if split == 'train':
    32      eval_file_list = [
    33          {'label': label_name, 'value': json_path},
     ⋮                              ⋮
            ]
    
    

Landing Prediction (Coordinate-Only)

This repo includes a lightweight landing predictor that uses only trajectory coordinates (x, y) and does not depend on visibility for detection. It outputs Top-K landing candidates per rally.

Scripts:

1) Training split evaluation

Evaluate Top-1 vs. ground-truth labels and write metrics per match:

python batch_predict_landings.py --split train --evaluate --save_preds

Outputs per match:

  • data/train/<match>/pred_landing/metrics.json
  • data/train/<match>/pred_landing/detail.json

2) Predict on test (or other) splits

Write per-CSV prediction files with Top-K candidates:

python batch_predict_landings.py --split test --save_preds

Outputs per match:

  • data/test/<match>/pred_landing/*_pred.json

3) Parameters (defaults already match the finalized plan)

  • --window (W): stability window size, default 5
  • --dy (Δy): y stability threshold, default 10
  • --v_th: speed threshold, default 5
  • --top_k: Top-K candidates, default 5

Output format

Each prediction file contains:

  • frame_pred, x_pred, y_pred

  • frame_visible, x_visible, y_visible (nearest visible frame if needed)

  • avg_speed, y_range, has_turn

      elif split == 'val':
          eval_file_list = [
              {'label': label_name, 'value': json_path},
                                  ⋮
          ]
      elif split == 'test':
          eval_file_list = [
              {'label': label_name, 'value': json_path},
                                  ⋮
          ]
      else:
          raise ValueError(f'Invalid split: {split}')                                  
    
    
    
  • Run Dash application
    python error_analysis.py --split test --host 127.0.0.1
    

Reference

About

TrackNet-V3-based-Badminton是一个基于深度学习的羽毛球轨迹检测与事件分析系统,旨在通过增强的轨迹预测和后处理模块,实现对羽毛球比赛中关键事件(如落地点和击球点)的精准检测。该项目在原始 TrackNetV3 的基础上,新增了多个功能模块,包括 BounceNet 事件分类器和半自动标注工具,进一步提升了系统的实用性和智能化水平。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages