-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweb.py
67 lines (51 loc) · 1.67 KB
/
web.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from PIL import Image
import numpy as np
import settings
import helpers
import flask
import redis
import json
import uuid
import time
import cv2
import io
app = flask.Flask(__name__)
db = redis.StrictRedis(host=settings.REDIS_HOST,
port=settings.REDIS_PORT, db=settings.REDIS_DB)
def prepare_image(image, target):
if image.mode != "RGB":
image = image.convert("RGB")
image = image.resize(target)
image = np.array(image)
blob = cv2.dnn.blobFromImage(image, 0.007843, (300,300), 127.5)
return blob
@app.route("/")
def home():
return ("Hi")
@app.route("/predict", methods=["POST"])
def predict():
data = {"success": False}
if flask.request.method == "POST":
if flask.request.files.get("image"):
image = flask.request.files["image"].read()
image = Image.open(io.BytesIO(image))
image = prepare_image(image, (settings.IMAGE_WIDTH, settings.IMAGE_HEIGHT))
image = image.copy(order="C")
k = str(uuid.uuid4())
d = {"id": k, "image": helpers.base64_encode_image(image)}
db.rpush(settings.IMAGE_QUEUE, json.dumps(d))
while True:
output = db.get(k)
if output is not None:
output = output.decode("utf-8")
data["predictions"] = json.loads(output)
db.delete(k)
break
time.sleep(settings.CLIENT_SLEEP)
data["success"] = True
else:
flask.jsonify({'error': 'no file'}), 400
return flask.jsonify(data)
if __name__ == "__main__":
print("[INFO] Starting web service")
app.run()