Use "face privacy" in headings
[face-privacy-filter.git] / testing / app.py
1 # -*- coding: utf-8 -*-
2 # ===============LICENSE_START=======================================================
3 # Acumos Apache-2.0
4 # ===================================================================================
5 # Copyright (C) 2017-2018 AT&T Intellectual Property & Tech Mahindra. All rights reserved.
6 # ===================================================================================
7 # This Acumos software file is distributed by AT&T and Tech Mahindra
8 # under the Apache License, Version 2.0 (the "License");
9 # you may not use this file except in compliance with the License.
10 # You may obtain a copy of the License at
11 #
12 # http://www.apache.org/licenses/LICENSE-2.0
13 #
14 # This file is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 # ===============LICENSE_END=========================================================
19 import connexion
20 import logging
21
22 import argparse
23 import json
24 import time
25 import os
26
27 from flask import current_app, make_response
28
29 import pandas as pd
30 import numpy as np
31
32 from acumos.wrapped import load_model
33 import base64
34
35
36 def generate_image_df(path_image="", bin_stream=b""):
37     # munge stream and mimetype into input sample
38     if path_image and os.path.exists(path_image):
39         bin_stream = open(path_image, 'rb').read()
40     # bin_stream = base64.b64encode(bin_stream)
41     # if type(bin_stream) == bytes:
42     #     bin_stream = bin_stream.decode()
43     return pd.DataFrame([['image/jpeg', bin_stream]], columns=["mime_type", "image_binary"])
44
45
46 def transform(mime_type, image_binary):
47     app = current_app
48     time_start = time.clock()
49     image_read = image_binary.stream.read()
50     X = generate_image_df(bin_stream=image_read)
51
52     pred_out = None
53     if app.model_detect is not None:    # first translate to input type
54         type_in = app.model_detect.transform._input_type
55         detect_in = type_in(*tuple(col for col in X.values.T))
56         pred_out = app.model_detect.transform.from_wrapped(detect_in)
57     if app.model_proc is not None and pred_out is not None:  # then transform to output type
58         pred_out = app.model_proc.transform.from_pb_msg(pred_out.as_pb_msg()).as_wrapped()
59     time_stop = time.clock()-time_start
60
61     pred = None
62     if pred_out is not None:
63         pred = pd.DataFrame(list(zip(*pred_out)), columns=pred_out._fields)
64         pred['image_binary'] = pred['image_binary'].apply(lambda x: base64.b64encode(x).decode())
65     retStr = json.dumps(pred.to_dict(orient='records'), indent=4)
66
67     # formulate response
68     resp = make_response((retStr, 200, {}))
69     # allow 'localhost' from 'file' or other;
70     # NOTE: DO NOT USE IN PRODUCTION!!!
71     resp.headers['Access-Control-Allow-Origin'] = '*'
72     print(retStr[:min(200, len(retStr))])
73     # print(pred)
74     return resp
75
76
77 if __name__ == '__main__':
78     parser = argparse.ArgumentParser()
79     parser.add_argument('-p', "--port", type=int, default=8884, help='port to launch the simple web server')
80     parser.add_argument('-d', "--modeldir_detect", type=str, default='../model_detect', help='model directory for detection')
81     parser.add_argument('-a', "--modeldir_analyze", type=str, default='../model_pix', help='model directory for detection')
82     pargs = parser.parse_args()
83
84     print("Configuring local application... {:}".format(__name__))
85     logging.basicConfig(level=logging.INFO)
86     app = connexion.App(__name__)
87     app.add_api('swagger.yaml')
88     # example usage:
89     #     curl -F image_binary=@test.jpg -F mime_type="image/jpeg" "http://localhost:8885/transform"
90
91     app.app.model_detect = None
92     if pargs.modeldir_detect:
93         if not os.path.exists(pargs.modeldir_detect):
94             print("Failed loading of detect model '{:}' even though it was specified...".format(pargs.modeldir_detect))
95         else:
96             print("Loading detect model... {:}".format(pargs.modeldir_detect))
97             app.app.model_detect = load_model(pargs.modeldir_detect)
98
99     app.app.model_proc = None
100     if pargs.modeldir_analyze:
101         if not os.path.exists(pargs.modeldir_analyze):
102             print("Failed loading of processing model '{:}' even though it was specified...".format(
103                 pargs.modeldir_analyze))
104         else:
105             print("Loading processing model... {:}".format(pargs.modeldir_analyze))
106             app.app.model_proc = load_model(pargs.modeldir_analyze)
107
108     # run our standalone gevent server
109     app.run(port=pargs.port) #, server='gevent')