|
import os |
|
from flask import Flask, flash, request, redirect, url_for, render_template |
|
from werkzeug.utils import secure_filename |
|
import math |
|
|
|
|
|
|
|
|
|
arquivo_modelo = 'Model_2021_CNN_Xception-V09.hdf5' |
|
|
|
|
|
UPLOAD_FOLDER = '/tmp' |
|
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} |
|
|
|
def escolhe_lesao_aleatoria(): |
|
import glob |
|
from random import seed |
|
from random import randint |
|
|
|
arquivos = list(glob.glob("static/tmp/*.*")) |
|
arquivos = [ arquivo.split('/')[2] for arquivo in arquivos] |
|
|
|
lesao = randint(0,len(arquivos)-1) |
|
print(lesao) |
|
return arquivos[lesao] |
|
|
|
|
|
def prever_doencas_de_pele(model, file): |
|
import numpy as np |
|
from PIL import Image |
|
import pandas as pd |
|
|
|
folder = 'static/tmp/' |
|
|
|
dict_idx_doenca = {0: ['Actinic keratoses', 'Queratose Actínica'], |
|
1: ['Basal cell carcinoma', 'Carcinoma de Células Basais' ], |
|
2: ['Benign keratosis-like lesions ', 'Queratoses Benignas'], |
|
3: ['Dermatofibroma', 'Dermatofibroma'], |
|
4: ['Melanocytic nevi', 'Nevo Melanócito (Sinal)'], |
|
5: [ 'Melanoma', 'Melanoma'], |
|
6: ['Vascular lesions', 'Lesões de Pele Vasculares'], |
|
7: ['Acne', 'Acne'], |
|
8: ['AlopeciaAreata', 'AlopeciaAreata']} |
|
|
|
indices = [] |
|
doencas_en = [] |
|
doencas_pt = [] |
|
for idx, doenca in (dict_idx_doenca.items()): |
|
indices.append(idx) |
|
doencas_en.append(doenca[0]) |
|
doencas_pt.append(doenca[1]) |
|
|
|
media_scale_image = 158.4125188825441 |
|
std_scale_image = 47.42283803971779 |
|
|
|
|
|
x = folder + file |
|
|
|
|
|
SIZE = 299 |
|
x_pred = np.asarray(Image.open(x).resize((SIZE,SIZE))) |
|
x_pred = x_pred.reshape(1, SIZE, SIZE, 3) |
|
x_pred = (x_pred - media_scale_image) / std_scale_image |
|
|
|
pred = np.argmax(model.predict(x_pred), axis=-1) |
|
probs = model.predict(x_pred)[0] |
|
|
|
probs = np.array(probs) * 100 |
|
df = pd.DataFrame() |
|
df['probs'] = probs |
|
print('probs:', probs ) |
|
df['probs'] = df['probs'].apply(lambda x : int(x)) |
|
df['doenca_en'] = doencas_en |
|
df['doenca_pt'] = doencas_pt |
|
df['idx'] = indices |
|
df_ordenado = df.sort_values(by=['probs'], ascending=False).reset_index() |
|
df_ordenado = df_ordenado[ df_ordenado.probs > 0] |
|
|
|
numero_probilidades_maior_que_zero = len(df_ordenado) |
|
if numero_probilidades_maior_que_zero > 3: |
|
numero_probilidades_maior_que_zero = 3 |
|
probs = df_ordenado['probs'][:numero_probilidades_maior_que_zero] |
|
doencas = df_ordenado['doenca_pt'][:numero_probilidades_maior_que_zero] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return doencas, probs |
|
|
|
|
|
def allowed_file(filename): |
|
return '.' in filename and \ |
|
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS |
|
|
|
|
|
app = Flask(__name__, template_folder='templates') |
|
app.secret_key = "super secret key" |
|
|
|
app.config['UPLOAD_FOLDER'] = 'static/tmp' |
|
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 |
|
|
|
|
|
probs = [] |
|
classesprev = [] |
|
model = None |
|
|
|
app.add_url_rule('/static', view_func=app.send_static_file) |
|
@app.route('/', methods=['GET', 'POST']) |
|
def upload_file(): |
|
|
|
global model |
|
import numpy as np |
|
import tensorflow as tf |
|
|
|
|
|
|
|
|
|
if model is None: |
|
print('carregando o modelo...') |
|
file_model = arquivo_modelo |
|
|
|
from tensorflow import keras |
|
|
|
model = tf.keras.models.load_model(file_model, |
|
custom_objects={'Functional':tf.keras.models.Model}) |
|
|
|
|
|
|
|
|
|
|
|
print('modelo carregado.') |
|
|
|
|
|
UPLOAD_FOLDER = '/tmp' |
|
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} |
|
|
|
if request.method == 'POST': |
|
print('request == POST') |
|
d = request.form.to_dict(flat=False) |
|
print(d) |
|
|
|
if "photo" in d.keys() and "prever_lesao" in d.keys() and d['photo'][0] != '': |
|
file = request.form['photo'] |
|
doencas, probs = prever_doencas_de_pele(model, file) |
|
|
|
return render_template("index.html", file='tmp/'+file, probs=probs, classesprev=doencas) |
|
|
|
else: |
|
file = escolhe_lesao_aleatoria() |
|
print(file) |
|
doencas, probs = prever_doencas_de_pele(model, file) |
|
|
|
return render_template("index.html", file='tmp/'+file, probs=probs, classesprev=doencas) |
|
|
|
|
|
else: |
|
print("elsseeeeee") |
|
file = escolhe_lesao_aleatoria() |
|
doencas, probs = prever_doencas_de_pele(model, file) |
|
|
|
return render_template("index.html", file='tmp/'+file, probs=probs, classesprev=doencas) |
|
|
|
@app.route('/about/') |
|
def about(): |
|
return render_template('About.html') |
|
|
|
if __name__ == "__main__": |
|
|
|
app.config['SESSION_TYPE'] = 'filesystem' |
|
port = int(os.environ.get("PORT", 5000)) |
|
app.debug = True |
|
app.run(host='0.0.0.0', port=port) |
|
|