-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathapp.py
More file actions
119 lines (99 loc) · 4.03 KB
/
app.py
File metadata and controls
119 lines (99 loc) · 4.03 KB
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
import os
import cv2
import glob
from flask import Flask, render_template, request,redirect, url_for
from gevent.wsgi import WSGIServer
from werkzeug import secure_filename
import pandas as pd
import wgetter
from keras.models import load_model
from sklearn.externals import joblib
from flask import jsonify
UPLOAD_FOLDER = 'user_uploads/'
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])
def check_or_make_folder(foldername):
if not os.path.exists(foldername):
os.mkdir(foldername)
check_or_make_folder(UPLOAD_FOLDER)
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
model = load_model('saved_models/current_model.h5') #Change to model being used
mapper = joblib.load('saved_models/current_model_mapping.pkl')
mapper = {v:k for k,v in mapper.items()}
EXTRA_DETAILS_LOCATION = "disease_extra_details.csv"
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route("/")
def main():
return render_template('home.html')
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
pic = preprocess_single_image(filepath)
pred_class = model.predict_classes(pic)[0]
pred_class_name = get_pred_class_name(pred_class)
pred_class_extra_details_dic = get_pred_class_extra_details(pred_class_name)
pred_class_extra_details_dic["Disease"] = pred_class_extra_details_dic["Disease"].replace("%20"," ")
print("Predicted class is {}".format(pred_class_name))
joblib.dump(pred_class_extra_details_dic,'diseaseinfo_for_messenger.pkl') #super hacky
joblib.dump(pred_class_extra_details_dic,'diseaseinfo.pkl') #super hacy
print(pred_class_extra_details_dic)
if request.method == 'POST':
return render_template('display.html',dic=pred_class_extra_details_dic)
#hack for twitter
return jsonify(pred_class_extra_details_dic)
# display_results(pred_class_extra_details_dic)
#return ''
return "upload rejected"
@app.route('/api/<path:path>', methods=['GET', 'POST'])
def messenger(path):
#path2 = request.headers["Auth_Token"]
## Holy shit this is the hackiest thing ive done so far
url = request.url
image_url = url[url.find("api/")+4:]
# end hacky.
folder_name = "messengerpics"
check_or_make_folder(folder_name)
wgetter.download(image_url,outdir=folder_name)
file = glob.glob(folder_name+'/' + '*.jpg')[0]
pic = preprocess_single_image(file)
pred_class = model.predict_classes(pic)[0]
pred_class_name = get_pred_class_name(pred_class)
pred_class_extra_details_dic = get_pred_class_extra_details(pred_class_name)
pred_class_extra_details_dic["class"] = pred_class_name
return jsonify(pred_class_extra_details_dic)
@app.route("/display")
def test():
dic = joblib.load("diseaseinfo.pkl")
return render_template('display.html',dic=dic)
# @app.route("/display2")
# def display_results(dic):
# return render_template('display.html',dic=dic)
def get_pred_class_extra_details(pred_class_name):
df = load_and_format_extra_details_csv()
df = df[df["Disease"] == pred_class_name]
return df.to_dict(orient='records')[0]
def get_pred_class_name(pred_class_number):
global mapper
return mapper[pred_class_number]
def load_and_format_extra_details_csv():
global EXTRA_DETAILS_LOCATION
df = pd.read_csv(EXTRA_DETAILS_LOCATION)
df["Disease"] = [x.replace(' ','%20') for x in df["Disease"]]
return df
def preprocess_single_image(filepath):
pic = cv2.imread(filepath)
pic = cv2.resize(pic, (120,120))
pic = pic.astype('float32')
pic /= 255
pic = pic.reshape(-1,120,120,3)
return pic
if __name__ == "__main__":
server = WSGIServer(("",5000), app)
print('Server is up')
server.serve_forever()