[NBA Vision] 00. Project Overview
Published:
In this post, a brief overview of NBA Vision Project is shown.
Project Overview
❓선행연구?
1. Data Pipeline
- Data Collection : nba_api 이용하여 Stephen Curry 24/25 시즌 모든 슛 시도 PBP 영상 확보
- 1K, 10GB (10MB per video)
- ❓로컬에서 수집?
- ❓1K 이면 충분?
- 1K, 10GB (10MB per video)
- Data Labeling
game_id, event_id, shot_result 등 저장
- ❓dataframe 저장, csv 저장, SQL 저장 성능 차이
- ❓메타데이터를 얼마나 labeling 할 것인지
- Event-based temporal alignment
- cv2 (이미지와 영상을 처리하는 라이브러리), pytesseract (이미지에서 문자를 인식(OCR) 하는 라이브러리) 이용
- Data Collection 단계에서
extract_player_shots_all_games함수가 반환한 특정 선수의 모든 슛 시도 기록 dataframe에 저장된 슛 시도 시각과 event_id를 이용하여 해당 event_id 이름의 PBP 영상에서 스코어보드의 시간대가 슛 시도 시각과 일치하는 부분 영상 crop- ❓frame 기준 정해야 함. (PBP 영상은 60fps, 앞 뒤 60fps 총 2초)
- ❓정확히 슛 모션 지점 포착이 어려운데 해결법. 이를 위한 또 다른 model 학습?
- ❓7.8MB 영상 기준 로컬에서 2분 40초 소요. 시간 단축법.
- Pose Estimation
- 각 video마다,
pose_seq$\in \mathbb R^{T \times J \times D}$ 정보 저장.- $T$ : frame 수, $J$ : 추적하는 관절 개수, $D$ : 각 관절마다 D차원 벡터로 표현 ($D=3$ 인 경우, ($x, y, conf$) 로 구성. $conf$는 모델이 keypoint를 얼마나 확신하는 정도)
pose_seq[t, j] = [x, y, conf]- ❓특정 슈터만 추적 방법, 영상에서 가려진 관절 결측치 처리, 정규화
- 구체적 방법 To Do
- 각 video마다,
2. Visual Appearance-Based Shot Success Prediction
pose 없이 순수 영상 정보로 성공 확률 예측 : $P(make video)$ model 학습 Model : CNN(ResNet), ViT, video encoder model → temporal pooling → MLP
video clip ↓ frame encoder (ResNet) ↓ frame features (T x D) ↓ temporal pooling ↓ video feature (D) ↓ MLP ↓ sigmoid ↓ P(make)fame encoder : 각 프레임 이미지를 feature vector로 바꾸는 모델. 각 이미지 프레임에 대해 $feature_t \in R^D$ ($D=$ 512 또는 768). 모든 프레임을 encoder에 넣으면 $T \times D$ matrix가 나옴.
temporal pooling : MLP는 하나의 벡터만 입력받으므로, 위에서 얻은 matrix의 시간축을 하나로 압축하여 벡터화함. 가장 단순한 방법은 mean pooing. 그 결과 $video_feature \in R^D$ 가 됨.
- MLP와, sigmoid를 거쳐 최종 확률 계산.
Loss : Binary Cross Entropy, $L=−ylogp−(1−y)log(1−p)$
- BCE가 이론적으로 타당한 이유 아래 정리.
Evaluation : accuracy, AUC, calibration
3. Pose Dynamics-Based Shot Success Prediction
pose 데이터를 기반으로 슛폼 자체의 영향만 측정. $P(make∣pose_sequence)$ model 학습
Model : Temporal Transformer, LSTM, ST-GCN
pose sequence ↓ embedding ↓ temporal transformer ↓ CLS token ↓ MLP ↓ P(make)Pose Estimation 에서 $T=30, J=17$ 이라 하면 데이터는 다음과 같다.
pose_1 = 51차원 pose_2 = 51차원 ... pose_30 = 51차원Temporal Transformer : Transformer를 시간 sequence에 적용한 것이다. 즉,
[pose_1, pose_2, ..., pose_T]을 transformer 입력으로 넣는다. 그러면 self-attention에 의해 각 프레임이 다른 프레임을 참고하게 된다. 앞에 CLS 토큰을 붙여 output CLS 토큰이 전체 sequence를 요약하게 하고, 여기에 MLP → sigmoid를 적용하여 확률을 예측한다. 때문에 transformer에는 decoder part없이 encoder만 존재한다.- 51차원의 pose sequence vector를 transformer가 선호하는 128차원의 벡터로 변환하는 embedding layer가 중간에 존재한다. (학습중에 임베딩 벡터도 변한다.)
Loss, Evaluation 동일
4. Multimodal Fusion of Visual and Pose Representations
- $P(make∣video,pose)$
- Model : Late-Fushion(Multimodal Fusion), Cross-Attention Fusion
- …
- Loss, Evaluation 동일
- Model : Late-Fushion(Multimodal Fusion), Cross-Attention Fusion
5. Cross-Player Generalization of Shot Form Models
Vast.ai
miss 성공 비율
video clip
feed back
- pose estimation하여 관절 정보를 이용하는 것 불필요할 것 같다. 그런 정보가 필요하다면 vision model에서 이며 학습될 것이다. 그리고, 관절 정보를 transformer에 이용하기 위해 벡터 차원 늘리는 과정에서 오히려 부정확해질 것이다.
- (정확히 슈팅 직전까지만 crop 되지 않거나, crop 구간이 부정확할 수 있는 문제에 대해) 데이터 수를 늘리면 그 중에 슈팅 직전에 정확히 끊기는 영상도 많아질 것이므로 모델이 잘 학습할 것이므로 괜찮을 것이다.
- (한 선수 데이터만으로 테스트하고 여러 선수로 일반화하려는 전략에 대해) 그것보다 차라리 애초에 많은 선수들의 데이터로 학습하는 게 좋을 것 같다. (그렇게 하게 되면 같은 자세라도 어떤 선수들에게는 좋은 자세이고 어떤 선수들에게는 나쁜 자세일텐데 문제가 되지 않냐는 질문에 대해) 모델이 선수들의 신장, 윙스팬 등의 정보를 알아서 학습할 것이므로, 괜찮다.
- 앞쪽을 tight하게 (슛 직전 다른 선수들 패스 등) 자르는 걸 추천한다. (가능하다면) 다른 선수들이 고려되지 않도록 슈터만 확대하여 crop하는 걸 추천한다. 이를 위해서 또 다른 딥러닝 모델을 사용하거나 잘 안된다면 학습할 필요성이 있는데 작업이 너무 복잡해질 수 있다.
- google colab은 추천하지 않고, vast.ai를 추천한다.
어떤 모델(이미 학습된거, supervised 등등), GPU 학습, 연구비용,
선행연구, SQL 사용여부.
❗️BCE의 타당성







Leave a Comment