10 from flask import current_app, make_response
15 from acumos.wrapped import load_model
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"])
29 def transform(mime_type, image_binary):
31 time_start = time.clock()
32 image_read = image_binary.stream.read()
33 X = generate_image_df(bin_stream=image_read)
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_pb_msg(pred_out.as_pb_msg()).as_wrapped()
42 time_stop = time.clock()-time_start
45 if pred_out is not None:
46 pred = pd.DataFrame(list(zip(*pred_out)), columns=pred_out._fields)
47 pred['image_binary'] = pred['image_binary'].apply(lambda x: base64.b64encode(x).decode())
48 retStr = json.dumps(pred.to_dict(orient='records'), indent=4)
51 resp = make_response((retStr, 200, {}))
52 # allow 'localhost' from 'file' or other;
53 # NOTE: DO NOT USE IN PRODUCTION!!!
54 resp.headers['Access-Control-Allow-Origin'] = '*'
55 print(retStr[:min(200, len(retStr))])
60 if __name__ == '__main__':
61 parser = argparse.ArgumentParser()
62 parser.add_argument('-p', "--port", type=int, default=8884, help='port to launch the simple web server')
63 parser.add_argument('-d', "--modeldir_detect", type=str, default='../model_detect', help='model directory for detection')
64 parser.add_argument('-a', "--modeldir_analyze", type=str, default='../model_pix', help='model directory for detection')
65 pargs = parser.parse_args()
67 print("Configuring local application... {:}".format(__name__))
68 logging.basicConfig(level=logging.INFO)
69 app = connexion.App(__name__)
70 app.add_api('swagger.yaml')
72 # curl -F image_binary=@test.jpg -F mime_type="image/jpeg" "http://localhost:8885/transform"
74 app.app.model_detect = None
75 if pargs.modeldir_detect:
76 if not os.path.exists(pargs.modeldir_detect):
77 print("Failed loading of detect model '{:}' even though it was specified...".format(pargs.modeldir_detect))
79 print("Loading detect model... {:}".format(pargs.modeldir_detect))
80 app.app.model_detect = load_model(pargs.modeldir_detect)
82 app.app.model_proc = None
83 if pargs.modeldir_analyze:
84 if not os.path.exists(pargs.modeldir_analyze):
85 print("Failed loading of processing model '{:}' even though it was specified...".format(
86 pargs.modeldir_analyze))
88 print("Loading processing model... {:}".format(pargs.modeldir_analyze))
89 app.app.model_proc = load_model(pargs.modeldir_analyze)
91 # run our standalone gevent server
92 app.run(port=pargs.port) #, server='gevent')