| import cv2
|
| import torch
|
| from ultralytics import YOLO
|
|
|
|
|
| model_path = r"runs\detect\train\weights\best.pt"
|
|
|
|
|
| device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
|
|
| try:
|
| model = YOLO(model_path)
|
| except FileNotFoundError:
|
| print(f"Error: Model file not found at {model_path}")
|
| exit()
|
|
|
|
|
| model.conf = 0.4
|
|
|
|
|
|
|
| class_names = ['car', 'emv', 'htv']
|
|
|
|
|
| stop_live_detection = False
|
|
|
| def click_event(event, x, y, flags, param):
|
| global stop_live_detection
|
| if event == cv2.EVENT_LBUTTONDOWN:
|
| stop_live_detection = True
|
|
|
| while True:
|
| mode = input("\nEnter '1' for live detection, '2' for image detection, or 'q' to quit: ").strip().lower()
|
|
|
| if mode == "1":
|
| cap = cv2.VideoCapture(0)
|
| stop_live_detection = False
|
|
|
| if not cap.isOpened():
|
| print("Error: Could not open webcam.")
|
| continue
|
|
|
| cv2.namedWindow("YOLOv8 Real-Time Detection")
|
| cv2.setMouseCallback("YOLOv8 Real-Time Detection", click_event)
|
|
|
| while cap.isOpened():
|
| ret, frame = cap.read()
|
| if not ret or stop_live_detection:
|
| break
|
|
|
| results = model(frame)[0]
|
|
|
| for box in results.boxes:
|
| cls_id = int(box.cls.item())
|
| conf = float(box.conf.item())
|
|
|
|
|
| if cls_id == 3:
|
| continue
|
|
|
|
|
| x1, y1, x2, y2 = map(int, box.xyxy[0])
|
| label = f"{class_names[cls_id]} {conf:.2f}"
|
| cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
| cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
|
|
|
| cv2.imshow("YOLOv8 Real-Time Detection", frame)
|
|
|
| if cv2.waitKey(1) & 0xFF == ord('q'):
|
| break
|
|
|
| cap.release()
|
| cv2.destroyAllWindows()
|
| print("Live detection stopped.")
|
|
|
| elif mode == "2":
|
| image_path = input("Enter the path of the image: ").strip()
|
|
|
| try:
|
| image = cv2.imread(image_path)
|
| if image is None:
|
| raise FileNotFoundError(f"Error: Image file not found at {image_path}")
|
|
|
| results = model(image)[0]
|
|
|
| for box in results.boxes:
|
| cls_id = int(box.cls.item())
|
| conf = float(box.conf.item())
|
|
|
| if cls_id == 3:
|
| continue
|
|
|
| x1, y1, x2, y2 = map(int, box.xyxy[0])
|
| label = f"{class_names[cls_id]} {conf:.2f}"
|
| cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)
|
| cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2)
|
|
|
| cv2.imshow("YOLOv8 Image Detection", image)
|
| cv2.waitKey(0)
|
| cv2.destroyAllWindows()
|
|
|
| except Exception as e:
|
| print(f"Error: {e}")
|
|
|
| elif mode == "q":
|
| print("Exiting program.")
|
| break
|
|
|
| else:
|
| print("Invalid input. Please enter '1' for real-time, '2' for image detection, or 'q' to quit.")
|
|
|