SSD300 achieves 74.3% mAP at 59 FPS while SSD500 achieves 76.9% mAP at 22 FPS, which outperforms Faster R-CNN (73.2% mAP at 7 FPS) and YOLOv1 (63.4% mAP at 45 FPS).
project directory
mobileNetSSD.py
mobileNet
MobileNetSSD_deploy.caffemodel
MobileNetSSD_deploy.prototxt
asset
zoo.mp4
#mobileNetSSD.py
import os
import cv2
import numpy as np
import math
import time
# load our serialized model from disk
print("Load MobileNetSSD model")
prototxt_path = "mobileNet/MobileNetSSD_deploy.prototxt"
model_path = "mobileNet/MobileNetSSD_deploy.caffemodel"
# initialize the list of class labels MobileNet SSD was trained to detect
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
"sofa", "train", "tvmonitor"]
net = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
# set CUDA as the preferable backend and target
print("[INFO] setting preferable backend and target to CUDA...")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
def process_frame_MobileNetSSD(next_frame):
rgb = cv2.cvtColor(next_frame, cv2.COLOR_BGR2RGB)
(H, W) = next_frame.shape[:2]
# convert the frame to a blob and pass the blob through the
# network and obtain the detections
blob = cv2.dnn.blobFromImage(next_frame, size=(300, 300), ddepth=cv2.CV_8U)
net.setInput(blob, scalefactor=1.0 / 127.5, mean=[127.5, 127.5, 127.5])
detections = net.forward()
# loop over the detections
for i in np.arange(0, detections.shape[2]):
# extract the confidence (i.e., probability) associated
# with the prediction
confidence = detections[0, 0, i, 2]
# filter out weak detections by ensuring the `confidence`
# is greater than the minimum confidence
if confidence > 0.7:
# extract the index of the class label from the
# detections list
idx = int(detections[0, 0, i, 1])
# compute the (x, y)-coordinates of the bounding box
# for the object
box = detections[0, 0, i, 3:7] * np.array([W, H, W, H])
(startX, startY, endX, endY) = box.astype("int")
cv2.rectangle(next_frame, (startX, startY), (endX, endY), (0, 255, 0), 3)
y = startY - 10 if startY - 10 > 10 else startY + 10
cv2.putText(next_frame, CLASSES[idx] + " " + str(round(confidence, 2)), (startX, y),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3)
return next_frame
cap = cv2.VideoCapture("assets/zoo.mp4")
# Define the codec and create VideoWriter object
fps = 25.175
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (int(frame_width), int(frame_height))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
path = 'C:/Users/zchen/PycharmProjects/opencv/googleNet/record'
out = cv2.VideoWriter()
success = out.open(os.path.join(path, "output_mobilenetssd.mov"), fourcc, fps, size, True)
frame_count = 0
t1 = time.time()
while True:
ret, frame = cap.read()
if ret == False: break
frame = process_frame_MobileNetSSD(frame)
cv2.imshow("frame", frame)
out.write(frame)
frame_count += 1
if cv2.waitKey(1) == ord('q'):
break
if cv2.waitKey(1) == ord('p'):
cv2.waitKey(-1) # wait until any key is pressed
t2 = time.time()
# calculate FPS
fps = str(float(frame_count / float(t2 - t1))) + ' FPS'
print("Frames processed: {}".format(frame_count))
print("Elapsed time: {:.2f}".format(float(t2 - t1)))
print("FPS: {}".format(fps))
cap.release()
cv2.destroyAllWindows()
------------------------
#logs
PS C:\Users\zchen\PycharmProjects\opencv> python mobileNetSSD.py
Load MobileNetSSD model
[INFO] setting preferable backend and target to CUDA...
Frames processed: 6772
Elapsed time: 216.37
FPS: 31.297719286548247 FPS
reference:
mobileNet/MobileNetSSD_deploy.prototxt
mobileNet/MobileNetSSD_deploy.caffemodel
No comments:
Post a Comment