Skip to content

mindongdong/cross

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

134 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Cross

Vue.js Node.js Python Socket.IO


ν”„λ‘œμ νŠΈ κ°œμš”

CrossλŠ” 객체 인식 기술과 μ‹€μ‹œκ°„ 데이터 μ‹œκ°ν™”λ₯Ό ν™œμš©ν•œ 슀트리밍 μ›Ή μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 기쑴의 일방적인 슀포츠 쀑계와 달리, μƒν˜Έμž‘μš© 기반의 μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜μ—¬ μ‹œμ²­μžλ“€μ΄ 좕ꡬλ₯Ό 보닀 뢄석적이고 μ§κ΄€μ μœΌλ‘œ 즐길 수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.

핡심 κ°€μΉ˜

  • Enhanced Viewing: μ˜μƒ μœ„μ— μ¦κ°•λœ 데이터λ₯Ό ν†΅ν•œ 직관적 κ²½κΈ° μ‹œμ²­
  • Player Recognition: 객체 인식 기술 기반 μ‹€μ‹œκ°„ μ„ μˆ˜ 좔적 μ‹œμŠ€ν…œ
  • Interactive Dashboard: μ‚¬μš©μž λ§žμΆ€ν˜• λ“œλž˜κ·Έμ•€λ“œλ‘­ 톡계 λŒ€μ‹œλ³΄λ“œ
  • Real-time Analytics: μ‹€μ‹œκ°„ κ²½κΈ° 데이터 뢄석 및 μ‹œκ°ν™”

μ£Όμš” κΈ°λŠ₯

μ„ μˆ˜ 좔적 및 인식 μ‹œμŠ€ν…œ

  • 객체 좔적 ν”„λ‘œκ·Έλž¨ 기반 μ„ μˆ˜ 라벨링 데이터 ν™œμš©
  • μ‹€μ‹œκ°„ μ„ μˆ˜ λ§ˆν‚Ή 및 μœ„μΉ˜ 좔적
  • νŒ€ 정보 νŒ¨λ„κ³Ό μ—°λ™λœ μ„ μˆ˜ 정보 쑰회

데이터 μ‹œκ°ν™” λŒ€μ‹œλ³΄λ“œ (4개 νŒ¨λ„)

  1. λŠ₯λ ₯치 비ꡐ νŒ¨λ„: λ ˆμ΄λ” 차트 기반 μ„ μˆ˜ λŠ₯λ ₯치 뢄석 및 비ꡐ
  2. μ‹€μ‹œκ°„ 기둝 νŒ¨λ„: λ§‰λŒ€ κ·Έλž˜ν”„λ‘œ μ‹€μ‹œκ°„ κ²½κΈ° 데이터 μ‹œκ°ν™”
  3. 곡격 μ‹œν€€μŠ€ νŒ¨λ„: μ‹€μ‹œκ°„ 곡격 κ³Όμ • 및 λ³Ό μ†Œμœ κΆŒ μ‹œκ°ν™”
  4. μŠˆνŒ… 데이터 νŒ¨λ„: μŠˆνŒ… 뢄포도 및 골 근접도 λˆ„μ  데이터 뢄석

νŒ€ 정보 μ‹œμŠ€ν…œ

  • 각 νŒ€ μ„ μˆ˜ 정보 상세 쑰회
  • μ„ μˆ˜ 좔적 λ²„νŠΌκ³Ό μ—°κ³„ν•œ λ§ˆν‚Ή κΈ°λŠ₯
  • μ‹€μ‹œκ°„ μ„ μˆ˜ μƒνƒœ 정보 μ—…λ°μ΄νŠΈ

μ˜μƒ 데이터 μ‹œκ°ν™”

  • λ³΄λ‘œλ…Έμ΄ λ‹€μ΄μ–΄κ·Έλž¨: μ„ μˆ˜λ³„ 영ν–₯λ ₯ 곡간 μ‹œκ°ν™”
  • 패슀 데이터 μ‹œκ°ν™”: μ’Œν‘œ 데이터와 이벀트 데이터 κ²°ν•© 뢄석

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

