FaceMasking / app.py
akhfzl's picture
upload_app
cf2a4ae verified
import numpy as np
import cv2
import torch
import sys
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
yolov5_path = pathlib.PosixPath('yolov5')
sys.path.append(str(yolov5_path))
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_boxes
model = attempt_load('best.pt')
model.eval()
pathlib.PosixPath = temp
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Failed to grab frame")
break
# Resize the frame to 640x640
img = cv2.resize(frame, (640, 640))
img = img[:, :, ::-1] # Convert BGR to RGB
img = np.ascontiguousarray(img) # Make sure the array is contiguous
img = torch.from_numpy(img).float() # Convert to Tensor
img /= 255.0 # Normalize to [0, 1]
# Change the shape to [batch_size, channels, height, width]
img = img.permute(2, 0, 1).unsqueeze(0) # Rearrange dimensions and add batch dimension
# Perform inference
with torch.no_grad():
pred = model(img)[0] # Get predictions
# Apply Non-Maximum Suppression
pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)
# Process predictions
for det in pred: # detections per image
if det is not None and len(det):
# Rescale boxes from 640 to original frame size
det[:, :4] = scale_boxes(img.shape[2:], det[:, :4], frame.shape).round()
# Draw bounding boxes on the frame
for *xyxy, conf, cls in reversed(det):
label = f'{model.names[int(cls)]}: {conf:.2f}' # Create label
cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2) # Draw box
cv2.putText(frame, label, (int(xyxy[0]), int(xyxy[1] - 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # Draw label
# Display the frame
cv2.imshow('Deteksi Cadar Masker', frame)
# Break the loop on 'q' key press
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release the webcam and close windows
cap.release()
cv2.destroyAllWindows()