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
97
98
99
100
|
"""
"""
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,
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('-f', '--force', 'opt_force', is_flag=True,
help='Force overwrite file')
@click.pass_context
def cli(ctx, opt_fp_in, opt_fp_out, opt_dir_media, opt_data_store, opt_dataset, opt_force):
"""Converts age/gender to CSV for pie chartgs"""
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 cv2 as cv
import pandas as pd
from app.utils import logger_utils
from app.models.data_store import DataStore
# -------------------------------------------------------------------------
# init here
log = logger_utils.Logger.getLogger()
# init filepaths
data_store = DataStore(opt_data_store, opt_dataset)
# set file output path
metadata_type = types.Metadata.FACE_ATTRIBUTES
fp_in = data_store.metadata(metadata_type) if opt_fp_out is None else opt_fp_in
dk = opt_dataset.name.lower()
log.debug(f'dk: {dk}')
fp_out_age = f'../site/content/pages/datasets/{dk}/assets/age.csv'
fp_out_gender = f'../site/content/pages/datasets/{dk}/assets/gender.csv'
if not opt_force and (Path(fp_out_age).exists() or Path(fp_out_gender).exists()):
log.error('File exists. Use "-f / --force" to overwite')
return
# -------------------------------------------------------------------------
# Age
df = pd.read_csv(fp_in)
results = []
brackets = [(0, 12), (13, 18), (19,24), (25, 34), (35, 44), (45, 54), (55, 64), (64, 75), (75, 100)]
df_age = df['age_real']
for a1, a2 in brackets:
n = len(df_age.loc[((df_age >= a1) & (df_age <= a2))])
results.append({'age': f'{a1} - {a2}', 'faces': n})
df_out = pd.DataFrame.from_dict(results)
df_out = df_out[['age','faces']]
df_out.to_csv(fp_out_age, index=False)
# Gender
results = []
df_f = df['f']
nm = len(df_f.loc[((df_f < 0.33))])
nnb = len(df_f.loc[((df_f >= 0.33) & (df_f <= 0.66))])
nf = len(df_f.loc[((df_f > 0.66))])
results = []
results.append({'gender': 'Male', 'faces':nm})
results.append({'gender': 'Female', 'faces': nf})
results.append({'gender': 'They', 'faces': nnb})
df_out = pd.DataFrame.from_dict(results)
df_out = df_out[['gender','faces']]
df_out.to_csv(fp_out_gender, index=False)
|