Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Test script to verify CSV format matches SCHEMA_EXAMPLE.csv | |
| """ | |
| import csv | |
| from io import StringIO | |
| # Exemple de détections comme generées par le backend | |
| frame_detections = [ | |
| { | |
| "frame": 1, | |
| "timestamp_sec": 0.033, | |
| "scene_name": "abc123", | |
| "group_id": "abc123", | |
| "video_name": "traffic_clip1.mp4", | |
| "track_id": "", | |
| "class_name": "Vehicle", | |
| "confidence": 0.912, | |
| "bbox_x1": 340, | |
| "bbox_y1": 210, | |
| "bbox_x2": 520, | |
| "bbox_y2": 310, | |
| "cx": 430, | |
| "cy": 260, | |
| "frame_width": 1920, | |
| "frame_height": 1080, | |
| "crossed_line": "false", | |
| "direction": "", | |
| "speed_px_s": 0.0 | |
| }, | |
| { | |
| "frame": 2, | |
| "timestamp_sec": 0.067, | |
| "scene_name": "abc123", | |
| "group_id": "abc123", | |
| "video_name": "traffic_clip1.mp4", | |
| "track_id": "", | |
| "class_name": "Vehicle", | |
| "confidence": 0.908, | |
| "bbox_x1": 345, | |
| "bbox_y1": 213, | |
| "bbox_x2": 525, | |
| "bbox_y2": 313, | |
| "cx": 435, | |
| "cy": 263, | |
| "frame_width": 1920, | |
| "frame_height": 1080, | |
| "crossed_line": "false", | |
| "direction": "", | |
| "speed_px_s": 14.2 | |
| }, | |
| { | |
| "frame": 48, | |
| "timestamp_sec": 1.600, | |
| "scene_name": "abc123", | |
| "group_id": "abc123", | |
| "video_name": "traffic_clip1.mp4", | |
| "track_id": "", | |
| "class_name": "Vehicle", | |
| "confidence": 0.887, | |
| "bbox_x1": 560, | |
| "bbox_y1": 290, | |
| "bbox_x2": 740, | |
| "bbox_y2": 390, | |
| "cx": 650, | |
| "cy": 340, | |
| "frame_width": 1920, | |
| "frame_height": 1080, | |
| "crossed_line": "true", | |
| "direction": "down", | |
| "speed_px_s": 15.1 | |
| }, | |
| ] | |
| # Generate CSV | |
| output = StringIO() | |
| writer = csv.writer(output, lineterminator="\n") | |
| # Header | |
| writer.writerow([ | |
| "frame", "timestamp_sec", "scene_name", "group_id", | |
| "video_name", "track_id", "class_name", "confidence", | |
| "bbox_x1", "bbox_y1", "bbox_x2", "bbox_y2", | |
| "cx", "cy", "frame_width", "frame_height", | |
| "crossed_line", "direction", "speed_px_s" | |
| ]) | |
| # Data rows | |
| for det in frame_detections: | |
| writer.writerow([ | |
| det["frame"], | |
| f"{det['timestamp_sec']:.3f}", | |
| det["scene_name"], | |
| det["group_id"], | |
| det["video_name"], | |
| det["track_id"], | |
| det["class_name"], | |
| f"{det['confidence']:.3f}", | |
| det["bbox_x1"], | |
| det["bbox_y1"], | |
| det["bbox_x2"], | |
| det["bbox_y2"], | |
| det["cx"], | |
| det["cy"], | |
| det["frame_width"], | |
| det["frame_height"], | |
| det["crossed_line"], | |
| det["direction"], | |
| f"{det['speed_px_s']:.1f}" | |
| ]) | |
| # Print result | |
| csv_output = output.getvalue() | |
| print("Generated CSV:") | |
| print("=" * 120) | |
| print(csv_output) | |
| print("=" * 120) | |
| # Compare with expected format | |
| expected_header = "frame,timestamp_sec,scene_name,group_id,video_name,track_id,class_name,confidence,bbox_x1,bbox_y1,bbox_x2,bbox_y2,cx,cy,frame_width,frame_height,crossed_line,direction,speed_px_s" | |
| actual_header = csv_output.split('\n')[0] | |
| print("\nExpected header:") | |
| print(expected_header) | |
| print("\nActual header:") | |
| print(actual_header) | |
| print("\nHeaders match:", expected_header == actual_header) | |
| # Verify number of columns | |
| lines = csv_output.strip().split('\n') | |
| for i, line in enumerate(lines, 1): | |
| cols = line.split(',') | |
| expected_cols = 19 | |
| if len(cols) != expected_cols: | |
| print(f"Row {i}: WARNING - Expected {expected_cols} columns, got {len(cols)}") | |
| else: | |
| print(f"Row {i}: OK ({len(cols)} columns)") | |
| print("\n✅ CSV Format validation complete!") | |