이 ν”„λ‘œμ νŠΈλŠ” λ“€μ–Ό λ°±μ—”λ“œ(Dual Backend) ꡬ쑰둜 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • Node.js 슀트리밍 λ°±μ—”λ“œ: HLS λΉ„λ””μ˜€ 슀트리밍과 WebSocket을 μ΄μš©ν•œ μ‹€μ‹œκ°„ 톡신을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
  • Python 뢄석 λ°±μ—”λ“œ: FastAPIλ₯Ό 기반으둜, κ²½κΈ° 뢄석 데이터 μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  톡계 정보λ₯Ό κ°€κ³΅ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     HTTP/API      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Vue.js Frontend   β”‚ ◄────────────────► β”‚  Python/FastAPI Backend  β”‚
β”‚ (UI & Interactions) β”‚                   β”‚   (Data Analytics API)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β–²                                           β”‚
          β”‚ WebSocket/HTTP                            β–Ό
          β”‚ (Video Stream)                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚                                 β”‚   File System    β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚ (CSV, JSON Data) β”‚
β”‚   Node.js Backend    β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ (Streaming & Sockets)β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Alternative Architecture (exhibition-ver branch):

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     HTTP/API      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Vue.js Frontend   β”‚ ◄────────────────► β”‚  Python/FastAPI Backend  β”‚
β”‚ (UI & Interactions) β”‚                   β”‚   (Data Analytics API)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β–²                                           β”‚
          β”‚ HTTPS/HLS                                 β–Ό
          β”‚ (Video Stream)                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚                                 β”‚   File System    β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚ (CSV, JSON Data) β”‚
β”‚  AWS CloudFront CDN  β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚  (Global Delivery)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚
          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      AWS S3          β”‚
β”‚ (Video Storage)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

개발 ν™˜κ²½ μ„€μ •

1. μ˜μ‘΄μ„± μ„€μΉ˜

# Frontend (Vue.js)
cd frontend
npm install

# Streaming Backend (Node.js)
cd ../socket-backend
npm install

# Analytics Backend (Python)
cd ../backend
# Conda ν™˜κ²½ 생성 (졜초 1회)
conda env create -f environment.yml

2. 개발 μ„œλ²„ μ‹€ν–‰

Frontend (Port: 8080)

cd frontend
npm run serve

Streaming Backend (Port: 3000)

cd socket-backend
node server.js

Analytics Backend (Port: 8000)

cd backend
conda activate snakemake
uvicorn app.main:app --reload

ν”„λ‘œμ νŠΈ ꡬ쑰

startup/
β”œβ”€β”€ πŸ“ frontend/                    # Vue.js ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”œβ”€β”€ πŸ“ socket-backend/              # Node.js 슀트리밍 λ°±μ—”λ“œ
β”‚   β”œβ”€β”€ πŸ“ router/
β”‚   β”œβ”€β”€ πŸ“ video/
β”‚   └── πŸ“„ server.js
β”œβ”€β”€ πŸ“ backend/                      # Python 데이터 뢄석 λ°±μ—”λ“œ
β”‚   β”œβ”€β”€ πŸ“ app/
β”‚   β”‚   β”œβ”€β”€ πŸ“ common/             # 곡톡 μ„€μ • (Config)
β”‚   β”‚   β”œβ”€β”€ πŸ“ routes/             # API 라우트
β”‚   β”‚   β”‚   └── πŸ“ endpoints/      # μ—”λ“œν¬μΈνŠΈ 둜직 (matches, tracking)
β”‚   β”‚   β”œβ”€β”€ πŸ“ schemas/            # 데이터 μœ νš¨μ„± 검증 μŠ€ν‚€λ§ˆ
β”‚   β”‚   └── πŸ“„ main.py              # FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ§„μž…μ 
β”‚   β”œβ”€β”€ πŸ“ matches/                  # κ²½κΈ° 데이터 (CSV, JSON)
β”‚   └── πŸ“„ Dockerfile
β”œβ”€β”€ πŸ“„ TECHNICAL_DOCUMENTATION.md
└── πŸ“„ README.md

API μ—”λ“œν¬μΈνŠΈ

슀트리밍 및 μ†ŒμΌ“ API (Node.js)

  • GET /video/:videoName: HTTP Range Requestλ₯Ό μ§€μ›ν•˜λŠ” λΉ„λ””μ˜€ 슀트리밍
  • GET /audio/:audioName: μ˜€λ””μ˜€ 슀트리밍
  • WebSocket: μ‹€μ‹œκ°„ 톡신을 μœ„ν•œ μ†ŒμΌ“ μ—°κ²°

