summaryrefslogtreecommitdiff
path: root/megapixels/commands/visualize/plot_3d_landmarks.py
blob: a0f9e555f19815cb7c2743887096cbdc9015f100 (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
"""
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