- fix i/o to match more consistent dataframe
[face-privacy-filter.git] / testing / app.py
1 #!/usr/bin/env python3
2 import connexion
3 import logging
4
5 import argparse
6 import json
7 import time
8 import os
9
10 from flask import current_app, make_response
11
12 import pandas as pd
13 import numpy as np
14
15 from acumos.wrapped import load_model
16 import base64
17
18
19 def generate_image_df(path_image="", bin_stream=b""):
20     # munge stream and mimetype into input sample
21     if path_image and os.path.exists(path_image):
22         bin_stream = open(path_image, 'rb').read()
23     # bin_stream = base64.b64encode(bin_stream)
24     # if type(bin_stream) == bytes:
25     #     bin_stream = bin_stream.decode()
26     return pd.DataFrame([['image/jpeg', bin_stream]], columns=["mime_type", "image_binary"])
27
28
29 def transform(mime_type, image_binary):
30     app = current_app
31     time_start = time.clock()
32     image_read = image_binary.stream.read()
33     X = generate_image_df(bin_stream=image_read)
34
35     pred_out = None
36     if app.model_detect is not None:    # first translate to input type
37         type_in = app.model_detect.transform._input_type
38         detect_in = type_in(*tuple(col for col in X.values.T))
39         pred_out = app.model_detect.transform.from_wrapped(detect_in)
40     if app.model_proc is not None and pred_out is not None:  # then transform to output type
41         pred_out = app.model_proc.transform.from_msg(pred_out.as_msg())
42     time_stop = time.clock()-time_start
43
44     pred = None
45     if pred_out is not None:
46         pred = pd.DataFrame(np.column_stack(pred_out), columns=pred_out._fields)
47     retStr = json.dumps(pred.to_dict(orient='records'), indent=4)
48
49     # formulate response
50     resp = make_response((retStr, 200, {}))
51     # allow 'localhost' from 'file' or other;
52     # NOTE: DO NOT USE IN PRODUCTION!!!
53     resp.headers['Access-Control-Allow-Origin'] = '*'
54     print(retStr[:min(200, len(retStr))])
55     # print(pred)
56     return resp
57
58
59 if __name__ == '__main__':
60     parser = argparse.ArgumentParser()
61     parser.add_argument('-p', "--port", type=int, default=8884, help='port to launch the simple web server')
62     parser.add_argument('-d', "--modeldir_detect", type=str, default='../model_detect', help='model directory for detection')
63     parser.add_argument('-a', "--modeldir_analyze", type=str, default='../model_pix', help='model directory for detection')
64     pargs = parser.parse_args()
65
66     print("Configuring local application... {:}".format(__name__))
67     logging.basicConfig(level=logging.INFO)
68     app = connexion.App(__name__)
69     app.add_api('swagger.yaml')
70     # example usage:
71     #     curl -F image_binary=@test.jpg -F mime_type="image/jpeg" "http://localhost:8885/transform"
72
73     app.app.model_detect = None
74     if pargs.modeldir_detect:
75         if not os.path.exists(pargs.modeldir_detect):
76             print("Failed loading of detect model '{:}' even though it was specified...".format(pargs.modeldir_detect))
77         else:
78             print("Loading detect model... {:}".format(pargs.modeldir_detect))
79             app.app.model_detect = load_model(pargs.modeldir_detect)
80
81     app.app.model_proc = None
82     if pargs.modeldir_analyze:
83         if not os.path.exists(pargs.modeldir_analyze):
84             print("Failed loading of processing model '{:}' even though it was specified...".format(
85                 pargs.modeldir_analyze))
86         else:
87             print("Loading processing model... {:}".format(pargs.modeldir_analyze))
88             app.app.model_proc = load_model(pargs.modeldir_analyze)
89
90     # run our standalone gevent server
91     app.run(port=pargs.port) #, server='gevent')