import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) import cv2 from core.entity_detector import EntityDetector from core.scene_graph import SceneGraph from core.violation_engine import ViolationEngine from config.settings import SETTINGS detector = EntityDetector() scene_graph_builder = SceneGraph(SETTINGS) violation_engine = ViolationEngine(SETTINGS) image = cv2.imread('data/sample_images/wrong_side_sample.png') detections = detector.detect(image) # Crop riders and detect helmets/seatbelts based on vehicle association rider_nodes = [d for d in detections if d.entity_class == EntityClass.PERSON] if 'EntityClass' in globals() else [] # Let's import EntityClass from config.settings import EntityClass, TWO_WHEELER_CLASSES, FOUR_WHEELER_CLASSES from core.scene_graph import is_four_wheeler_occupant rider_nodes = [d for d in detections if d.entity_class == EntityClass.PERSON] vehicles = [d for d in detections if d.entity_class is not None and d.entity_class in (TWO_WHEELER_CLASSES | FOUR_WHEELER_CLASSES)] helmet_crops = [] seatbelt_crops = [] for r in rider_nodes: is_two_wheeler_rider = False is_occupant = False for v in vehicles: if v.entity_class in TWO_WHEELER_CLASSES: from core.scene_graph import compute_iou, compute_overlap_ratio if max(compute_iou(r.bbox, v.bbox), compute_overlap_ratio(r.bbox, v.bbox)) >= 0.15: is_two_wheeler_rider = True elif v.entity_class in FOUR_WHEELER_CLASSES: if is_four_wheeler_occupant(r.bbox, v.bbox): is_occupant = True if is_two_wheeler_rider: helmet_crops.append(r.bbox) if is_occupant: seatbelt_crops.append(r.bbox) if helmet_crops: detections.extend(detector.detect_helmets(image, helmet_crops)) if seatbelt_crops: detections.extend(detector.detect_seatbelts(image, seatbelt_crops)) plate_detections = detector.detect_plates(image, detections) detections.extend(plate_detections) scene_graph_builder.build(detections, frame_shape=image.shape[:2]) violations = violation_engine.analyze(scene_graph_builder, image) print("\n--- Violations Detected on wrong_side_sample.png ---") for v in violations: print(f"Type: {v.violation_type.name}") print(f"Description: {v.description}") print(f"Involved: {v.involved_nodes}") print(f"Bbox: {v.bbox}") print(f"Metadata: {v.metadata}") print("-" * 30)