import click from app.settings import types from app.utils import click_utils from app.settings import app_cfg as cfg @click.command() @click.option('-i', '--input', 'opt_fp_in', default=None, required=True, help='Image filepath') @click.option('-o', '--output', 'opt_fp_out', default=None, help='GIF output path') @click.option('--size', 'opt_size', type=(int, int), default=(300, 300), help='Output image size') @click.option('-g', '--gpu', 'opt_gpu', default=0, help='GPU index') @click.option('-f', '--force', 'opt_force', is_flag=True, help='Force overwrite file') @click.option('--display/--no-display', 'opt_display', is_flag=True, default=False, help='Display detections to debug') @click.pass_context def cli(ctx, opt_fp_in, opt_fp_out, opt_gpu, opt_size, opt_force, opt_display): """Face detector demo""" import sys import os from os.path import join from pathlib import Path import time from tqdm import tqdm import numpy as np import pandas as pd import cv2 as cv import dlib from app.utils import logger_utils, file_utils, im_utils, display_utils, draw_utils from app.utils import plot_utils from app.processors import face_detector, face_beauty from app.models.data_store import DataStore log = logger_utils.Logger.getLogger() # ------------------------------------------------- # load image im = cv.imread(opt_fp_in) im_resized = im_utils.resize(im, width=opt_size[0], height=opt_size[1]) # TODO fix Keras CPU/GPU device selection issue # NB: GPU visibility issues with dlib/keras # Wrap this with cuda toggle and run before init dlib GPU device_cur = os.getenv('CUDA_VISIBLE_DEVICES', '') os.environ['CUDA_VISIBLE_DEVICES'] = '' beauty_predictor = face_beauty.FaceBeauty() os.environ['CUDA_VISIBLE_DEVICES'] = device_cur # ---------------------------------------------------------------------------- # detect face face_detector = face_detector.DetectorDLIBCNN(gpu=opt_gpu) # -1 for CPU bboxes = face_detector.detect(im_resized, largest=True) bbox = bboxes[0] dim = im_resized.shape[:2][::-1] bbox_dim = bbox.to_dim(dim) if not bbox: log.error('no face detected') return else: log.info(f'face detected: {bbox_dim.to_xyxy()}') # ---------------------------------------------------------------------------- # beauty beauty_score = beauty_predictor.beauty(im_resized, bbox_dim) # ---------------------------------------------------------------------------- # output log.info(f'Face coords: {bbox_dim} face') log.info(f'beauty score: {(100*beauty_score):.2f}') # ---------------------------------------------------------------------------- # draw # draw 2d landmarks im_beauty = im_resized.copy() draw_utils.draw_bbox(im_beauty, bbox_dim) txt = f'Beauty score: {(100*beauty_score):.2f}' draw_utils.draw_text(im_beauty, bbox_dim.pt_tl, txt) # ---------------------------------------------------------------------------- # save if opt_fp_out: # save pose only cv.imwrite(opt_fp_out, im_beauty) # ---------------------------------------------------------------------------- # display if opt_display: # show all images here cv.imshow('Beauty', im_beauty) display_utils.handle_keyboard()