- add face pixelate model for train/evaluate
[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
9 from flask import Flask, request, current_app, make_response
10
11 import pandas as pd
12 import requests
13
14 from cognita_client.wrap.load import load_model
15 from face_privacy_filter.transform_detect import FaceDetectTransform
16
17
18 #def invoke_method(model_method):
19 def transform(mime_type, image_binary, rich_output=False):
20     app = current_app
21     time_start = time.clock()
22     image_read = image_binary.stream.read()
23     X = FaceDetectTransform.generate_in_df(bin_stream=image_read)
24
25     pred = app.model.transform.from_native(X).as_native()
26     time_stop = time.clock()
27
28     if rich_output:
29         # NOTE: This response is specially formatted for the webdemo included with this package.
30         #       Alternate forms of a response are viable for any other desired application.
31         retObj = {
32             'regions': pred.to_dict(orient="records"),
33             'clientfile': 'undefined',
34             'info': 'Processed',
35             'processingtime': (time_stop - time_start),
36             'serverfilename': '/dev/null',
37             'status': 'Succeeded'
38         }
39
40         # dump to pretty JSON
41         retStr = json.dumps({'results':retObj}, indent=4)
42     else:
43         retStr = json.dumps(pred.to_dict(orient='records'), indent=4)
44
45     # formulate response
46     resp = make_response((retStr, 200, { } ))
47     # allow 'localhost' from 'file' or other;
48     # NOTE: DO NOT USE IN PRODUCTION!!!
49     resp.headers['Access-Control-Allow-Origin'] = '*'
50     print(type(pred))
51     print(retStr[:min(200,len(retStr))])
52     #print(pred)
53     return resp
54
55
56 if __name__ == '__main__':
57     parser = argparse.ArgumentParser()
58     parser.add_argument("--port", type=int, default=8884, help='port to launch the simple web server')
59     parser.add_argument("--modeldir", type=str, default='../model', help='model directory to load dumped artifact')
60     pargs = parser.parse_args()
61
62     print("Configuring local application... {:}".format(__name__))
63     logging.basicConfig(level=logging.INFO)
64     app = connexion.App(__name__)
65     app.add_api('swagger.yaml')
66     # example usage:
67     #     curl -F image_binary=@test.jpg -F mime_type="image/jpeg" "http://localhost:8885/transform"
68
69     print("Loading model... {:}".format(pargs.modeldir))
70     app.app.model = load_model(pargs.modeldir)  # refers to ./model dir in pwd. generated by helper script also in this dir
71     # # dynamically add handlers depending on model capabilities
72     # for method_name, method in model.methods.items():
73     #     url = "/{}".format(method_name)
74     #     print("Adding route {}".format(url))
75     #     handler = partial(invoke_method, model_method=method)
76     #     app.add_url_rule(url, method_name, handler, methods=['POST'])
77
78     # run our standalone gevent server
79     app.run(port=pargs.port) #, server='gevent')