From 507adafce3fa7b5e0c1afc666259418b183a4c6f Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Tue, 9 Jan 2024 14:46:42 +0100 Subject: [PATCH] Hecho --- pages/pred_imagen.py | 58 +++++++++++++------------- pages/pred_iris_csv.py | 92 +++++++++++++++++++++--------------------- pages/pred_iris_man.py | 64 ++++++++++++++--------------- requirements.txt | 8 ++-- streamlit_tutorial.py | 60 +++++++++++++-------------- train_iris.py | 28 ++++++------- utils.py | 58 +++++++++++++------------- 7 files changed, 184 insertions(+), 184 deletions(-) diff --git a/pages/pred_imagen.py b/pages/pred_imagen.py index b926b57..25acf9f 100644 --- a/pages/pred_imagen.py +++ b/pages/pred_imagen.py @@ -1,30 +1,30 @@ -import streamlit as st -from PIL import Image -import numpy as np -from utils import predict_imagen - -# Título de la aplicación -st.title('Predicción de imágenes') - -# Cargar la imagen -uploaded_file = st.file_uploader("Cargar imagen", type=["jpg", "jpeg", "png"]) - -# Si se carga una imagen -if uploaded_file is not None: - # Mostrar la imagen - st.write('**Vista Previa de la imagen cargada:**') - image = Image.open(uploaded_file).resize((32, 32)) - st.image(image, caption='Imagen cargada', use_column_width=True) - - # Convertir la imagen a una matriz de valores de píxeles - image = np.array(image) / 255.0 # Normalizar los valores de píxeles - - # Botón para realizar la predicción con las columnas seleccionadas - if st.button('Realizar Predicción de la categoría de la imagen'): - # Predecirla - pred = predict_imagen(image) - - # Mostrar los resultados de la predicción - st.success('Éxito al realizar la predicción!') - st.write('La categoría predicha para la imagen:') +import streamlit as st +from PIL import Image +import numpy as np +from utils import predict_imagen + +# Título de la aplicación +st.title('Predicción de imágenes') + +# Cargar la imagen +uploaded_file = st.file_uploader("Cargar imagen", type=["jpg", "jpeg", "png"]) + +# Si se carga una imagen +if uploaded_file is not None: + # Mostrar la imagen + st.write('**Vista Previa de la imagen cargada:**') + image = Image.open(uploaded_file).resize((32, 32)) + st.image(image, caption='Imagen cargada', use_column_width=True) + + # Convertir la imagen a una matriz de valores de píxeles + image = np.array(image) / 255.0 # Normalizar los valores de píxeles + + # Botón para realizar la predicción con las columnas seleccionadas + if st.button('Realizar Predicción de la categoría de la imagen'): + # Predecirla + pred = predict_imagen(image) + + # Mostrar los resultados de la predicción + st.success('Éxito al realizar la predicción!') + st.write('La categoría predicha para la imagen:') st.write(pred) \ No newline at end of file diff --git a/pages/pred_iris_csv.py b/pages/pred_iris_csv.py index 0dc156d..dad2d62 100644 --- a/pages/pred_iris_csv.py +++ b/pages/pred_iris_csv.py @@ -1,46 +1,46 @@ -import streamlit as st -import pandas as pd -from utils import predict_flores - -# Título de la aplicación -st.title('Predicción de flores desde un archivo CSV') -st.image('iris.jpg', caption='Imagen de iris', use_column_width=True) - -# Widget para cargar un archivo CSV -uploaded_file = st.file_uploader("Selecciona un archivo CSV", type=['csv']) - -# Si se carga un archivo -if uploaded_file is not None: - # Leer el archivo CSV en un DataFrame - df = pd.read_csv(uploaded_file) - - # Mostrar una vista previa de los primeros registros del DataFrame - st.write('**Vista Previa del DataFrame:**') - st.write(df.head()) - - # Sección para realizar la predicción - st.subheader('Realizar la predicción') - - # Widget para seleccionar las columnas a utilizar para la predicción - feature_cols = st.multiselect('Selecciona las columnas para la predicción', df.columns) - - # Botón para realizar la predicción con las columnas seleccionadas - if st.button('Realizar Predicción con CSV'): - # Realizar la predicción utilizando las columnas seleccionadas - predicted_values = predict_flores(df[feature_cols]) - - # Mostrar los resultados de la predicción - st.success('Éxito al realizar la predicción!') - st.write('Los resultados de la predicción son:') - st.write(predicted_values) - - # Convertir los resultados de la predicción a un DataFrame - predictions_df = pd.DataFrame(predicted_values, columns=['Predicciones']) - - # Widget para descargar el archivo CSV de las predicciones - st.subheader('Descargar Predicciones como CSV') - st.download_button(label='Descargar CSV', - data=predictions_df.to_csv(index=False), - file_name='predicciones.csv', - mime='text/csv') - +import streamlit as st +import pandas as pd +from utils import predict_flores + +# Título de la aplicación +st.title('Predicción de flores desde un archivo CSV') +st.image('Streamlit-Tutorial/iris.jpg', caption='Imagen de iris', use_column_width=True) + +# Widget para cargar un archivo CSV +uploaded_file = st.file_uploader("Selecciona un archivo CSV", type=['csv']) + +# Si se carga un archivo +if uploaded_file is not None: + # Leer el archivo CSV en un DataFrame + df = pd.read_csv(uploaded_file) + + # Mostrar una vista previa de los primeros registros del DataFrame + st.write('**Vista Previa del DataFrame:**') + st.write(df.head()) + + # Sección para realizar la predicción + st.subheader('Realizar la predicción') + + # Widget para seleccionar las columnas a utilizar para la predicción + feature_cols = st.multiselect('Selecciona las columnas para la predicción', df.columns) + + # Botón para realizar la predicción con las columnas seleccionadas + if st.button('Realizar Predicción con CSV'): + # Realizar la predicción utilizando las columnas seleccionadas + predicted_values = predict_flores(df[feature_cols]) + + # Mostrar los resultados de la predicción + st.success('Éxito al realizar la predicción!') + st.write('Los resultados de la predicción son:') + st.write(predicted_values) + + # Convertir los resultados de la predicción a un DataFrame + predictions_df = pd.DataFrame(predicted_values, columns=['Predicciones']) + + # Widget para descargar el archivo CSV de las predicciones + st.subheader('Descargar Predicciones como CSV') + st.download_button(label='Descargar CSV', + data=predictions_df.to_csv(index=False), + file_name='predicciones.csv', + mime='text/csv') + diff --git a/pages/pred_iris_man.py b/pages/pred_iris_man.py index 6860d31..602670b 100644 --- a/pages/pred_iris_man.py +++ b/pages/pred_iris_man.py @@ -1,33 +1,33 @@ -import streamlit as st -import pandas as pd -from utils import predict_flores - -# Título de la aplicación -st.title('Predicción manual de flores') -st.image('iris.jpg', caption='Imagen de iris', use_column_width=True) - -# Texto introductorio -st.write('**Ingresa los datos manualmente para realizar la predicción de la flor:**') - -# Diccionario para almacenar los datos de entrada -input_data = {} - -# Lista de columnas para las características de la flor -columns = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] - -# Bucle para recorrer las columnas y obtener los datos de entrada -for col in columns: - # Widget de entrada numérica para cada característica - input_data[col] = st.number_input(col, value=0.0) - -# Botón para realizar la predicción -if st.button('Realizar Predicción'): - # Convertir el diccionario de entrada a un DataFrame de una sola fila - input_df = pd.DataFrame([input_data]) - - # Realizar la predicción utilizando la función predict_flores - predicted_value = predict_flores(input_df) - - # Mostrar el resultado de la predicción - st.success('Éxito al realizar la predicción!') +import streamlit as st +import pandas as pd +from utils import predict_flores + +# Título de la aplicación +st.title('Predicción manual de flores') +st.image('Streamlit-Tutorial/iris.jpg', caption='Imagen de iris', use_column_width=True) + +# Texto introductorio +st.write('**Ingresa los datos manualmente para realizar la predicción de la flor:**') + +# Diccionario para almacenar los datos de entrada +input_data = {} + +# Lista de columnas para las características de la flor +columns = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] + +# Bucle para recorrer las columnas y obtener los datos de entrada +for col in columns: + # Widget de entrada numérica para cada característica + input_data[col] = st.number_input(col, value=0.0) + +# Botón para realizar la predicción +if st.button('Realizar Predicción'): + # Convertir el diccionario de entrada a un DataFrame de una sola fila + input_df = pd.DataFrame([input_data]) + + # Realizar la predicción utilizando la función predict_flores + predicted_value = predict_flores(input_df) + + # Mostrar el resultado de la predicción + st.success('Éxito al realizar la predicción!') st.write('El resultado de la predicción es:', predicted_value[0]) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index b9012c1..d01eb39 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -streamlit -scikit-learn -streamlit_extras -keras +streamlit +scikit-learn +streamlit_extras +keras tensorflow \ No newline at end of file diff --git a/streamlit_tutorial.py b/streamlit_tutorial.py index 85d5c0c..ab56f7d 100644 --- a/streamlit_tutorial.py +++ b/streamlit_tutorial.py @@ -1,31 +1,31 @@ -import streamlit as st -from streamlit_extras.switch_page_button import switch_page - -# https://docs.streamlit.io/library/get-started/multipage-apps -# Local: streamlit run streamlit_tutorial.py -# Streamlit Sharing -# render, heroku, AWS EC2 - -def main(): - # Bienvenida y selección del servicio - st.title('Bienvenido al portal predictivo de la empresa XYZ') - st.write('**Por favor seleccione el servicio predictivo que desea utilizar**') - - # Selección del servicio entre dos opciones - opcion = st.radio('Seleccione el servicio:', ('Predicción del tipo de flor', 'Predicción de imagen'), index=None) - - # Redirección a la página del servicio seleccionado - if opcion == 'Predicción del tipo de flor': - way_to_pred = st.radio('¿Cómo desea realizar la predicción de la flor?', ('Ingresando datos manualmente', 'Subiendo un archivo CSV'), index=None) - if way_to_pred == 'Ingresando datos manualmente': - # Redirigir a la página de predicción de iris con datos manuales - switch_page("pred_iris_man") - elif way_to_pred == 'Subiendo un archivo CSV': - # Redirigir a la página de predicción de iris con archivo CSV - switch_page("pred_iris_csv") - elif opcion == 'Predicción de imagen': - # Redirigir a la página de predicción de imagen - switch_page("pred_imagen") - -if __name__ == "__main__": +import streamlit as st +from streamlit_extras.switch_page_button import switch_page + +# https://docs.streamlit.io/library/get-started/multipage-apps +# Local: streamlit run streamlit_tutorial.py +# Streamlit Sharing +# render, heroku, AWS EC2 + +def main(): + # Bienvenida y selección del servicio + st.title('Bienvenido al portal predictivo de la empresa XYZ') + st.write('**Por favor seleccione el servicio predictivo que desea utilizar**') + + # Selección del servicio entre dos opciones + opcion = st.radio('Seleccione el servicio:', ('Predicción del tipo de flor', 'Predicción de imagen'), index=None) + + # Redirección a la página del servicio seleccionado + if opcion == 'Predicción del tipo de flor': + way_to_pred = st.radio('¿Cómo desea realizar la predicción de la flor?', ('Ingresando datos manualmente', 'Subiendo un archivo CSV'), index=None) + if way_to_pred == 'Ingresando datos manualmente': + # Redirigir a la página de predicción de iris con datos manuales + switch_page("pred_iris_man") + elif way_to_pred == 'Subiendo un archivo CSV': + # Redirigir a la página de predicción de iris con archivo CSV + switch_page("pred_iris_csv") + elif opcion == 'Predicción de imagen': + # Redirigir a la página de predicción de imagen + switch_page("pred_imagen") + +if __name__ == "__main__": main() \ No newline at end of file diff --git a/train_iris.py b/train_iris.py index 12e8dc6..0386dce 100644 --- a/train_iris.py +++ b/train_iris.py @@ -1,15 +1,15 @@ -from sklearn.linear_model import LogisticRegression -from sklearn import datasets -import pickle - -# Cargar el dataset de Iris -iris = datasets.load_iris(as_frame=True) -X = iris['data'] # Características de las flores -y = iris['target'] # Etiquetas de las especies de flores - -# Entrenar un modelo de regresión logística con los datos de Iris -log_reg = LogisticRegression().fit(X, y) - -# Guardar el modelo entrenado en un archivo 'iris_model.pkl' -with open('iris_model.pkl', 'wb') as f: +from sklearn.linear_model import LogisticRegression +from sklearn import datasets +import pickle + +# Cargar el dataset de Iris +iris = datasets.load_iris(as_frame=True) +X = iris['data'] # Características de las flores +y = iris['target'] # Etiquetas de las especies de flores + +# Entrenar un modelo de regresión logística con los datos de Iris +log_reg = LogisticRegression().fit(X, y) + +# Guardar el modelo entrenado en un archivo 'iris_model.pkl' +with open('models/iris_model.pkl', 'wb') as f: pickle.dump(log_reg, f) \ No newline at end of file diff --git a/utils.py b/utils.py index 71a54b1..809630d 100644 --- a/utils.py +++ b/utils.py @@ -1,30 +1,30 @@ -import pickle -import streamlit as st -from keras.models import load_model -import tensorflow as tf - -def predict_flores(data): - # Cargar el modelo previamente entrenado para predecir el tipo de flor - model = pickle.load(open('models/iris_model.pkl', "rb")) - # Realizar la predicción con los datos proporcionados - predictions = model.predict(data) - return predictions - -def predict_imagen(imagen): - # Añadir una dimensión extra (lote) - imagen = imagen.reshape((1, 32, 32, 3)) - # Cargar el modelo desde el archivo - model = load_model('models/modelo_cifar_10.h5') - # Realizar la predicción - predictions = model.predict(imagen) - predicted_class = tf.argmax(predictions[0]).numpy() - # Obtener el nombre de la clase predicha - class_names = ['avión', 'automóvil', 'pájaro', 'gato', 'ciervo', 'perro', 'rana', 'caballo', 'barco', 'camión'] - return class_names[predicted_class] - -def check_client_id(client_id): - # Simulación - # Cargar credenciales para la BBDD de la empresa y consultar si el identificador del cliente está activo - api_key = st.secrets["DB_USERNAME"] - ls_ids = [123,12345,12345678] +import pickle +import streamlit as st +from keras.models import load_model +import tensorflow as tf + +def predict_flores(data): + # Cargar el modelo previamente entrenado para predecir el tipo de flor + model = pickle.load(open('Streamlit-Tutorial/models/iris_model.pkl', "rb")) + # Realizar la predicción con los datos proporcionados + predictions = model.predict(data) + return predictions + +def predict_imagen(imagen): + # Añadir una dimensión extra (lote) + imagen = imagen.reshape((1, 32, 32, 3)) + # Cargar el modelo desde el archivo + model = load_model('Streamlit-Tutorial/models/modelo_cifar_10.h5') + # Realizar la predicción + predictions = model.predict(imagen) + predicted_class = tf.argmax(predictions[0]).numpy() + # Obtener el nombre de la clase predicha + class_names = ['avión', 'automóvil', 'pájaro', 'gato', 'ciervo', 'perro', 'rana', 'caballo', 'barco', 'camión'] + return class_names[predicted_class] + +def check_client_id(client_id): + # Simulación + # Cargar credenciales para la BBDD de la empresa y consultar si el identificador del cliente está activo + api_key = st.secrets["DB_USERNAME"] + ls_ids = [123,12345,12345678] return True if client_id in ls_ids else False \ No newline at end of file