#!/usr/bin/env python3 """ Final test of the optimized Person on Track Detector on all test videos """ import sys import os from io import BytesIO import glob # Add current directory to path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) def test_person_on_track_final(): """Test the optimized Person on Track Detector on all test videos""" print("FINAL PERSON ON TRACK DETECTOR TEST") print("=" * 50) print("Testing optimized detector based on comprehensive analysis") print() try: from local_models import get_local_model_manager from app import extract_frames_from_video, process_image_locally print("+ Components loaded successfully") except ImportError as e: print(f"- Import error: {e}") return # Find all test videos test_videos = glob.glob("test\\*.mp4") if not test_videos: print("- No MP4 files found in test folder") return print(f"+ Found {len(test_videos)} test videos") # Initialize models try: local_manager = get_local_model_manager() available_models = local_manager.get_available_models() print(f"+ Available models: {available_models}") if "Person on Track Detector" not in available_models: print("- Person on Track Detector not found!") return print("+ Person on Track Detector ready") except Exception as e: print(f"- Model initialization error: {e}") return all_results = [] # Test each video for video_idx, video_path in enumerate(test_videos): video_name = os.path.basename(video_path) print(f"\n" + "=" * 60) print(f"TESTING VIDEO {video_idx + 1}: {video_name}") print("=" * 60) try: # Extract frames with open(video_path, 'rb') as f: video_data = f.read() video_file = BytesIO(video_data) frames = extract_frames_from_video(video_file, fps=0.5) if not frames: print(f"- No frames extracted from {video_name}") continue print(f"+ Extracted {len(frames)} frames from {video_name}") # Test first 3 frames test_frames = frames[:3] video_results = [] for frame_idx, frame_data in enumerate(test_frames): frame_num = frame_idx + 1 timestamp = frame_data['timestamp'] print(f"\n Frame {frame_num} ({timestamp:.1f}s):") print(f" {'-' * 40}") try: result = process_image_locally( frame_data['frame'], "Track Safety Analysis", # Prompt is ignored for this detector 'Person on Track Detector', local_manager ) if 'error' in result: print(f" ERROR: {result['error']}") video_results.append({ 'video': video_name, 'frame': frame_num, 'timestamp': timestamp, 'on_track': False, 'answer': 'ERROR', 'confidence': 0, 'reasoning': result['error'] }) elif 'person_on_track_detection' in result: detection = result['person_on_track_detection'] on_track = detection.get('person_on_track', False) answer = detection.get('answer', 'UNKNOWN') confidence = detection.get('confidence', 0) reasoning = detection.get('reasoning', 'No reasoning') detailed = detection.get('detailed_analysis', {}) # Display results status = "ON TRACK" if on_track else "CLEAR" print(f" Result: {status} ({answer})") print(f" Confidence: {confidence:.0%}") print(f" Reasoning: {reasoning}") # Show detailed analysis if detailed: print(f" Details: Person={detailed.get('person_keywords_found', 0)}, " + f"Track={detailed.get('track_keywords_found', 0)}, " + f"Danger={detailed.get('danger_position_keywords', 0)}, " + f"Safety={detailed.get('safety_concern_keywords', 0)}") video_results.append({ 'video': video_name, 'frame': frame_num, 'timestamp': timestamp, 'on_track': on_track, 'answer': answer, 'confidence': confidence, 'reasoning': reasoning, 'detailed_analysis': detailed }) else: print(f" Unexpected result format: {result}") video_results.append({ 'video': video_name, 'frame': frame_num, 'timestamp': timestamp, 'on_track': False, 'answer': 'UNKNOWN', 'confidence': 0, 'reasoning': 'Unknown result format' }) except Exception as e: print(f" ERROR: {e}") video_results.append({ 'video': video_name, 'frame': frame_num, 'timestamp': timestamp, 'on_track': False, 'answer': 'ERROR', 'confidence': 0, 'reasoning': str(e) }) all_results.extend(video_results) except Exception as e: print(f"- Failed to process {video_name}: {e}") continue # Comprehensive summary print(f"\n" + "=" * 80) print("COMPREHENSIVE RESULTS SUMMARY") print("=" * 80) # Results table print(f"\nDETAILED RESULTS:") print("-" * 90) print(f"{'Video':<10} {'Frame':<6} {'Time':<6} {'On Track':<9} {'Answer':<7} {'Confidence':<11} {'Reasoning':<30}") print("-" * 90) total_frames = len(all_results) on_track_count = 0 error_count = 0 total_confidence = 0 for result in all_results: video = result['video'][:8] frame = result['frame'] timestamp = result['timestamp'] on_track = "YES" if result['on_track'] else "NO" answer = result['answer'] confidence = result['confidence'] reasoning = result['reasoning'][:25] + "..." if len(result['reasoning']) > 25 else result['reasoning'] print(f"{video:<10} {frame:<6} {timestamp:<6.1f} {on_track:<9} {answer:<7} {confidence:<11.0%} {reasoning:<30}") if result['on_track']: on_track_count += 1 if result['answer'] == 'ERROR': error_count += 1 total_confidence += confidence # Overall statistics print(f"\n" + "=" * 80) print("OVERALL PERFORMANCE") print("=" * 80) print(f"Total frames tested: {total_frames}") print(f"Videos tested: {len(test_videos)}") print(f"Person on track detections: {on_track_count}") print(f"Clear/safe detections: {total_frames - on_track_count - error_count}") print(f"Error responses: {error_count}") if total_frames > 0: detection_rate = on_track_count / total_frames * 100 avg_confidence = total_confidence / total_frames error_rate = error_count / total_frames * 100 print(f"Detection rate: {detection_rate:.1f}%") print(f"Average confidence: {avg_confidence:.0%}") print(f"Error rate: {error_rate:.1f}%") # Per-video breakdown print(f"\nPER-VIDEO ANALYSIS:") print("-" * 50) for video_path in test_videos: video_name = os.path.basename(video_path) video_results = [r for r in all_results if r['video'] == video_name] if video_results: on_track_frames = sum(1 for r in video_results if r['on_track']) total_video_frames = len(video_results) avg_video_confidence = sum(r['confidence'] for r in video_results) / len(video_results) print(f"{video_name}: {on_track_frames}/{total_video_frames} frames with person on track " f"(avg confidence: {avg_video_confidence:.0%})") print(f"\n" + "=" * 80) print("FINAL ASSESSMENT") print("=" * 80) if error_rate < 10: print("+ EXCELLENT: Low error rate, detector is working reliably") elif error_rate < 25: print("+ GOOD: Acceptable error rate") else: print("- HIGH ERROR RATE: Needs improvement") if avg_confidence > 70: print("+ HIGH CONFIDENCE: Detector provides confident results") elif avg_confidence > 50: print("+ MODERATE CONFIDENCE: Results are reasonably confident") else: print("- LOW CONFIDENCE: Results may be unreliable") print(f"\nRECOMMENDATION:") if error_rate < 10 and avg_confidence > 70: print("✅ READY FOR PRODUCTION: Person on Track Detector is highly reliable") print(" - Use in Streamlit app for real-time track safety monitoring") print(" - Suitable for automated safety systems") elif error_rate < 25 and avg_confidence > 50: print("⚠️ SUITABLE WITH CAUTION: Good performance but monitor results") print(" - Use for preliminary screening") print(" - Consider human verification for critical decisions") else: print("❌ NEEDS IMPROVEMENT: Not reliable enough for production use") print(" - Improve keyword detection") print(" - Adjust confidence thresholds") print(" - Test with more diverse video content") print(f"\nNext steps:") print("1. Open http://localhost:8502") print("2. Select 'Person on Track Detector' from model dropdown") print("3. Upload test videos from test/ folder") print("4. Compare results with this analysis") return all_results if __name__ == "__main__": test_person_on_track_final()