뢄석 데이터 API (Python/FastAPI)

  • GET /routes/matches/lineup/{time}: νŠΉμ • μ‹œκ°„μ— μΆœμ „ 쀑인 μ„ μˆ˜ λͺ©λ‘ 쑰회
  • GET /routes/matches/stats/{time}: νŠΉμ • μ‹œκ°„κΉŒμ§€μ˜ κ²½κΈ° 및 μ„ μˆ˜λ³„ 상세 톡계 데이터 집계
  • GET /routes/matches/sequence/{time}: ν˜„μž¬ μ‹œκ°„ κΈ°μ€€ 곡격 μ‹œν€€μŠ€ 데이터 쑰회
  • GET /routes/matches/shots/{time}: μŠˆνŒ… 및 κΈ°λŒ€ 득점(xG) 데이터 쑰회
  • GET /routes/tracking/info/{frame}: νŠΉμ • ν”„λ ˆμž„μ˜ μ„ μˆ˜ 및 곡 νŠΈλž˜ν‚Ή μ’Œν‘œ 데이터 쑰회

개발 및 ν…ŒμŠ€νŒ…

μ‚¬μš© κ°€λŠ₯ν•œ 슀크립트 (Frontend)

npm run serve      # 개발 μ„œλ²„ μ‹€ν–‰
npm run build      # ν”„λ‘œλ•μ…˜ λΉŒλ“œ

ν”„λ‘œμ νŠΈ μ„±κ³Ό 및 νŠΉμ§•

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 섀계

전체 μ‹œμŠ€ν…œ ꡬ쑰

Cross μ•„ν‚€ν…μ²˜

CrossλŠ” 3-tier μ•„ν‚€ν…μ²˜λ‘œ μ„€κ³„λ˜μ–΄ Frontend, Streaming Backend, Analytics Backendκ°€ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜λ©° 효율적으둜 ν†΅μ‹ ν•©λ‹ˆλ‹€.

데이터 처리 νŒŒμ΄ν”„λΌμΈ

데이터 처리 ꡬ쑰

좕ꡬ 경기의 νŠΈλž˜ν‚Ή 데이터λ₯Ό μˆ˜μ§‘ν•˜κ³  μ „μ²˜λ¦¬ν•˜λŠ” νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.

μ‹œκ°ν™” μ‹œμŠ€ν…œ

μ‹œκ°ν™” ꡬ쑰

Player Tracking Data와 Voronoi Diagram을 κ²°ν•©ν•˜μ—¬ μ˜μƒ μœ„μ— μ¦κ°•λœ 데이터 μ‹œκ°ν™”λ₯Ό μ œκ³΅ν•˜λŠ” λ Œλ”λ§ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.


슀트리밍 및 μ„±λŠ₯

  • HLS μ μ‘ν˜• 슀트리밍: HLS.jsλ₯Ό ν™œμš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ μƒνƒœμ— 따라 λΉ„λ””μ˜€ ν’ˆμ§ˆμ„ μžλ™ μ‘°μ ˆν•˜λŠ” μ μ‘ν˜• μŠ€νŠΈλ¦¬λ°μ„ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
  • 효율적인 λΉ„λ””μ˜€ μ‹œν‚Ή: HTTP 206 Partial Content 응닡을 μ²˜λ¦¬ν•˜μ—¬, λŒ€μš©λŸ‰ λΉ„λ””μ˜€ νŒŒμΌμ—μ„œλ„ λΉ λ₯΄κ³  효율적인 탐색(seeking)이 κ°€λŠ₯ν•˜λ„λ‘ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€.
  • λŒ€κ·œλͺ¨ 슀트리밍 데이터 관리: 6,000개 μ΄μƒμ˜ HLS μ„Έκ·Έλ¨ΌνŠΈ(.ts) 파일과 닀쀑 λΉ„λ””μ˜€ 슀트림(video.m3u8, video_passroot.m3u8 λ“±)을 μ•ˆμ •μ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.

