-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathapp.py
111 lines (77 loc) · 2.81 KB
/
app.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import sys
# Flask
from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect
from werkzeug.utils import secure_filename
from gevent.pywsgi import WSGIServer
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras
# Preprocessing utilities
from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
# Model building
from keras import layers
from keras.optimizers import Adam
from keras.models import Sequential
from keras.applications import DenseNet121
from keras.callbacks import Callback, ModelCheckpoint
from PIL import Image
from models.model import build_model, preprocess_image
# Some utilites
import numpy as np
from utils import base64_to_pil
# Creating a new Flask Web application.
app = Flask(__name__)
# Model saved with Keras model.save()
MODEL_PATH = './models/pretrained/model.h5'
# Loading trained model
model = build_model()
model.load_weights(MODEL_PATH)
print('Model loaded. Start serving...')
def model_predict(img, model):
"""
Classify the severity of DR of image using pre-trained CNN model.
Keyword arguments:
img -- the retinal image to be classified
model -- the pretrained CNN model used for prediction
Predicted rating of severity of diabetic retinopathy on a scale of 0 to 4:
0 - No DR
1 - Mild
2 - Moderate
3 - Severe
4 - Proliferative DR
"""
## Preprocessing the image
x_val = np.empty((1, 224, 224, 3), dtype=np.uint8)
img = img.resize((224,) * 2, resample=Image.LANCZOS)
x_val[0, :, :, :] = img
preds = model.predict(x_val)
return preds
@app.route('/', methods=['GET'])
def index():
# Main page
return render_template('index.html')
@app.route('/predict', methods=['GET', 'POST'])
def predict():
if request.method == 'POST':
# Get the image from post request
img = base64_to_pil(request.json)
# Save the image to ./uploads
# img.save("./uploads/image.png")
# Make prediction on the image
preds = model_predict(img, model)
# Process result to find probability and class of prediction
pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability
pred_class = np.argmax(np.squeeze(preds))
diagnosis = ["No DR", "Mild", "Moderate", "Severe", "Proliferative DR"]
result = diagnosis[pred_class] # Convert to string
# Serialize the result
return jsonify(result=result, probability=pred_proba)
return None
if __name__ == '__main__':
# app.run(port=5002, threaded=False)
# Serve the app with gevent
http_server = WSGIServer(('0.0.0.0', 5000), app)
http_server.serve_forever()