""" Crop images to prepare for training """ import click # from PIL import Image, ImageOps, ImageFilter, ImageDraw from app.settings import types from app.utils import click_utils from app.settings import app_cfg as cfg color_filters = {'color': 1, 'gray': 2, 'all': 3} @click.command() @click.option('-i', '--input', 'opt_dirs_in', required=True, multiple=True, help='Input directory') @click.option('-o', '--output', 'opt_fp_out', required=True, help='Output CSV') @click.option('-e', '--ext', 'opt_ext', default='jpg', type=click.Choice(['jpg', 'png']), help='File glob ext') @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('--slice', 'opt_slice', type=(int, int), default=(None, None), help='Slice list of files') @click.option('--recursive/--no-recursive', 'opt_recursive', is_flag=True, default=False, help='Use glob recursion (slower)') @click.option('-f', '--force', 'opt_force', is_flag=True, help='Force overwrite file') @click.pass_context def cli(ctx, opt_dirs_in, opt_fp_out, opt_ext, opt_size, opt_gpu, opt_slice, opt_recursive, opt_force): """Converts face imges to 3D landmarks""" import sys import os from os.path import join from pathlib import Path from glob import glob from tqdm import tqdm import numpy as np import dlib # must keep a local reference for dlib import cv2 as cv import pandas as pd from face_alignment import FaceAlignment, LandmarksType from skimage import io from app.utils import logger_utils, file_utils from app.processors import face_detector # ------------------------------------------------- # init here log = logger_utils.Logger.getLogger() if not opt_force and Path(opt_fp_out).exists(): log.error('File exists. Use "-f / --force" to overwite') return device = 'cuda' if opt_gpu > -1 else 'cpu' fa = FaceAlignment(LandmarksType._3D, flip_input=False, device=device) # get list of files to process fp_ims = [] for opt_dir_in in opt_dirs_in: if opt_recursive: fp_glob = join(opt_dir_in, '**/*.{}'.format(opt_ext)) fp_ims += glob(fp_glob, recursive=True) else: fp_glob = join(opt_dir_in, '*.{}'.format(opt_ext)) fp_ims += glob(fp_glob) log.debug(fp_glob) if opt_slice: fp_ims = fp_ims[opt_slice[0]:opt_slice[1]] log.debug('processing {:,} files'.format(len(fp_ims))) data = {} for fp_im in tqdm(fp_ims): fpp_im = Path(fp_im) im = io.imread(fp_im) preds = fa.get_landmarks(im) if preds and len(preds) > 0: data[fpp_im.name] = preds[0].tolist() # save date file_utils.mkdirs(opt_fp_out) file_utils.write_json(data, opt_fp_out, verbose=True)