File size: 8,528 Bytes
7e56761
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#!/usr/bin/env python3
"""
RF-DETR SoccerNet - Simple Usage Examples

This script demonstrates how to use the RF-DETR SoccerNet model for soccer analysis.
Shows basic video processing, image analysis, and advanced ball possession analysis.
"""

import os
import sys
import pandas as pd
from pathlib import Path

# Import our RF-DETR SoccerNet class
from inference import RFDETRSoccerNet


def basic_video_analysis():
    """Basic video processing example."""
    print("🎬 BASIC VIDEO ANALYSIS EXAMPLE")
    print("=" * 50)
    
    # Initialize model (automatically detects CUDA/CPU)
    print("Loading RF-DETR SoccerNet model...")
    model = RFDETRSoccerNet()
    
    # Process a video (replace with your video path)
    video_path = "sample_soccer_match.mp4"  # Replace with actual video
    
    if not os.path.exists(video_path):
        print(f"⚠️  Video not found: {video_path}")
        print("Please provide a valid video path to test the model.")
        return
    
    # Process video with custom settings
    print(f"\nProcessing video: {video_path}")
    df = model.process_video(
        video_path=video_path,
        confidence_threshold=0.5,    # Only detections above 50% confidence
        frame_skip=5,               # Process every 5th frame for speed
        max_frames=300,             # Process first 300 frames only
        save_results=True           # Automatically save results
    )
    
    # Display basic statistics
    print(f"\n📊 ANALYSIS RESULTS")
    print(f"Total detections: {len(df):,}")
    print(f"Frames analyzed: {df['frame'].nunique():,}")
    print(f"Time span: {df['timestamp'].max():.1f} seconds")
    
    # Show detections by class
    print(f"\n🎯 Detections by class:")
    class_stats = df['class_name'].value_counts()
    for class_name, count in class_stats.items():
        percentage = (count / len(df)) * 100
        print(f"  {class_name}: {count:,} ({percentage:.1f}%)")
    
    # Save results in different formats
    print(f"\n💾 Saving results...")
    model.save_results(df, "video_analysis.csv", format="csv")
    model.save_results(df, "video_analysis.json", format="json")
    
    return df


def image_analysis_example():
    """Single image processing example."""
    print("\n🖼️  IMAGE ANALYSIS EXAMPLE")
    print("=" * 50)
    
    # Initialize model
    model = RFDETRSoccerNet()
    
    # Process a single image (replace with your image path)
    image_path = "sample_soccer_frame.jpg"  # Replace with actual image
    
    if not os.path.exists(image_path):
        print(f"⚠️  Image not found: {image_path}")
        print("Please provide a valid image path to test the model.")
        return
    
    # Process image
    print(f"Processing image: {image_path}")
    df = model.process_image(image_path, confidence_threshold=0.4)
    
    # Display results
    print(f"\n📊 Found {len(df)} objects in the image:")
    for _, detection in df.iterrows():
        print(f"  - {detection['class_name']}: {detection['confidence']:.2f} "
              f"at ({detection['x1']:.0f}, {detection['y1']:.0f})")
    
    # Save results
    model.save_results(df, "image_analysis.csv")
    
    return df


