import os from os.path import join from pathlib import Path import cv2 as cv import numpy as np import imutils from app.utils import im_utils, logger_utils from app.models.bbox import BBox from app.settings import app_cfg as cfg from app.settings import types from app.models.bbox import BBox class LandmarksDLIB: def __init__(self): # init dlib import dlib self.log = logger_utils.Logger.getLogger() self.predictor = dlib.shape_predictor(cfg.DIR_MODELS_DLIB_68PT) def landmarks(self, im, bbox): # Draw high-confidence faces dim = im.shape[:2][::-1] bbox = bbox.to_dlib() im_gray = cv.cvtColor(im, cv.COLOR_BGR2GRAY) landmarks = [[p.x, p.y] for p in self.predictor(im_gray, bbox).parts()] return landmarks class LandmarksMTCNN: # https://github.com/ipazc/mtcnn # pip install mtcnn dnn_size = (400, 400) def __init__(self, size=(400,400)): from mtcnn.mtcnn import MTCNN self.detector = MTCNN() def detect(self, im, opt_size=None, opt_conf_thresh=None, opt_pyramids=None): '''Detects face using MTCNN and returns (list) of BBox :param im: (numpy.ndarray) image :returns list of BBox ''' rois = [] dnn_size = self.dnn_size if opt_size is None else opt_size im = im_utils.resize(im, width=dnn_size[0], height=dnn_size[1]) dim = im.shape[:2][::-1] # run MTCNN dets = self.detector.detect_faces(im) for det in dets: rect = det['box'] keypoints = det['keypoints'] # not using here. see 'face_landmarks.py' bbox = BBox.from_xywh_dim(*rect, dim) rois.append(bbox) return rois