forked from amirsultan/fireDetection
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
136 lines (92 loc) · 3.88 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
import os
import sys
from datetime import datetime
import base64
# 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
from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
# Some utilites
import numpy as np
from util import base64_to_pil
# Declare a flask app
app = Flask(__name__)
# You can use pretrained model from Keras
# Check https://keras.io/applications/
#from keras.applications.mobilenet_v2 import MobileNetV2
#model = MobileNetV2(weights='imagenet')
print('Model loaded. Check http://127.0.0.1:5000/')
# Model saved with Keras model.save()
MODEL_PATH = 'models/unet_and_512weights.h5'
#MODEL_PATH = 'models/model1.h5'
# Load your own trained model
model = load_model(MODEL_PATH)
model._make_predict_function() # Necessary
print('Model loaded. Start serving...')
print('Model loaded. Check http://127.0.0.1:5000/')
def model_predict(img, model):
img = img.resize((512, 512))
# Preprocessing the image
x = image.img_to_array(img)
# x = np.true_divide(x, 255)
x = np.expand_dims(x, axis=0)
# Be careful how your trained model deals with the input
# otherwise, it won't make correct prediction!
x = preprocess_input(x, mode='tf')
preds = model.predict(x)
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)
# Make prediction
##preds = model_predict(img, model)
pred_proba = model_predict(img, model)
pred_class = np.argmax(pred_proba)
# Process your result for human
##pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability
pred_proba = "{:.3f}".format(np.argmax(pred_proba))
if pred_class < 0.9:
result = 'No_fire'
elif pred_class >= 0.9:
result = 'Fire'
sendEmail()
#Make threshold basis results coming along
result = result.replace('_', ' ').capitalize()
#sendEmail()
# Process your result for human
##pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability
##pred_class = decode_predictions(preds, top=1) # ImageNet Decode
##result = str(pred_class[0][0][1]) # Convert to string
##result = result.replace('_', ' ').capitalize()
# Serialize the result, you can add additional fields
this_image = f"./images/{datetime.now().timestamp()}.png"
################# ACTION: SAVE YOUR MASKED IMAGE HERE ##################
#Watever function you have change the `img.save`
img.save(this_image)
################# ACTION END ##################
image_file = open(this_image, "rb")
image = base64.b64encode(image_file.read())
image_string = str(image)[2:-1] #converting it into string and removing the 'b' and the quotes from the start and end
return jsonify(result=result, probability=pred_proba, image=image_string)
return None
def sendEmail():
yag = yagmail.SMTP('[email protected]', 'fire@1234')
# Alternatively, with a simple one-liner:
yagmail.SMTP('aifiredetectionsystem').send('[email protected]', 'Fire Detected', 'Fire Detected')
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()