Hello People!! In my previous blog, we learnt about detecting and counting persons and today we will learn how to use the YOLO Object Detector to detect vehicles in video streams using Deep Learning, OpenCV and Python.
You can click here to read my previous blog.
Import Necessary Libraries
I’ll start by importing necessary libraries
import cv2 import numpy as np import time
Loading YOLO weights and cfg
After importing libraries, I’ll load YOLO weights and cfg files to make classes using COCO files using DNN.
# Load Yolo net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg") classes = [] with open("coco.names", "r") as f: classes = [line.strip() for line in f.readlines()] layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] colors = np.random.uniform(0, 255, size=(len(classes), 3))
Detecting and Counting vehicles in video stream
I’ll load a video, and try to detect and count vehicles in that video. I’ll loop over the frames of video and construct a blob from the input frame and then perform a forward pass of the YOLO object detector, which will give us bounding boxes and associated probabilities. Next, I’ll filter out weak predictions, i.e., predictions having probability greater than 0.7 will be considered. Then, I’ll draw a bounding box rectangle over the vehicles.
# Loading image cap = cv2.VideoCapture("India - 8698.mp4") #instantiate a variable 'p' to keep count of vehicles p = 0 font = cv2.FONT_HERSHEY_PLAIN starting_time = time.time() frame_id = 0 while True: _, frame = cap.read() frame_id += 1 height, width, channels = frame.shape # Detecting objects blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False) net.setInput(blob) outs = net.forward(output_layers) # initialize our lists of detected bounding boxes, confidences, and class IDs, respectively class_ids = [] confidences = [] boxes = [] # loop over each of the layer outputs for out in outs: # loop over each of the detections for detection in out: # extract the class ID and confidence scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] # filter out weak predictions if confidence > 0.7: # Object detected center_x = int(detection[0] * width) center_y = int(detection[1] * height) w = int(detection[2] * width) h = int(detection[3] * height) # Rectangle coordinates x = int(center_x - w / 2) y = int(center_y - h / 2) # update our list of bounding box coordinates, confidences, and class IDs boxes.append([x, y, w, h]) confidences.append(float(confidence)) class_ids.append(class_id) # apply non-maxima suppression to suppress weak, overlapping bounding boxes indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.8, 0.3) #detecting Vehicles for i in range(len(boxes)): if i in indexes: x, y, w, h = boxes[i] label = str(classes[class_ids[i]]) if label=="car": p=p+1 elif label=="truck": p=p+1 elif label=="bus": p=p+1 elif label == "motor bike": p=p+1 else: continue confidence = confidences[i] color = colors[class_ids[i]] cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) cv2.putText(frame, label + ':' + str(p) , (x, y + 30), font, 0.5, color, 1) elapsed_time = time.time() - starting_time fps = frame_id / elapsed_time cv2.putText(frame, "FPS: " + str(round(fps, 2)), (10, 50), font, 0.5, (0, 0, 0), 1) cv2.imshow("Image", frame) key = cv2.waitKey(1) if key == 27: cap.release() break cv2.destroyAllWindows()
The program is now ready to run. Each frame is run through the YOLO object detector and identified items are highlighted. The program can be stopped by pressing the key ‘ESC’ at any time.
Implementation
Conclusion
Congratulations !! We are finally able to implement vehicle detection using OpenCV and YOLO.
Do share your views in the comments section.
–Shruti Sharma
1 Comment
Denny · June 21, 2020 at 9:33 am
Wow cuz this is extremely excellent job! Congrats and keep it up.