μΈν„°λž™ν‹°λΈŒ UI 및 데이터 μ‹œκ°ν™”

  • μ‚¬μš©μž λ§žμΆ€ν˜• λŒ€μ‹œλ³΄λ“œ: vuedraggable 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ 직접 PlayerStats, MatchStats λ“±μ˜ 톡계 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ“œλž˜κ·Έμ•€λ“œλ‘­μœΌλ‘œ λ°°μΉ˜ν•  수 μžˆλŠ” 동적 λŒ€μ‹œλ³΄λ“œλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ 데이터 μ‹œκ°ν™”: Chart.js 기반의 λ§‰λŒ€(Bar) 및 λ ˆμ΄λ”(Radar) 차트λ₯Ό 톡해 슀포츠 톡계 데이터λ₯Ό 효과적으둜 μ‹œκ°ν™”ν–ˆμŠ΅λ‹ˆλ‹€.
  • 체계적인 μƒνƒœ 관리: Vuexλ₯Ό λ„μž…ν•˜μ—¬ λΉ„λ””μ˜€ μž¬μƒ μƒνƒœ, UI μ»΄ν¬λ„ŒνŠΈμ˜ ν‘œμ‹œ μ—¬λΆ€, λŒ€μ‹œλ³΄λ“œ λ ˆμ΄μ•„μ›ƒ λ“± λ³΅μž‘ν•œ μƒνƒœλ₯Ό μ€‘μ•™μ—μ„œ μ²΄κ³„μ μœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

μ£Όμš” μ‹œκ°ν™” κΈ°λŠ₯ μ‹œμ—°

λ³΄λ‘œλ…Έμ΄ λ‹€μ΄μ–΄κ·Έλž¨ 기반 μ„ μˆ˜ 영ν–₯λ ₯ μ‹œκ°ν™”

λ³΄λ‘œλ…Έμ΄ λ‹€μ΄μ–΄κ·Έλž¨

μ„ μˆ˜λ“€μ˜ μœ„μΉ˜ 데이터λ₯Ό 기반으둜 λ³΄λ‘œλ…Έμ΄ λ‹€μ΄μ–΄κ·Έλž¨μ„ μƒμ„±ν•˜μ—¬, κ²½κΈ°μž₯ λ‚΄ 각 μ„ μˆ˜μ˜ μ§€λ°° μ˜μ—­κ³Ό 영ν–₯λ ₯을 μ§κ΄€μ μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.

패슀 λ„€νŠΈμ›Œν¬ 및 루트 μ‹œκ°ν™”

패슀 루트 μ‹œκ°ν™”

κ²½κΈ° 이벀트 데이터와 μ’Œν‘œ 데이터λ₯Ό κ²°ν•©ν•˜μ—¬ νŒ€μ˜ 패슀 λ„€νŠΈμ›Œν¬μ™€ 곡격 루트λ₯Ό μ˜μƒ μœ„μ— μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

데이터 뢄석 및 API μ„œλ²„

  • FastAPI 기반 뢄석 μ„œλ²„: Python의 FastAPI와 Pandasλ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€μš©λŸ‰ κ²½κΈ° 데이터(CSV)λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ κ°€κ³΅ν•˜λŠ” 뢄석 API μ„œλ²„λ₯Ό κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.
  • 동적 데이터 집계: μ˜μƒ μž¬μƒ μ‹œκ°„μ— 맞좰 κ΄€λ ¨ κ²½κΈ° μ΄λ²€νŠΈλ“€μ„ λ™μ μœΌλ‘œ ν•„ν„°λ§ν•˜κ³ , μ„ μˆ˜λ³„ μŠ€νƒ―, 곡격 μ‹œν€€μŠ€, κΈ°λŒ€ 득점(xG)κ³Ό 같은 μ •μ œλœ 데이터λ₯Ό κ³„μ‚°ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ»¨ν…Œμ΄λ„ˆν™”λœ λ°±μ—”λ“œ: Dockerλ₯Ό 톡해 Python μ‹€ν–‰ ν™˜κ²½μ„ μ»¨ν…Œμ΄λ„ˆν™”ν•˜μ—¬, 개발 및 배포 ν™˜κ²½μ˜ 일관성과 ν™•μž₯성을 ν™•λ³΄ν–ˆμŠ΅λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors