From 2fb5ce85c0734656aa3b364562a177da847d1514 Mon Sep 17 00:00:00 2001 From: migtoqu <miguel.toquero@alumnos.uva.es> Date: Thu, 15 Jul 2021 08:17:17 +0000 Subject: [PATCH] Subir nuevo archivo --- Aplicacion/app.py | 141 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 Aplicacion/app.py diff --git a/Aplicacion/app.py b/Aplicacion/app.py new file mode 100644 index 0000000..6901fe8 --- /dev/null +++ b/Aplicacion/app.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +#Flask +from flask import Flask, render_template, request, json, session, send_file + +#Gunicorn. +import multiprocessing +import gunicorn.app.base + +#generacion de clave aleatoria +import random +import string + +#Otros +import os #para borrar las imagenes despues de usarlas +import traceback #Para poder impirmir el error. +from werkzeug.utils import secure_filename #Para leer nombres de ficheros +import shutil +import threading + +#modelo de prediccion +from predict import * + + +app = Flask(__name__) +#generacion de clave aleatoria con 10 simbolos +app.config['SECRET_KEY']= ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(10)) +lock = threading.Lock() #Creamos el candado para los hilos + + +modelo = None +clasePred = None +im = None + + +@app.route("/", methods=['POST','GET']) #Indicamos el tipo de forma para las peticiones, get o post. +def controlador(): + try: + print("Peticion recibida") + if request.method=='POST': + if 'tipo' in request.form: + _tipo=request.form['tipo'] + else: + _tipo=None + else: + _tipo=request.args.get('tipo') + if _tipo=="imagen": + return procesarImagen(request) + elif _tipo=="resultado": + return mostrarResultado() + else: + #Para borrar las imagenes que estaban almacenadas de otras predicciones + dir1="./static/ImagenesGuardadas" + dir2="./static/GRADCAM_img" + for f in os.listdir(dir1): + os.remove(os.path.join(dir1,f)) + for f in os.listdir(dir2): + os.remove(os.path.join(dir2,f)) + return render_template("principal.html") + except Exception as e: + traceback.print_exc(e) + return e + + +def procesarImagen( request): + + global modelo + global clasePred + global im + + if modelo is None: + modelo = ModeloCovid() + + f = request.files['miFichero'] #Se obtiene el fichero + setImagen(secure_filename(f.filename)) #secure_filename te lo guarda con el mismo nombre de fichero + f.save('./static/ImagenesGuardadas/'+getImagen()) #se guarda + f.close #se cierra el fichero + + lock.acquire() #bloqueamos el hilo + #Se obtienen la prediccion(indice 0) y las probalidades(por si se necesitan) en output + output = modelo.predict("./static/ImagenesGuardadas/"+getImagen()) + setPred(output[0]) + #se obtiene el heatmap y la imagen y se guarda la imagen + heatmap, grad_image = modelo.gradCam("./static/ImagenesGuardadas/"+getImagen(), + cam_path="./static/GRADCAM_img/cam"+getImagen()) + lock.release() #desbloqueamos el hilo + return json.dumps({}), 200 #peticion de respuesta al servidor + +def mostrarResultado(): + return render_template("resultado.html", clase=getPred(), foto="./static/GRADCAM_img/cam"+getImagen()) + +######## modelo de datos ##################### +def getImagen(): + global im + return im + +def setImagen(imagen): + global im + im = imagen + +def getPred(): + global clasePred + return clasePred + +def setPred(pred): + global clasePred + clasePred = pred + +##################### Gunicorn ##################### + +def number_of_workers(): + return (multiprocessing.cpu_count() * 2) + 1 + + +class StandaloneApplication(gunicorn.app.base.BaseApplication): + + def __init__(self, app, options=None): + self.options = options or {} + self.application = app + super(StandaloneApplication, self).__init__() + + def load_config(self): + config = dict([(key, value) for key, value in self.options.items() + if key in self.cfg.settings and value is not None]) + #for key, value in iteritems(config): + for key, value in config.items(): + self.cfg.set(key.lower(), value) + + def load(self): + return self.application +########################################################### + +if __name__ == '__main__': + options = { + 'bind': '%s:%s' % ('0.0.0.0', '5000'), + 'workers': 1, + 'threads': number_of_workers(), + 'reload': True + } + StandaloneApplication(app, options).run() + -- GitLab