def ball_possession_analysis(video_df):
    """Advanced ball possession analysis example."""
    print("\n⚽ BALL POSSESSION ANALYSIS")
    print("=" * 50)
    
    # Initialize model
    model = RFDETRSoccerNet()
    
    # Analyze ball possession (players near the ball)
    print("Analyzing ball possession events...")
    possession_df = model.analyze_ball_possession(
        video_df, 
        distance_threshold=150  # Players within 150 pixels of ball
    )
    
    if len(possession_df) == 0:
        print("❌ No possession events found. Try lowering the distance threshold.")
        return
    
    # Possession statistics
    print(f"\n📈 POSSESSION STATISTICS")
    print(f"Total possession events: {len(possession_df):,}")
    print(f"Average distance to ball: {possession_df['distance_to_ball'].mean():.1f} pixels")
    print(f"Possession timeframe: {possession_df['timestamp'].min():.1f}s - {possession_df['timestamp'].max():.1f}s")
    
    # Possession over time (group by 10-second intervals)
    possession_df['time_interval'] = (possession_df['timestamp'] // 10) * 10
    possession_timeline = possession_df.groupby('time_interval').size()
    
    print(f"\n⏱️  POSSESSION TIMELINE (10-second intervals):")
    for interval, count in possession_timeline.items():
        print(f"  {interval:3.0f}s-{interval+10:3.0f}s: {count:3d} events")
    
    # Find closest ball-player interactions
    closest_interactions = possession_df.nsmallest(5, 'distance_to_ball')
    print(f"\n🎯 CLOSEST BALL-PLAYER INTERACTIONS:")
    for i, interaction in closest_interactions.iterrows():
        print(f"  {interaction['timestamp']:.1f}s: {interaction['distance_to_ball']:.1f}px distance")
    
    # Save possession analysis
    model.save_results(possession_df, "ball_possession_analysis.csv")
    print(f"\n💾 Possession analysis saved to ball_possession_analysis.csv")
    
    return possession_df


def advanced_filtering_examples(video_df):
    """Examples of advanced DataFrame filtering and analysis."""
    print("\n🔍 ADVANCED FILTERING EXAMPLES")
    print("=" * 50)
    
    # High confidence detections only
    high_conf_df = video_df[video_df['confidence'] > 0.8]
    print(f"High confidence detections (>0.8): {len(high_conf_df):,}")
    
    # Large objects only (likely close to camera)
    large_objects = video_df[video_df['area'] > 5000]  # Area in pixels²
    print(f"Large objects (>5000px²): {len(large_objects):,}")
    
    # Ball detections timeline
    ball_df = video_df[video_df['class_name'] == 'ball']
    if len(ball_df) > 0:
        print(f"\n⚽ Ball detection timeline:")
        print(f"  First ball seen: {ball_df['timestamp'].min():.1f}s")
        print(f"  Last ball seen: {ball_df['timestamp'].max():.1f}s")
        print(f"  Ball visible in {ball_df['frame'].nunique()} frames")
        print(f"  Average ball confidence: {ball_df['confidence'].mean():.2f}")
    
    # Player density per frame
    player_density = video_df[video_df['class_name'] == 'player'].groupby('frame').size()
    print(f"\n👥 Player density statistics:")
    print(f"  Average players per frame: {player_density.mean():.1f}")
    print(f"  Max players in single frame: {player_density.max()}")
    print(f"  Frames with 10+ players: {(player_density >= 10).sum()}")
    
    # Referee activity
    referee_df = video_df[video_df['class_name'] == 'referee']
    if len(referee_df) > 0:
        print(f"\n👨‍⚖️ Referee activity:")
        print(f"  Referee visible in {referee_df['frame'].nunique()} frames")
        print(f"  Average referee confidence: {referee_df['confidence'].mean():.2f}")


def main():
    """Main demo function."""
    print("🚀 RF-DETR SOCCERNET - COMPLETE DEMO")
    print("=" * 60)
    print("This demo shows how to use RF-DETR SoccerNet for soccer analysis.")
    print("Make sure to replace the sample paths with actual video/image files.")
    print("=" * 60)
    
    try:
        # 1. Basic video analysis
        video_df = basic_video_analysis()
        
        # 2. Image analysis  
        image_df = image_analysis_example()
        
        # If we successfully processed a video, do advanced analysis
        if 'video_df' in locals() and video_df is not None and len(video_df) > 0:
            # 3. Ball possession analysis
            possession_df = ball_possession_analysis(video_df)
            
            # 4. Advanced filtering examples
            advanced_filtering_examples(video_df)
        
        print(f"\n✅ DEMO COMPLETE!")
        print("Check the generated CSV/JSON files for detailed results.")
        print("\n📚 Next steps:")
        print("1. Replace sample paths with your own soccer videos/images")
        print("2. Adjust confidence thresholds and parameters")
        print("3. Integrate the DataFrame results into your analysis pipeline")
        print("4. Use the ball possession analysis for tactical insights")
        
    except Exception as e:
        print(f"❌ Error during demo: {e}")
        print("\nMake sure you have:")
        print("1. Installed all requirements: pip install -r requirements.txt")
        print("2. Valid video/image files in the current directory")
        print("3. CUDA-compatible GPU (or CPU will be used automatically)")


if __name__ == "__main__":
    main()