summaryrefslogtreecommitdiff
path: root/megapixels/app/processors/face_landmarks.py
blob: dfcb9ee80fb01d7524f5ca8ff9d9db4ce4167e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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