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
95
96
|
"""
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)
|