Search code examples
python-3.xobject-detectionyolo

Delay in output video stream when using YOLOV3 Detection using OpenCV


This is my Code of Mask Detection using YOLOV3 weights created by me. Whenever I run my Program, I experience a delay in my output Video of detection. This is the code please have a look.


import cv2
import numpy as np


net = cv2.dnn.readNet("yolov3_custom_final.weights", "yolov3_custom.cfg")

with open("obj.name", "r") as f:
    classes = f.read().splitlines()


cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW)

while True:
    ret, img = cap.read()
    height, weight, _ = img.shape
    blob = cv2.dnn.blobFromImage(img, 1 / 255, (416, 416), (0, 0, 0), swapRB=True, crop=False)
    net.setInput(blob)
    output = net.getUnconnectedOutLayersNames()
    layers = net.forward(output)

    box = []
    confidences = []
    class_ids = []

    for out in layers:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.3:
                centre_x = int(detection[0] * weight)
                centre_y = int(detection[1] * height)
                w = int(detection[2] * weight)
                h = int(detection[3] * height)

                x = int(centre_x - w / 2)
                y = int(centre_y - h / 2)

                box.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)

    indexes = np.array(cv2.dnn.NMSBoxes(box, confidences, 0.5, 0.4))
    font = cv2.FONT_HERSHEY_PLAIN
    colors = np.random.uniform(0, 255, size=(len(box), 3))

    for i in indexes.flatten():
        x, y, w, h = box[i]
        label = str(classes[class_ids[i]])
        confidence = str(round(confidences[i], 2))
        color = colors[i]
        cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
        cv2.putText(img, label + "I" + confidence, (x, y + 20), font, 2, (255, 255, 255), 2)

    cv2.imshow("Final", img)
    if cv2.waitKey(1) & 0xff == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

Can someone Please help me in this Issue or suggest a way to reduce the Lag in my Output videostream ?


Solution

  • As I have done some research over the Time, I have a found a Possible answer to this question. As I'm running my YOLO model in my local system which has no GPU, This is the factor that is causing a delay in the Output as it Processes a frame and takes another frame after completion.