face_detection_opencv_dnn.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import argparse
  2. import os
  3. import time
  4. import cv2
  5. def detectFaceOpenCVDnn(net, frame, framework="caffe", conf_threshold=0.7):
  6. frameOpencvDnn = frame.copy()
  7. frameHeight = frameOpencvDnn.shape[0]
  8. frameWidth = frameOpencvDnn.shape[1]
  9. if framework == "caffe":
  10. blob = cv2.dnn.blobFromImage(
  11. frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], False, False,
  12. )
  13. else:
  14. blob = cv2.dnn.blobFromImage(
  15. frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False,
  16. )
  17. net.setInput(blob)
  18. detections = net.forward()
  19. bboxes = []
  20. for i in range(detections.shape[2]):
  21. confidence = detections[0, 0, i, 2]
  22. if confidence > conf_threshold:
  23. x1 = int(detections[0, 0, i, 3] * frameWidth)
  24. y1 = int(detections[0, 0, i, 4] * frameHeight)
  25. x2 = int(detections[0, 0, i, 5] * frameWidth)
  26. y2 = int(detections[0, 0, i, 6] * frameHeight)
  27. bboxes.append([x1, y1, x2, y2])
  28. cv2.rectangle(
  29. frameOpencvDnn,
  30. (x1, y1),
  31. (x2, y2),
  32. (0, 255, 0),
  33. int(round(frameHeight / 150)),
  34. 8,
  35. )
  36. return frameOpencvDnn, bboxes
  37. if __name__ == "__main__":
  38. parser = argparse.ArgumentParser(description="Face detection")
  39. parser.add_argument("--video", type=str, default="", help="Path to video file")
  40. parser.add_argument(
  41. "--device",
  42. type=str,
  43. default="cpu",
  44. choices=["cpu", "gpu"],
  45. help="Device to use",
  46. )
  47. parser.add_argument(
  48. "--framework",
  49. type=str,
  50. default="caffe",
  51. choices=["caffe", "tf"],
  52. help="Type of network to run",
  53. )
  54. args = parser.parse_args()
  55. framework = args.framework
  56. source = args.video
  57. device = args.device
  58. # OpenCV DNN supports 2 networks.
  59. # 1. FP16 version of the original Caffe implementation ( 5.4 MB )
  60. # 2. 8 bit Quantized version using TensorFlow ( 2.7 MB )
  61. if framework == "caffe":
  62. modelFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"
  63. configFile = "models/deploy.prototxt"
  64. net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
  65. else:
  66. modelFile = "models/opencv_face_detector_uint8.pb"
  67. configFile = "models/opencv_face_detector.pbtxt"
  68. net = cv2.dnn.readNetFromTensorflow(modelFile, configFile)
  69. if device == "cpu":
  70. net.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU)
  71. else:
  72. net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
  73. net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
  74. outputFolder = "output-dnn-videos"
  75. if not os.path.exists(outputFolder):
  76. os.makedirs(outputFolder)
  77. if source:
  78. cap = cv2.VideoCapture(source)
  79. outputFile = os.path.basename(source)[:-4] + ".avi"
  80. else:
  81. cap = cv2.VideoCapture(0, cv2.CAP_V4L)
  82. outputFile = "grabbed_from_camera.avi"
  83. hasFrame, frame = cap.read()
  84. vid_writer = cv2.VideoWriter(
  85. os.path.join(outputFolder, outputFile),
  86. cv2.VideoWriter_fourcc("M", "J", "P", "G"),
  87. 15,
  88. (frame.shape[1], frame.shape[0]),
  89. )
  90. frame_count = 0
  91. tt_opencvDnn = 0
  92. while True:
  93. hasFrame, frame = cap.read()
  94. if not hasFrame:
  95. break
  96. frame_count += 1
  97. t = time.time()
  98. outOpencvDnn, bboxes = detectFaceOpenCVDnn(net, frame)
  99. tt_opencvDnn += time.time() - t
  100. fpsOpencvDnn = frame_count / tt_opencvDnn
  101. label = "OpenCV DNN {} FPS : {:.2f}".format(device.upper(), fpsOpencvDnn)
  102. cv2.putText(
  103. outOpencvDnn,
  104. label,
  105. (10, 50),
  106. cv2.FONT_HERSHEY_SIMPLEX,
  107. 1.3,
  108. (0, 0, 255),
  109. 3,
  110. cv2.LINE_AA,
  111. )
  112. cv2.imshow("Face Detection Comparison", outOpencvDnn)
  113. vid_writer.write(outOpencvDnn)
  114. if frame_count == 1:
  115. tt_opencvDnn = 0
  116. k = cv2.waitKey(5)
  117. if k == 27:
  118. break
  119. cv2.destroyAllWindows()
  120. vid_writer.release()