summaryrefslogtreecommitdiff
path: root/megapixels/commands/demo/face_search.py
blob: 0452cc9d1d13dfef74c4dbf169cad966be19c63a (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import click

from app.settings import types
from app.models.dataset import Dataset
from app.utils import click_utils
from app.settings import app_cfg as cfg
from app.utils.logger_utils import Logger

@click.command()
@click.option('-i', '--input', 'opt_fp_in', required=True,
  help='Input face image')
@click.option('--data_store', 'opt_data_store',
  type=cfg.DataStoreVar,
  default=click_utils.get_default(types.DataStore.SSD),
  show_default=True,
  help=click_utils.show_help(types.Dataset))
@click.option('--dataset', 'opt_dataset',
  type=cfg.DatasetVar,
  required=True,
  show_default=True,
  help=click_utils.show_help(types.Dataset))
@click.option('--gpu', 'opt_gpu', default=0,
  help='GPU index (use -1 for CPU)')
@click.pass_context
def cli(ctx, opt_fp_in, opt_data_store, opt_dataset, opt_gpu):
  """Display image info"""
  
  import sys
  from glob import glob
  from os.path import join
  from pathlib import Path
  import time

  import imutils
  import pandas as pd
  import cv2 as cv
  import dlib
  from tqdm import tqdm
  
  from app.utils import file_utils, im_utils
  from app.models.data_store import DataStore, DataStoreS3
  from app.processors import face_detector
  from app.processors import face_recognition

  log = Logger.getLogger()

  # init face detection
  detector = face_detector.DetectorDLIBHOG()

  # init face recognition
  recognition = face_recognition.RecognitionDLIB(gpu=opt_gpu)
  
  # load query image
  im_query = cv.imread(opt_fp_in)
  # get detection as BBox object
  bboxes = detector.detect(im_query, largest=True)
  bbox = bboxes[0]
  dim = im_query.shape[:2][::-1]
  bbox = bbox.to_dim(dim)  # convert back to real dimensions

  if not bbox:
    log.error('No face detected. Exiting')
    return
  
  # extract the face vectors
  vec_query = recognition.vec(im_query, bbox)
  
  # load dataset CSVs
  dataset = Dataset(opt_data_store, opt_dataset)

  # find matches
  image_records = dataset.find_matches(vec_query, n_results=5)

  # summary
  ims_match = [im_query]
  for image_record in image_records:
    image_record.summarize()
    log.info(f'{image_record.filepath}')
    im_match = cv.imread(image_record.filepath)
    ims_match.append(im_match)

  montages = imutils.build_montages(ims_match, (256, 256), (3,2))

  for i, montage in enumerate(montages):
    cv.imshow(f'{i}', montage)
  # cv gui
  while True:
    k = cv.waitKey(1) & 0xFF
    if k == 27 or k == ord('q'):  # ESC
      cv.destroyAllWindows()
      sys.exit()
    elif k != 255:
      # any key to continue
      break