| import pandas as pd |
| import matplotlib.pyplot as plt |
| from persistence import load_detection_data |
| import argparse |
|
|
| def visualize_detections(json_path): |
| """ |
| Visualize detection data from a JSON file. |
| |
| Args: |
| json_path (str): Path to the JSON file containing detection data. |
| """ |
| |
| data = load_detection_data(json_path) |
| if not data: |
| return |
|
|
| |
| rows = [] |
| for frame_data in data["frame_detections"]: |
| frame = frame_data["frame"] |
| timestamp = frame_data["timestamp"] |
| for obj in frame_data["objects"]: |
| rows.append({ |
| "frame": frame, |
| "timestamp": timestamp, |
| "keyword": obj["keyword"], |
| "x1": obj["bbox"][0], |
| "y1": obj["bbox"][1], |
| "x2": obj["bbox"][2], |
| "y2": obj["bbox"][3], |
| "area": (obj["bbox"][2] - obj["bbox"][0]) * (obj["bbox"][3] - obj["bbox"][1]) |
| }) |
|
|
| if not rows: |
| print("No detections found in the data") |
| return |
|
|
| df = pd.DataFrame(rows) |
|
|
| |
| fig = plt.figure(figsize=(15, 10)) |
| |
| |
| plt.subplot(2, 2, 1) |
| detections_per_frame = df.groupby("frame").size() |
| plt.plot(detections_per_frame.index, detections_per_frame.values) |
| plt.xlabel("Frame") |
| plt.ylabel("Number of Detections") |
| plt.title("Detections Per Frame") |
|
|
| |
| plt.subplot(2, 2, 2) |
| df["area"].hist(bins=30) |
| plt.xlabel("Detection Area (normalized)") |
| plt.ylabel("Count") |
| plt.title("Distribution of Detection Areas") |
|
|
| |
| plt.subplot(2, 2, 3) |
| avg_area = df.groupby("frame")["area"].mean() |
| plt.plot(avg_area.index, avg_area.values) |
| plt.xlabel("Frame") |
| plt.ylabel("Average Detection Area") |
| plt.title("Average Detection Area Over Time") |
|
|
| |
| plt.subplot(2, 2, 4) |
| df["center_x"] = (df["x1"] + df["x2"]) / 2 |
| df["center_y"] = (df["y1"] + df["y2"]) / 2 |
| plt.hist2d(df["center_x"], df["center_y"], bins=30) |
| plt.colorbar() |
| plt.xlabel("X Position") |
| plt.ylabel("Y Position") |
| plt.title("Detection Center Heatmap") |
|
|
| |
| plt.tight_layout() |
| plt.show() |
|
|
| |
| print("\nSummary Statistics:") |
| print(f"Total frames analyzed: {len(data['frame_detections'])}") |
| print(f"Total detections: {len(df)}") |
| print(f"Average detections per frame: {len(df) / len(data['frame_detections']):.2f}") |
| print(f"\nVideo metadata:") |
| for key, value in data["video_metadata"].items(): |
| print(f"{key}: {value}") |
|
|
| def main(): |
| parser = argparse.ArgumentParser(description="Visualize object detection data") |
| parser.add_argument("json_file", help="Path to the JSON file containing detection data") |
| args = parser.parse_args() |
| |
| visualize_detections(args.json_file) |
|
|
| if __name__ == "__main__": |
| main() |