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
|
"""
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_fp_in', default=None,
help='Override enum input filename CSV')
@click.option('-o', '--output', 'opt_fp_out', default=None,
help='Override enum output filename CSV')
@click.option('-m', '--media', 'opt_dir_media', default=None,
help='Override enum media directory')
@click.option('--store', 'opt_data_store',
type=cfg.DataStoreVar,
default=click_utils.get_default(types.DataStore.HDD),
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('--size', 'opt_size',
type=(int, int), default=(480, 480),
help='Output image size')
@click.option('--slice', 'opt_slice', type=(int, int), default=(None, None),
help='Slice list of files')
@click.option('--display/--no-display', 'opt_display', is_flag=True, default=False,
help='Display detections to debug')
@click.option('-f', '--force', 'opt_force', is_flag=True,
help='Force overwrite file')
@click.pass_context
def cli(ctx, opt_fp_in, opt_dir_media, opt_fp_out, opt_data_store, opt_dataset,
opt_size, opt_slice, opt_display, opt_force):
"""Generates 3D landmark animations from CSV files"""
import sys
import os
from os.path import join
from pathlib import Path
from tqdm import tqdm
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
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
from app.models.data_store import DataStore
# -------------------------------------------------
# init here
log = logger_utils.Logger.getLogger()
# set storage location
data_store = DataStore(opt_data_store, opt_dataset)
# load file records
fp_record = data_store.metadata(types.Metadata.FILE_RECORD) # file_record.csv
df_records = pd.read_csv(fp_record).set_index('index')
# load ROI data
fp_roi = data_store.metadata(types.Metadata.FACE_ROI) # face_roi.csv
df_rois = pd.read_csv(fp_roi).set_index('index')
fp_landmark_3d = data_store.metadata(types.Metadata.FACE_LANDMARK_3D_68) # face_landmark_3d_68.csv
df_landmarks_3d = pd.read_csv(fp_landmark_3d).set_index('index')
if opt_slice:
df_landmarks_3d = df_landmarks_3d[opt_slice[0]:opt_slice[1]] # slice if you want
log.debug('processing {:,} groups'.format(len(df_landmarks_3d)))
# get filepath out
#fp_out = data_store.metadata(types.Metadata.FACE_ROI) if opt_fp_out is None else opt_fp_out
fp_out = '/home/adam/Downloads/3d.gif'
for roi_index, df_3d in tqdm(df_landmarks_3d.iterrows(), total=len(df_landmarks_3d)):
log.debug(f'roi_index: {roi_index}')
# unflatten points
points_3d = np.array([(df_3d[f'x{i}'], df_3d[f'y{i}'], df_3d[f'z{i}']) for i in range(1, 68)])
plot_utils.generate_3d_landmark_anim(points_3d, fp_out, size=(300,300))
break
|