Path: blob/master/FaceDetectionComparison/face_detection_opencv_dnn.py
3118 views
import argparse1import os2import time34import cv2567def detectFaceOpenCVDnn(net, frame, framework="caffe", conf_threshold=0.7):8frameOpencvDnn = frame.copy()9frameHeight = frameOpencvDnn.shape[0]10frameWidth = frameOpencvDnn.shape[1]11if framework == "caffe":12blob = cv2.dnn.blobFromImage(13frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False,14)15else:16blob = cv2.dnn.blobFromImage(17frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False,18)1920net.setInput(blob)21detections = net.forward()22bboxes = []23for i in range(detections.shape[2]):24confidence = detections[0, 0, i, 2]25if confidence > conf_threshold:26x1 = int(detections[0, 0, i, 3] * frameWidth)27y1 = int(detections[0, 0, i, 4] * frameHeight)28x2 = int(detections[0, 0, i, 5] * frameWidth)29y2 = int(detections[0, 0, i, 6] * frameHeight)30bboxes.append([x1, y1, x2, y2])31cv2.rectangle(32frameOpencvDnn,33(x1, y1),34(x2, y2),35(0, 255, 0),36int(round(frameHeight / 150)),378,38)39return frameOpencvDnn, bboxes404142if __name__ == "__main__":4344parser = argparse.ArgumentParser(description="Face detection")45parser.add_argument("--video", type=str, default="", help="Path to video file")46parser.add_argument(47"--device",48type=str,49default="cpu",50choices=["cpu", "gpu"],51help="Device to use",52)53parser.add_argument(54"--framework",55type=str,56default="caffe",57choices=["caffe", "tf"],58help="Type of network to run",59)60args = parser.parse_args()6162framework = args.framework63source = args.video64device = args.device6566# OpenCV DNN supports 2 networks.67# 1. FP16 version of the original Caffe implementation ( 5.4 MB )68# 2. 8 bit Quantized version using TensorFlow ( 2.7 MB )6970if framework == "caffe":71modelFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"72configFile = "models/deploy.prototxt"73net = cv2.dnn.readNetFromCaffe(configFile, modelFile)74else:75modelFile = "models/opencv_face_detector_uint8.pb"76configFile = "models/opencv_face_detector.pbtxt"77net = cv2.dnn.readNetFromTensorflow(modelFile, configFile)7879if device == "cpu":80net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU)81else:82net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)83net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)8485outputFolder = "output-dnn-videos"86if not os.path.exists(outputFolder):87os.makedirs(outputFolder)8889if source:90cap = cv2.VideoCapture(source)91outputFile = os.path.basename(source)[:-4] + ".avi"92else:93cap = cv2.VideoCapture(0, cv2.CAP_V4L)94outputFile = "grabbed_from_camera.avi"9596hasFrame, frame = cap.read()9798vid_writer = cv2.VideoWriter(99os.path.join(outputFolder, outputFile),100cv2.VideoWriter_fourcc("M", "J", "P", "G"),10115,102(frame.shape[1], frame.shape[0]),103)104105frame_count = 0106tt_opencvDnn = 0107108while True:109hasFrame, frame = cap.read()110if not hasFrame:111break112113frame_count += 1114t = time.time()115116outOpencvDnn, bboxes = detectFaceOpenCVDnn(net, frame)117tt_opencvDnn += time.time() - t118fpsOpencvDnn = frame_count / tt_opencvDnn119120label = "OpenCV DNN {} FPS : {:.2f}".format(device.upper(), fpsOpencvDnn)121cv2.putText(122outOpencvDnn,123label,124(10, 50),125cv2.FONT_HERSHEY_SIMPLEX,1261.3,127(0, 0, 255),1283,129cv2.LINE_AA,130)131132cv2.imshow("Face Detection Comparison", outOpencvDnn)133134vid_writer.write(outOpencvDnn)135136if frame_count == 1:137tt_opencvDnn = 0138139k = cv2.waitKey(5)140if k == 27:141break142143cv2.destroyAllWindows()144vid_writer.release()145146147