Spaces:
Running
Running
File size: 6,182 Bytes
61172ff c458088 61172ff 8a1e479 55c3ec2 61172ff 6a7ecb7 61172ff f6f244b d0f65b9 c4cf1cf 61172ff 3f7c323 bf4858a 3f7c323 23518e7 3f7c323 d0f65b9 3f7c323 b6152a3 3f7c323 92f82c8 3f7c323 b6152a3 3f7c323 23518e7 3f7c323 f664cd8 3f7c323 f664cd8 c4cf1cf 3f7c323 e07bf57 3f7c323 f664cd8 3f7c323 3148aff f664cd8 80eca14 8a1e479 f664cd8 3148aff dc41bf1 f664cd8 79efe44 dc41bf1 8a1e479 3f7c323 4aaeb5c 3f7c323 8a1e479 3f7c323 dc41bf1 3f7c323 49b9b87 8a1e479 49b9b87 8a1e479 49b9b87 8a1e479 3f7c323 d0f65b9 f664cd8 8a1e479 49b9b87 8a1e479 49b9b87 3f7c323 5029012 3f7c323 f9bd8a4 3f7c323 c4cf1cf f6f244b 5ba58ac 3f7c323 75d3600 7d7fb98 f9bd8a4 36bf530 3f7c323 77ce902 |
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 137 |
import streamlit as st
import tensorflow as tf
from tensorflow.keras.models import load_model
import os
import cv2
import numpy as np
st.set_page_config(
page_title = 'Patacotrón',
layout = 'wide',
menu_items = {
"About" : 'Proyecto ideado para la investigación de "Clasificación de imágenes de una sola clase con algortimos de Inteligencia Artificial".',
"Report a Bug" : 'https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link'
}
)
st.sidebar.write("contact@patacotron.tech")
cnn, autoencoder, svm, iforest, gan, vit = st.tabs(["CNN", "Autoencoder", "OC-SVM", 'iForest', 'GAN', 'ViT'])
with cnn:
col_a, col_b, = st.columns(2)
with col_a:
st.title("Redes neuronales convolucionales")
st.caption("Los modelos no están en orden de eficacia, sino en orden de creación.")
current_dir = os.getcwd()
root_dir = os.path.dirname(current_dir)
# Join the path to the models folder
DIR = os.path.join(current_dir, "models")
models = os.listdir(DIR)
model_dict = dict()
for model in models: #preprocessing of strings so the name is readable in the multiselect bar
model_name = model.split(DIR)
model_name = str(model.split('.h5')[0])
model_dir = os.path.join(DIR, model)
model_dict[model_name] = model_dir
ultraversions = ['ptctrn_v1.4', 'ptctrn_v1.5', 'ptctrn_v1.6', 'ptctrn_v1.12']
ultra_button = st.checkbox('Ultra-Patacotrón (mejores resultados)')
ultra_flag = False
if ultra_button:
ultra_flag = True
weight_list = [1, 1.4, 1.1, 7]
# Create a dropdown menu to select the model
model_choice = st.multiselect("Seleccione uno o varios modelos de clasificación", model_dict.keys())
weight_list = []
threshold = st.slider('¿Cuál va a ser el límite donde se considere patacón? (el valor recomendado para Ultra-Patacotrón es 60%, para los demás, 75%-80%)', 0, 100, 75)
selected_models = []
@tf.function
def tf_predict(model_list, weights, img): #faster, but for few formats
y_gorrito = 0
raw_img = tf.image.decode_image(img, channels=3)
img = tf.image.resize(raw_img,(IMAGE_WIDTH, IMAGE_HEIGHT))
for model, weight in zip(model_list, weights):
y_gorrito += tf.cast(model(tf.expand_dims(img/255., 0)), dtype=tf.float32)*weight
return [y_gorrito / sum(weights), raw_img.numpy()]
def basic_predict(model_list, weights, img): #for non-supported formats
y_gorrito = 0
raw_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (IMAGE_WIDTH, IMAGE_HEIGHT))
for model, weight in zip(model_list, weights):
y_gorrito += tf.cast(model(tf.expand_dims(img/255., 0)), dtype=tf.float32)*weight
return [y_gorrito / sum(weights), raw_img]
def preprocess(file_uploader): #makes the uploaded image readable
img = np.frombuffer(uploaded_file.read(), np.uint8)
img = cv2.imdecode(img, cv2.IMREAD_COLOR)
return img
# Set the image dimensions
IMAGE_WIDTH = IMAGE_HEIGHT = 224
executed = False
with col_b:
uploaded_file = st.file_uploader(label = '',type= ['jpg','png', 'jpeg', 'jfif', 'webp', 'heic'])
if st.button('¿Hay un patacón en la imagen?'):
if len(selected_models) > 0 and ultra_flag:
st.write('Debe elegir un solo método: Ultra-Patacotrón o selección múltiple.')
elif uploaded_file is not None:
img = preprocess(uploaded_file)
if ultra_flag:
with st.spinner('Cargando ultra-predicción...'):
if not executed:
ultraptctrn = [load_model(model_dict[model]) for model in ultraversions]
executed = True
final_weights = weight_list if len(weight_list) >= 1 else [1 for i in range(len(ultraptctrn))]
try:
y_gorrito, raw_img = tf_predict(ultraptctrn, final_weights, img)
except:
y_gorrito, raw_img = basic_predict(ultraptctrn, final_weights, img)
else:
with st.spinner('Cargando predicción...'):
selected_models = [load_model(model_dict[model]) for model in model_choice if model not in selected_models]
final_weights = weight_list if len(weight_list) >= 1 else [1 for i in range(len(selected_models))]
try:
y_gorrito, raw_img = tf_predict(selected_models, final_weights, img)
except:
y_gorrito, raw_img = basic_predict(selected_models, final_weights, img)
if round(float(y_gorrito*100)) >= threshold:
st.success("¡Patacón Detectado!")
else:
st.error("No se considera que haya un patacón en la imagen")
st.caption(f'La probabilidad de que la imagen tenga un patacón es del: {round(float(y_gorrito * 100), 2)}%')
st.caption('Si los resultados no fueron los esperados, por favor, [haz click aquí](https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link)')
st.image(raw_img)
else:
st.write('Revisa haber seleccionado los modelos y la imagen correctamente.')
with autoencoder:
st.write('Próximamente')
with svm:
st.write('Próximamente')
with iforest:
st.write('Próximamente')
with gan:
st.write('Próximamente')
with vit:
st.write('Próximamente') |