Spaces:
Running
Running
import os | |
import uuid | |
import flask | |
import urllib | |
from PIL import Image | |
from tensorflow.keras.models import load_model | |
from flask import Flask , render_template , request , send_file | |
from tensorflow.keras.preprocessing.image import load_img , img_to_array | |
app = Flask(__name__) | |
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) | |
model = load_model(os.path.join(BASE_DIR , 'model.hdf5')) | |
ALLOWED_EXT = set(['jpg' , 'jpeg' , 'png' , 'jfif']) | |
def allowed_file(filename): | |
return '.' in filename and \ | |
filename.rsplit('.', 1)[1] in ALLOWED_EXT | |
classes = ['airplane' ,'automobile', 'bird' , 'cat' , 'deer' ,'dog' ,'frog', 'horse' ,'ship' ,'truck'] | |
def predict(filename , model): | |
img = load_img(filename , target_size = (32 , 32)) | |
img = img_to_array(img) | |
img = img.reshape(1 , 32 ,32 ,3) | |
img = img.astype('float32') | |
img = img/255.0 | |
result = model.predict(img) | |
dict_result = {} | |
for i in range(10): | |
dict_result[result[0][i]] = classes[i] | |
res = result[0] | |
res.sort() | |
res = res[::-1] | |
prob = res[:3] | |
prob_result = [] | |
class_result = [] | |
for i in range(3): | |
prob_result.append((prob[i]*100).round(2)) | |
class_result.append(dict_result[prob[i]]) | |
return class_result , prob_result | |
def home(): | |
return render_template("index.html") | |
def success(): | |
error = '' | |
target_img = os.path.join(os.getcwd()) | |
if request.method == 'POST': | |
if(request.form): | |
link = request.form.get('link') | |
try : | |
resource = urllib.request.urlopen(link) | |
unique_filename = str(uuid.uuid4()) | |
filename = unique_filename+".jpg" | |
img_path = os.path.join(target_img , filename) | |
output = open(img_path , "wb") | |
output.write(resource.read()) | |
output.close() | |
img = filename | |
class_result , prob_result = predict(img_path , model) | |
predictions = { | |
"class1":class_result[0], | |
"class2":class_result[1], | |
"class3":class_result[2], | |
"prob1": prob_result[0], | |
"prob2": prob_result[1], | |
"prob3": prob_result[2], | |
} | |
except Exception as e : | |
print(str(e)) | |
error = 'This image from this site is not accesible or inappropriate input' | |
if(len(error) == 0): | |
return render_template('success.html' , img = img , predictions = predictions) | |
else: | |
return render_template('index.html' , error = error) | |
elif (request.files): | |
file = request.files['file'] | |
if file and allowed_file(file.filename): | |
file.save(os.path.join(target_img , file.filename)) | |
img_path = os.path.join(target_img , file.filename) | |
img = file.filename | |
class_result , prob_result = predict(img_path , model) | |
predictions = { | |
"class1":class_result[0], | |
"class2":class_result[1], | |
"class3":class_result[2], | |
"prob1": prob_result[0], | |
"prob2": prob_result[1], | |
"prob3": prob_result[2], | |
} | |
else: | |
error = "Please upload images of jpg , jpeg and png extension only" | |
if(len(error) == 0): | |
return render_template('success.html' , img = img , predictions = predictions) | |
else: | |
return render_template('index.html' , error = error) | |
else: | |
return render_template('index.html') | |
if __name__ == "__main__": | |
app.run(debug = True) | |