- initally push for face detection model in
[face-privacy-filter.git] / face_privacy_filter / filter_image.py
1 #! python
2 # -*- coding: utf-8 -*-
3 """
4 Wrapper for image emotion classification task 
5 """
6
7 import os.path
8 import sys
9
10 import numpy as np
11 import pandas as pd
12
13 from face_privacy_filter.transform_detect import FaceDetectTransform
14 from face_privacy_filter._version import MODEL_NAME
15
16
17 def model_create_pipeline(transformer, pipeline_type="detect"):
18     #from sklearn.pipeline import Pipeline
19     dependent_modules = [pd, np, 'opencv-python']  # define as dependent libraries
20
21     # for now, do nothing specific to transformer...
22
23     return transformer, dependent_modules
24
25
26 def main(config={}):
27     import argparse
28     parser = argparse.ArgumentParser()
29     parser.add_argument('-p', '--predict_path', type=str, default='', help="save detections from model (model must be provided via 'dump_model')")
30     parser.add_argument('-i', '--input', type=str, default='',help='absolute path to input image (only during prediction / dump)')
31     parser.add_argument('-s', '--suppress_image', dest='suppress_image', action='store_true', default=False, help='do not create an extra row for a returned image')
32     parser.add_argument('-a', '--push_address', help='server address to push the model (e.g. http://localhost:8887/v2/models)', default='')
33     parser.add_argument('-d', '--dump_model', help='dump model to a pickle directory for local running', default='')
34     config.update(vars(parser.parse_args()))     #pargs, unparsed = parser.parse_known_args()
35
36     if not config['predict_path']:
37         print("Attempting to create new model for dump or push...")
38
39         # refactor the raw samples from upstream image classifier
40         transform = FaceDetectTransform(include_image=not config['suppress_image'])
41         inputDf = transform.generate_in_df()
42         pipeline, EXTRA_DEPS = model_create_pipeline(transform, "detect")
43
44         # formulate the pipeline to be used
45         if 'push_address' in config and config['push_address']:
46             from cognita_client.push import push_sklearn_model # push_skkeras_hybrid_model (keras?)
47             print("Pushing new model to '{:}'...".format(config['push_address']))
48             push_sklearn_model(pipeline, inputDf, api=config['push_address'], name=MODEL_NAME, extra_deps=EXTRA_DEPS)
49
50         if 'dump_model' in config and config['dump_model']:
51             from cognita_client.wrap.dump import dump_sklearn_model # dump_skkeras_hybrid_model (keras?)
52             print("Dumping new model to '{:}'...".format(config['dump_model']))
53             dump_sklearn_model(pipeline, inputDf, config['dump_model'], name=MODEL_NAME, extra_deps=EXTRA_DEPS)
54
55     else:
56         if not config['dump_model'] or not os.path.exists(config['dump_model']):
57             print("Attempting to predict from a dumped model, but model not found.".format(config['dump_model']))
58             sys.exit(-1)
59         if not os.path.exists(config['input']):
60             print("Predictino requested but target input '{:}' was not found, please check input arguments.".format(config['input']))
61             sys.exit(-1)
62
63         print("Attempting predict/transform on input sample...")
64         from cognita_client.wrap.load import load_model
65         model = load_model(config['dump_model'])
66         inputDf = FaceDetectTransform.generate_in_df(config['input'])
67         dfPred = model.transform.from_native(inputDf).as_native()
68         dfPred = FaceDetectTransform.suppress_image(dfPred)
69
70         if config['predict_path']:
71             print("Writing prediction to file '{:}'...".format(config['predict_path']))
72             dfPred.to_csv(config['predict_path'], sep=",", index=False)
73
74         if dfPred is not None:
75             print("Predictions:\n{:}".format(dfPred))
76
77 if __name__ == '__main__':
78     main()