athulnambiar commited on
Commit
703780e
·
verified ·
1 Parent(s): 4ca60ad

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +96 -0
  2. yolov8s.pt +3 -0
app.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+ import streamlit as st
3
+ import cv2
4
+ import numpy as np
5
+ from ultralytics import YOLO
6
+ import supervision as sv
7
+ from scipy.spatial import distance as dist
8
+ import tempfile
9
+
10
+ # Initialize components
11
+ model = YOLO('yolov8s.pt')
12
+ tracker = sv.ByteTrack()
13
+
14
+ # Streamlit UI
15
+ st.title("⚽️ Player Tracking System")
16
+ uploaded_video = st.file_uploader("Upload match video", type=["mp4", "mov"])
17
+ calibration_dist = st.number_input("Field width in meters (for speed calibration):", value=68.0)
18
+
19
+ # Initialize session state
20
+ if 'player_data' not in st.session_state:
21
+ st.session_state.player_data = {}
22
+
23
+ if uploaded_video:
24
+ tfile = tempfile.NamedTemporaryFile(delete=False)
25
+ tfile.write(uploaded_video.read())
26
+
27
+ cap = cv2.VideoCapture(tfile.name)
28
+ fps = cap.get(cv2.CAP_PROP_FPS)
29
+ frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
30
+ pixels_per_meter = frame_width / calibration_dist if calibration_dist > 0 else 1.0
31
+
32
+ st_frame = st.empty()
33
+ frame_count = 0
34
+
35
+ while cap.isOpened():
36
+ ret, frame = cap.read()
37
+ if not ret:
38
+ break
39
+
40
+ # Detection + tracking
41
+ results = model(frame)[0]
42
+ detections = sv.Detections.from_ultralytics(results)
43
+ detections = tracker.update_with_detections(detections)
44
+
45
+ for detection in detections:
46
+ track_id = int(detection[4])
47
+ bbox = detection[0]
48
+ centroid = (int((bbox[0]+bbox[2])/2), int((bbox[1]+bbox[3])/2))
49
+ speed = 0.0 # Initialize speed for all cases
50
+
51
+ # Initialize new player
52
+ if track_id not in st.session_state.player_data:
53
+ st.session_state.player_data[track_id] = {
54
+ 'positions': [centroid],
55
+ 'timestamps': [frame_count/fps],
56
+ 'distance': 0.0,
57
+ 'speeds': []
58
+ }
59
+ else:
60
+ # Calculate movement metrics
61
+ prev_pos = st.session_state.player_data[track_id]['positions'][-1]
62
+ time_diff = (frame_count/fps) - st.session_state.player_data[track_id]['timestamps'][-1]
63
+
64
+ pixel_dist = dist.euclidean(prev_pos, centroid)
65
+ speed_px = pixel_dist / time_diff if time_diff > 0 else 0.0
66
+ speed = speed_px * pixels_per_meter # Convert to m/s
67
+
68
+ # Update player record
69
+ st.session_state.player_data[track_id]['positions'].append(centroid)
70
+ st.session_state.player_data[track_id]['timestamps'].append(frame_count/fps)
71
+ st.session_state.player_data[track_id]['distance'] += pixel_dist
72
+ st.session_state.player_data[track_id]['speeds'].append(speed)
73
+
74
+ # Annotation with failsafe
75
+ label = f"ID:{track_id} Speed:{speed:.1f}m/s"
76
+ cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])),
77
+ (int(bbox[2]), int(bbox[3])), (0,255,0), 2)
78
+ cv2.putText(frame, label, (int(bbox[0]), int(bbox[1]-10)),
79
+ cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)
80
+
81
+ st_frame.image(frame, channels="BGR")
82
+ frame_count += 1
83
+
84
+ cap.release()
85
+
86
+ # Display final analytics
87
+ st.subheader("Player Statistics")
88
+ for player_id, data in st.session_state.player_data.items():
89
+ avg_speed = np.mean(data['speeds']) if data['speeds'] else 0
90
+ st.write(f"""
91
+ **Player {player_id}**
92
+ - Total distance: {data['distance'] * pixels_per_meter:.2f}m
93
+ - Avg speed: {avg_speed:.1f}m/s
94
+ - Max speed: {np.max(data['speeds']):.1f}m/s
95
+ - Active duration: {data['timestamps'][-1]-data['timestamps'][0]:.1f}s
96
+ """)
yolov8s.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1f47a78bf100391c2a140b7ac73a1caae18c32779be7d310658112f7ac9aa78a
3
+ size 22588772