본문으로 건너뛰기

RF-DETR로 농구 슛을 판정하는 법

RF-DETR과 물리 규칙으로 농구 슛의 궤적·자세·성공 여부를 노트북에서 판정하는 로컬 시스템입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

이 프로젝트는 RF-DETR 객체 탐지와 RF-DETR Keypoint 추정을 결합해 노트북에서 농구 슛의 성공·실패, 릴리스 속도, 궤적, 자세를 자동 기록하는 로컬 컴퓨터 비전 시스템입니다. 공과 림을 매 프레임 찾고 관절 좌표를 추적한 뒤, 상태 엔진이 위치·속도 이력을 유지하면서 손목 분리와 림 방향 궤적을 검사해 슛 이벤트를 판정합니다. 림과 네트에 공이 가려지는 상황은 재등장 후 낙하 속도를 자유낙하와 비교해 make, airball, 무관한 공을 구분하며, 불확실한 단일 카메라 판정은 별도 태그로 남깁니다. 탐지 모델은 mAP50 88.84와 비행 중 공 98.1% 탐지율을 기록했고, 시스템은 FastAPI 로컬 웹 앱과 JSON Lines, 주석 영상을 통해 결과를 제공하며 지속적인 클라우드 사용료 없이 실행됩니다.

섹션별 상세

01
농구 슛의 성공 여부와 자세를 감각에 의존하지 않고 영상에서 자동으로 기록하려면 공과 림의 위치, 손목과 주요 관절의 움직임, 릴리스 속도와 궤적을 한 흐름으로 연결해야 합니다. 이 프로젝트는 로컬 노트북에서 RF-DETR 객체 탐지 모델과 키포인트 추정 모델을 함께 실행해 makes, misses, release velocity, shot arc angles, body positioning을 수집합니다. 클라우드 API 호출 없이 촬영 영상이 기기 밖으로 나가지 않는 구조라 개인 훈련 기록을 반복적으로 처리하기에 적합합니다.
02
공과 림을 매 프레임 찾는 RF-DETR detector가 영상의 시각 입력을 맡고, RF-DETR Keypoint가 손목, 팔꿈치, 어깨, 엉덩이, 무릎의 좌표를 추적합니다. 상태 엔진은 연속 프레임의 위치, 속도, 키포인트 신뢰도를 저장한 뒤 규칙 기반 물리 모델로 릴리스 시점과 포물선 궤적을 계산하고 림을 향하는지 판정합니다. 결과는 구조화된 JSON Lines 이벤트와 관절 각도 및 실시간 속도가 표시된 주석 영상으로 저장됩니다.
농구 슛 영상 처리 과정을 The eyes, The memory, The judgment, The output 네 단계로 나눈 시스템 구조도입니다.
DiagramRF-DETR 탐지와 키포인트 추정이 공·림·관절 좌표를 만들고, 상태 엔진이 프레임 간 위치와 속도를 보존한 뒤 물리 규칙으로 성공 여부를 판정하는 흐름을 표현합니다. 마지막 단계에서 구조화된 JSON 이벤트와 관절 각도, 공의 속도를 포함한 주석 영상이 생성됩니다.
공과 림 탐지부터 상태 기억, 물리 판정, JSON 및 주석 영상 출력까지의 농구 슛 처리 파이프라인을 나타낸 구조도입니다.
DiagramThe eyes 단계는 RF-DETR detector와 keypoint model로 영상 정보를 추출하고, The memory 단계는 연속 프레임의 위치와 속도를 저장합니다. The judgment 단계에서 릴리스와 포물선, 림 통과 여부를 판정한 뒤 The output 단계에서 구조화된 JSON 이벤트와 주석 영상으로 결과를 내보냅니다.
03
공과 림 탐지에는 Roboflow Universe의 University of Arizona Basketball Shooting Robot 데이터셋 포크에서 약 9.8k 이미지를 사용해 학습한 RF-DETR-small 모델이 쓰였습니다. 모델은 mAP50 88.84, precision 75.7, recall 84.9를 기록했고 테스트 영상의 비행 중 공을 774프레임 중 759프레임에서 찾아 98.1% 탐지율을 냈습니다. 자세 추정에는 별도 학습이나 라벨링이 필요 없는 RF-DETR Keypoint의 COCO 17-keypoint 모델을 사용했으며, 키포인트는 프레임의 99%에서 감지되고 23번의 슛 시도 모두에서 팔꿈치와 무릎 지표가 기록됐습니다.
bash
git clone https://github.com/aarnavshah12/shot-tracker.git
cd shot-tracker
uv venv --python 3.12 .venv
uv pip install -p .venv -e ".[dev,video,models]"
echo 'ROBOFLOW_API_KEY=your_key_here' > .env
.venv/bin/python -m app.server

GitHub 저장소를 복제하고 Python 3.12 가상 환경과 의존성을 설치한 뒤 Roboflow API 키를 등록해 로컬 서버를 실행합니다.

04
단일 카메라에서 실제 거리를 계산하려면 픽셀 좌표를 미터 단위로 환산해야 하므로, 시스템은 규격 림의 안쪽 지름 18인치인 0.4572m를 기준으로 삼습니다. 여러 프레임에서 감지된 림 경계 상자 너비의 중앙값을 구해 pixels-per-meter 비율을 만들고, 이를 공의 이동 거리와 릴리스 높이에 적용합니다. 별도의 체커보드나 보정 격자를 설치하지 않아도 같은 촬영 세션 안에서 물리량을 일관되게 계산할 수 있다는 점이 핵심입니다.
05
초기 릴리스 판정은 공이 일정 속도 이상으로 세 프레임 연속 상승하면 이벤트를 기록했지만, 펌프 페이크와 준비 동작을 슛으로 잘못 분류했습니다. 수정된 규칙은 공이 상승하면서 손목 영역에서 물리적으로 0.35m 이상 분리되는지 확인하고, 상태 머신이 포물선의 진행 방향과 림 경계 상자의 방향까지 검사해 드리블을 제외합니다. 림을 향하지 않는 궤적은 슛 시도로 저장하지 않으므로 손에서 빠르게 튀어 오른 드리블이 릴리스로 기록되는 오류를 줄입니다.
드리블, 세트 포인트, 릴리스 단계에서 공과 손의 분리 상태를 세 장면으로 비교한 시각 자료입니다.
Diagram각 장면에는 공과 손의 위치를 표시하는 상자와 관절 기준점이 있으며, 하단에는 공이 손 아래에 있는 드리블과 손에 들어온 세트 포인트, 손 위로 분리된 릴리스가 구분되어 있습니다. 공의 상승 속도만 보지 않고 손목과의 물리적 분리를 함께 검사하는 릴리스 판정 규칙과 직접 연결됩니다.
06
림을 통과하는 순간 네트가 공을 가려 두 프레임 동안 탐지가 끊기면서 실제 성공 슛 두 개가 miss로 기록되는 문제가 발생했습니다. 시스템은 공이 다시 나타난 뒤의 낙하 속도를 정상 자유낙하와 비교해 네트를 통과한 공은 정상 속도의 10%에서 90% 사이로 느려지고, 림 뒤를 지난 airball은 100% 속도를 유지하며, 코트에 있던 다른 공은 0%에 가까운 속도를 보인다는 규칙을 적용합니다. 림 바운스가 두 이벤트로 쪼개지는 경우에는 림 주변 한 림 너비 안에서 상태를 잠시 유지해 rattled make 또는 rattled miss로 통합하고, 단일 시점으로 구분하기 어려운 판정은 shots.jsonl에 rattled 또는 occluded 태그로 남깁니다.
프레임 67, 69, 70, 72에서 공과 림의 탐지 상태를 추적하며 네트 가림과 재등장을 표시한 장면입니다.
Screenshot공이 림에 접근한 뒤 프레임 70과 71에서 네트에 가려져 탐지가 끊기고, 프레임 72에서 림 내부에 다시 나타나는 과정이 표시됩니다. 짧은 가림 구간을 단순 miss로 처리하지 않으려면 재등장 후 낙하 속도와 이전 궤적을 함께 사용해야 한다는 문제를 시각적으로 뒷받침합니다.
공의 낙하 궤적과 림 통과 지점에 자유낙하 대비 속도 변화를 표시한 물리 기반 성공 판정 화면입니다.
Diagram주황색 점선은 공의 이동 궤적을, 보라색 점과 청록색 상자는 림 주변의 공 위치와 탐지 영역을 나타냅니다. 화면에는 네트의 저항으로 자유낙하 대비 속도가 59%가 되고 수평 속도가 88% 줄어 성공으로 판정된다는 수치와, 접촉이 없으면 100% 자유낙하로 airball이 된다는 조건이 함께 표시됩니다.
07
저장소는 engine, models, sources, render, stats 패키지로 역할을 나눠 추적 상태, 모델 호출, 영상 입력, 렌더링, 이벤트 기록을 분리합니다. 사용자는 uv로 Python 3.12 환경을 만들고 모델 ID를 models/registry.py에 등록한 뒤 FastAPI 서버의 http://127.0.0.1:7878에서 영상을 업로드할 수 있습니다. 대시보드는 프레임 처리 진행률과 총 시도 횟수, 성공 횟수, 성공률, 연속 성공 기록을 표시하며 Roboflow 무료 계층과 로컬 가중치 캐시를 이용해 지속적인 사용료 없이 실행됩니다.
농구 코트 영상 위에 공과 림의 탐지 결과, 궤적, 관절 각도 정보가 겹쳐진 AI 슛 평가기 화면입니다.
Screenshot프로젝트의 최종 산출물이 단순 성공·실패 기록에 그치지 않고 영상 주석, 공의 궤적, 신체 관절 각도를 함께 제공하는 형태임을 나타냅니다. 화면 하단에는 shoulder-to-hip, hip-to-knee, knee-to-ankle 같은 관절 각도와 좌우 값이 표시되어 자세 피드백 구조를 확인할 수 있습니다.
농구 코트 영상과 공·림 탐지 결과, 신체 관절 각도 표를 결합한 AI Basketball Shot Evaluator 표지 화면입니다.
Screenshot표지 화면은 시스템이 농구 코트 영상을 입력으로 받아 공과 림을 추적하고 슈터의 관절 각도를 산출하는 프로젝트임을 나타냅니다. RF-DETR 기반 탐지 결과와 shoulder-to-hip, hip-to-knee, knee-to-ankle 각도 표가 하나의 출력 화면에 결합되어 있습니다.

용어 해설

객체 탐지(Object Detection)
영상 프레임에서 공과 림처럼 특정 객체의 위치를 찾아 경계 상자로 표시하는 기술입니다. 이 프로젝트에서는 RF-DETR 모델이 매 프레임의 공과 림을 탐지하고, 이후 속도와 궤적 계산에 필요한 좌표를 제공합니다. 탐지 누락과 가림 현상이 슛 성공 여부 판정에 직접 영향을 줍니다.
키포인트 추정(Keypoint Estimation)
사람의 관절이나 신체 기준점 위치를 영상에서 추정하는 컴퓨터 비전 기법입니다. RF-DETR Keypoint는 손목, 팔꿈치, 어깨, 엉덩이, 무릎의 좌표와 신뢰도를 연속 프레임에서 산출합니다. 이를 이용해 릴리스 순간과 관절 각도 같은 슈팅 자세 지표를 계산합니다.
상태 머신(State Machine)
시간에 따라 변하는 객체의 상태와 전이 조건을 관리하는 계산 구조입니다. 시스템은 공의 위치, 속도, 키포인트 신뢰도를 프레임별로 보존하면서 드리블, 세트 포인트, 릴리스, 림 주변 상황을 구분합니다. 단일 속도 조건만 사용할 때 생기는 펌프 페이크와 중복 이벤트를 줄이는 역할을 합니다.
픽셀-미터 변환(Pixels-per-meter Conversion)
영상 속 픽셀 거리를 실제 물리적 거리로 바꾸는 보정 방식입니다. 규격 농구 림의 안쪽 지름 0.4572m와 여러 프레임에서 측정한 림 경계 상자의 중앙값 너비를 비교해 영상 전체의 변환 비율을 산출합니다. 이 비율을 적용하면 공의 속도와 릴리스 높이를 물리 단위로 계산할 수 있습니다.
mAP50
객체 탐지 모델의 예측 상자 성능을 평가하는 지표로, IoU 기준 0.5에서 평균 정밀도를 집계합니다. 이 글의 RF-DETR-small 모델은 mAP50 88.84를 기록했고 precision은 75.7, recall은 84.9였습니다. 실제 테스트에서는 비행 중 공을 774프레임 중 759프레임에서 탐지했습니다.

기술

  • RF-DETR
  • RF-DETR-small
  • RF-DETR Keypoint
  • RFDETRKeypointPreview
  • Roboflow UI
  • Roboflow Universe
  • uv
  • Python 3.12
  • FastAPI
  • COCO 17-keypoint
  • JSON Lines

활용 사례

  • 농구 슛 성공률과 연속 성공 기록 측정
  • 릴리스 속도와 공의 궤적 판정
  • 손목·팔꿈치·어깨·엉덩이·무릎 기반 자세 추적
  • 로컬 영상 기반 스포츠 훈련 피드백

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 14.수집 2026. 08. 14.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.