refactor: single predict.py entrypoint (production + CLI), archive experiments
ci / smoke (push) Canceled after 0s
ci / smoke (push) Canceled after 0s
This commit is contained in:
1 parent
beb9c9fb6b
commit
52d3127302
36 files changed
+161
-48
No files matched your search
@@ -0,0 +1,94 @@
|
||||
import sys
|
||||
import os
|
||||
import cv2
|
||||
import torch
|
||||
import time
|
||||
import numpy as np
|
||||
from ultralytics import YOLO
|
||||
from shapely.geometry import Polygon, Point
|
||||
|
||||
def main():
|
||||
print("=== Detailed Jetson Detection Test ===")
|
||||
|
||||
# 1. Load Zones
|
||||
zones_path = "/home/jetson/karung/zones.json"
|
||||
truck_pts = []
|
||||
if os.path.exists(zones_path):
|
||||
import json
|
||||
with open(zones_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
truck_pts = data.get('truck', [])
|
||||
print(f"Zones.json truck points: {truck_pts}")
|
||||
|
||||
# Target resolution
|
||||
target_w, target_h = 1280, 720
|
||||
|
||||
# Scale factors assuming zones were drawn on 1920x1080
|
||||
orig_w, orig_h = 1920, 1080
|
||||
scale_x = target_w / orig_w
|
||||
scale_y = target_h / orig_h
|
||||
|
||||
scaled_truck_pts = [[int(p[0] * scale_x), int(p[1] * scale_y)] for p in truck_pts] if truck_pts else [
|
||||
[389, 294], [398, 718], [885, 719], [885, 277]
|
||||
]
|
||||
truck_polygon = Polygon(scaled_truck_pts)
|
||||
print(f"Scaled truck polygon: {scaled_truck_pts}")
|
||||
|
||||
# 2. Open Stream
|
||||
source = "rtsp://192.168.192.96:8554/cam"
|
||||
print(f"Connecting to RTSP stream: {source}...")
|
||||
cap = cv2.VideoCapture(source)
|
||||
if not cap.isOpened():
|
||||
print("Error: Could not open RTSP source.")
|
||||
return
|
||||
|
||||
# Wait for the stream to warm up and buffer
|
||||
print("Warming up stream reader for 3 seconds...")
|
||||
time.sleep(3.0)
|
||||
|
||||
# 3. Load Model
|
||||
model_path = "/home/jetson/karung/model_karung_truk.engine"
|
||||
print(f"Loading TensorRT Model: {model_path}...")
|
||||
model = YOLO(model_path)
|
||||
|
||||
print("Running 10 frames of inference...")
|
||||
detections_summary = {}
|
||||
|
||||
frame_count = 0
|
||||
attempts = 0
|
||||
while frame_count < 10 and attempts < 100:
|
||||
ret, frame = cap.read()
|
||||
attempts += 1
|
||||
if not ret or frame is None:
|
||||
time.sleep(0.1)
|
||||
continue
|
||||
|
||||
frame_count += 1
|
||||
frame_resized = cv2.resize(frame, (target_w, target_h))
|
||||
results = model(frame_resized, conf=0.01, imgsz=640, device="cuda", verbose=False)
|
||||
result = results[0]
|
||||
|
||||
detected_in_frame = []
|
||||
for box in result.boxes:
|
||||
cls_id = int(box.cls[0])
|
||||
name = model.names[cls_id]
|
||||
conf = float(box.conf[0])
|
||||
x1, y1, x2, y2 = box.xyxy[0].tolist()
|
||||
tcx = (x1 + x2) / 2.0
|
||||
tcy = (y1 + y2) / 2.0
|
||||
|
||||
# Check if inside truck polygon
|
||||
pt = Point(tcx, tcy)
|
||||
in_poly = truck_polygon.contains(pt)
|
||||
|
||||
detected_in_frame.append(f"{name} ({conf:.3f}) at ({tcx:.1f},{tcy:.1f}) in_poly={in_poly}")
|
||||
detections_summary[name] = detections_summary.get(name, 0) + 1
|
||||
|
||||
print(f"Frame {frame_count} (attempt {attempts}): {', '.join(detected_in_frame) if detected_in_frame else 'None'}")
|
||||
|
||||
cap.release()
|
||||
print("\nSummary of detected objects over processed frames:")
|
||||
print(detections_summary)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user