Spaces:
Runtime error
Runtime error
| import dlib | |
| import cv2 | |
| class LandmarksDetector: | |
| def __init__(self, predictor_model_path): | |
| """ | |
| :param predictor_model_path: path to shape_predictor_68_face_landmarks.dat file | |
| """ | |
| self.detector = dlib.get_frontal_face_detector() # cnn_face_detection_model_v1 also can be used | |
| self.shape_predictor = dlib.shape_predictor(predictor_model_path) | |
| def get_landmarks(self, image): | |
| img = dlib.load_rgb_image(image) | |
| dets = self.detector(img, 1) | |
| #print('face bounding boxes', dets) | |
| for detection in dets: | |
| face_landmarks = [(item.x, item.y) for item in self.shape_predictor(img, detection).parts()] | |
| #print('face landmarks', face_landmarks) | |
| yield face_landmarks | |
| def draw(img, landmarks): | |
| for (x, y) in landmarks: | |
| cv2.circle(img, (x, y), 1, (0, 0, 255), -1) | |
| return img | |
| class DNNLandmarksDetector: | |
| def __init__(self, predictor_model_path, DNN='TF'): | |
| """ | |
| :param | |
| DNN: "TF" or "CAFFE" | |
| predictor_model_path: path to shape_predictor_68_face_landmarks.dat file | |
| """ | |
| if DNN == "CAFFE": | |
| modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel" | |
| configFile = "deploy.prototxt" | |
| net = cv2.dnn.readNetFromCaffe(configFile, modelFile) | |
| else: | |
| modelFile = "opencv_face_detector_uint8.pb" | |
| configFile = "opencv_face_detector.pbtxt" | |
| net = cv2.dnn.readNetFromTensorflow(modelFile, configFile) | |
| self.shape_predictor = dlib.shape_predictor(predictor_model_path) | |
| def detect_faces(self, image, conf_threshold=0): | |
| H, W = image.shape[:2] | |
| blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), [104, 117, 123], False, False) | |
| net.setInput(blob) | |
| detections = net.forward() | |
| bboxes = [] | |
| for i in range(detections.shape[2]): | |
| confidence = detections[0, 0, i, 2] | |
| if confidence > conf_threshold: | |
| x1 = int(detections[0, 0, i, 3] * W) | |
| y1 = int(detections[0, 0, i, 4] * H) | |
| x2 = int(detections[0, 0, i, 5] * W) | |
| y2 = int(detections[0, 0, i, 6] * H) | |
| bboxes.append(dlib.rectangle(x1, y1, x2, y2)) | |
| return bboxes | |
| def get_landmarks(self, image): | |
| img = cv2.imread(image) | |
| dets = self.detect_faces(img, 0) | |
| print('face bounding boxes', dets) | |
| for detection in dets: | |
| face_landmarks = [(item.x, item.y) for item in self.shape_predictor(img, detection).parts()] | |
| print('face landmarks', face_landmarks) | |
| yield face_landmarks | |