-
Notifications
You must be signed in to change notification settings - Fork 1
/
app.py
154 lines (138 loc) · 6.1 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
from flask import Flask, render_template, request, jsonify
from keras.utils import load_img, img_to_array
from keras.models import load_model
import numpy as np
import os
# Load trained model
model = load_model('models/generalModel.h5')
benign = load_model('models/benignModel.h5')
cancerous = load_model('models/cancerousModel.h5')
vascular = load_model('models/vascModel.h5')
def preprocess_image(img_path):
img = load_img(img_path, target_size=(224, 224))
img_array = img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = img_array / 255.0
return img_array
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
@app.route('/')
def index():
return render_template('index.html')
@app.route("/diseaseTypes", methods=["GET", "POST"])
def diseaseTypes():
return render_template('diseaseTypes.html')
@app.route("/findDermatologist", methods=["GET", "POST"])
def findDermatologist():
return render_template('findDermatologist.html')
@app.route("/home", methods=["GET", "POST"])
def home():
return render_template('index.html')
@app.route('/predict', methods=['POST'])
def predict():
# Get the uploaded image file
image = request.files['image']
image_path = os.path.join(app.config['UPLOAD_FOLDER'], image.filename)
print(image_path)
image.save(image_path)
# preprocess the image and make a prediction
genPrediction = model.predict(preprocess_image(image_path))
# Get the predicted disease type and probability
category = np.argmax(genPrediction)
genProbability = float(genPrediction[0][category])
# Get the predicted disease type as a string
if(category == 0):
#run benign model
benignPrediction = benign.predict(preprocess_image(image_path))
disease = np.argmax(benignPrediction)
probability = float(benignPrediction[0][disease])
elif(category == 1):
#run cancerous model
cancerousPrediction = cancerous.predict(preprocess_image(image_path))
disease = np.argmax(cancerousPrediction)
probability = float(cancerousPrediction[0][disease])
else:
#run vascular model
vascularPrediction = vascular.predict(preprocess_image(image_path))
disease = np.argmax(vascularPrediction)
probability = float(vascularPrediction[0][disease])
if(genProbability < 0.6):
#run the model for the next highest category if the probability is less than 60%
if(category == 0):
#run next highest category from genPrediction
if(genPrediction[0][1] > genPrediction[0][2]):
#run cancerous model
category2 = 1
c2_prob = float(genPrediction[0][1])
cancerousPrediction = cancerous.predict(preprocess_image(image_path))
disease_2 = np.argmax(cancerousPrediction)
d2_prob = float(cancerousPrediction[0][disease_2])
else:
#run vascular model
category2 = 2
c2_prob = float(genPrediction[0][2])
vascularPrediction = vascular.predict(preprocess_image(image_path))
disease_2 = np.argmax(vascularPrediction)
d2_prob = float(vascularPrediction[0][disease_2])
elif(category == 1):
#run next highest category from genPrediction
if(genPrediction[0][0] > genPrediction[0][2]):
#run benign model
category2 = 0
c2_prob = float(genPrediction[0][0])
benignPrediction = benign.predict(preprocess_image(image_path))
disease_2 = np.argmax(benignPrediction)
d2_prob = float(benignPrediction[0][disease_2])
else:
#run vascular model
category2 = 2
c2_prob = float(genPrediction[0][2])
vascularPrediction = vascular.predict(preprocess_image(image_path))
disease_2 = np.argmax(vascularPrediction)
d2_prob = float(vascularPrediction[0][disease_2])
else:
#run next highest category from genPrediction
if(genPrediction[0][0] > genPrediction[0][1]):
#run benign model
category2 = 0
c2_prob = float(genPrediction[0][0])
benignPrediction = benign.predict(preprocess_image(image_path))
disease_2 = np.argmax(benignPrediction)
d2_prob = float(benignPrediction[0][disease_2])
else:
#run cancerous model
category2 = 1
c2_prob = float(genPrediction[0][1])
cancerousPrediction = cancerous.predict(preprocess_image(image_path))
disease_2 = np.argmax(cancerousPrediction)
d2_prob = float(cancerousPrediction[0][disease_2])
else:
#if the probability is greater than 60%, set the second category to the same as the first and choose the next highest disease type
category2 = category
c2_prob = genProbability
#find the next highest disease in the array of the original prediciton
if(category == 0):
#find second highest max in benignPrediction
disease_2 = np.argpartition(benignPrediction[0], -2)[-2]
d2_prob = float(benignPrediction[0][disease_2])
elif(category == 1):
#find second highest max in cancerousPrediction
disease_2 = np.argpartition(cancerousPrediction[0], -2)[-2]
d2_prob = float(cancerousPrediction[0][disease_2])
else:
#find second highest max in vascularPrediction
disease_2 = np.argpartition(vascularPrediction[0], -2)[-2]
d2_prob = float(vascularPrediction[0][disease_2])
# Render the result template with the predicted disease type and probability
return jsonify({
'category': int(category),
'c1_prob': genProbability,
'disease': int(disease),
'd1_prob': probability,
'category2': int(category2),
'c2_prob': c2_prob,
'disease2': int(disease_2),
'd2_prob': d2_prob
})
if __name__ == '__main__':
app.run()