Spaces:
Build error
Build error
| # -*- coding: utf-8 -*- | |
| """ProyectoAvanzado1.ipynb | |
| Automatically generated by Colab. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1R5pOFRcOn9faAiaFmIL6GcuWweWYGswX | |
| """ | |
| import os | |
| import pickle | |
| import numpy as np | |
| from sklearn.model_selection import train_test_split | |
| from tensorflow.keras.utils import to_categorical | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| import pandas as pd | |
| from sklearn import preprocessing | |
| import streamlit as st | |
| import tensorflow as tf | |
| import numpy as np | |
| import cv2 | |
| from PIL import Image | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| import tensorflow as tf | |
| from tensorflow.keras.models import Sequential | |
| from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout | |
| # Función para cargar datos desde archivos .p | |
| def load_pickle(file_path): | |
| with open(file_path, 'rb') as file: | |
| data = pickle.load(file) | |
| return data | |
| # Cargar datos de entrenamiento, validación y prueba | |
| train_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/train.p")) | |
| val_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/valid.p")) | |
| test_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/test.p")) | |
| # Separar imágenes y etiquetas | |
| train_images, train_labels = train_data['features'], train_data['labels'] | |
| val_images, val_labels = val_data['features'], val_data['labels'] | |
| test_images, test_labels = test_data['features'], test_data['labels'] | |
| # Preprocesar datos | |
| def preprocess_data(images, labels): | |
| images = images.astype('float32') / 255.0 | |
| labels = to_categorical(labels, num_classes=43) | |
| return images, labels | |
| train_images, train_labels = preprocess_data(train_images, train_labels) | |
| val_images, val_labels = preprocess_data(val_images, val_labels) | |
| test_images, test_labels = preprocess_data(test_images, test_labels) | |
| # Convertir etiquetas a DataFrame para visualización | |
| train_df = pd.DataFrame({"label": train_labels.argmax(axis=1)}) | |
| # Conteo de imágenes por clase | |
| plt.figure(figsize=(10, 6)) | |
| sns.countplot(x=train_df['label']) | |
| plt.title("Conteo de Imágenes por Clase") | |
| plt.xlabel("Clase") | |
| plt.ylabel("Conteo") | |
| plt.show() | |
| # Visualización 2: Ejemplos de imágenes por clase | |
| fig, axes = plt.subplots(5, 5, figsize=(15, 15)) | |
| axes = axes.ravel() | |
| for i in range(25): | |
| axes[i].imshow(train_images[i]) | |
| axes[i].set_title(f"Clase: {train_labels[i].argmax()}") | |
| axes[i].axis('off') | |
| plt.subplots_adjust(hspace=0.5) | |
| plt.show() | |
| # Visualización 3: Muestra aleatoria de imágenes | |
| fig, axes = plt.subplots(3, 3, figsize=(12, 12)) | |
| axes = axes.ravel() | |
| for i in range(9): | |
| idx = np.random.randint(0, len(train_images)) | |
| axes[i].imshow(train_images[idx]) | |
| axes[i].set_title(f"Clase: {train_labels[idx].argmax()}") | |
| axes[i].axis('off') | |
| plt.subplots_adjust(hspace=0.5) | |
| plt.show() | |
| # Definir la arquitectura de la CNN | |
| model = Sequential([ | |
| Conv2D(32, (3, 3), activation="relu", input_shape=(32, 32, 3)), | |
| MaxPooling2D((2, 2)), | |
| Conv2D(64, (3, 3), activation="relu"), | |
| MaxPooling2D((2, 2)), | |
| Conv2D(128, (3, 3), activation="relu"), | |
| MaxPooling2D((2, 2)), | |
| Flatten(), | |
| Dense(215, activation="relu"), | |
| Dropout(0.5), | |
| Dense(43, activation="softmax") | |
| ]) | |
| # Compilar el modelo | |
| model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) | |
| # Verificar si el modelo ya está guardado | |
| model_path = "traffic_sign_classifier.h5" | |
| if os.path.exists(model_path): | |
| model = tf.keras.models.load_model(model_path) | |
| else: | |
| model.fit(train_images, train_labels, epochs=10, validation_data=(val_images, val_labels)) | |
| model.save(model_path) | |
| # Evaluar el modelo en datos de prueba | |
| test_loss, test_acc = model.evaluate(test_images, test_labels) | |
| print(f"Test Accuracy: {test_acc:.2f}") | |
| # Cargar el modelo | |
| model = tf.keras.models.load_model("traffic_sign_classifier.h5") | |
| # Diccionario de clases de señales de tráfico | |
| classes = { | |
| 0: 'Speed limit (20km/h)', | |
| 1: 'Speed limit (30km/h)', | |
| 2: 'Speed limit (50km/h)', | |
| 3: 'Speed limit (60km/h)', | |
| 4: 'Speed limit (70km/h)', | |
| 5: 'Speed limit (80km/h)', | |
| 6: 'End of speed limit (80km/h)', | |
| 7: 'Speed limit (100km/h)', | |
| 8: 'Speed limit (120km/h)', | |
| 9: 'No passing', | |
| 10: 'No passing for vehicles over 3.5 metric tons', | |
| 11: 'Right-of-way at the next intersection', | |
| 12: 'Priority road', | |
| 13: 'Yield', | |
| 14: 'Stop', | |
| 15: 'No vehicles', | |
| 16: 'Vehicles over 3.5 metric tons prohibited', | |
| 17: 'No entry', | |
| 18: 'General caution', | |
| 19: 'Dangerous curve to the left', | |
| 20: 'Dangerous curve to the right', | |
| 21: 'Double curve', | |
| 22: 'Bumpy road', | |
| 23: 'Slippery road', | |
| 24: 'Road narrows on the right', | |
| 25: 'Road work', | |
| 26: 'Traffic signals', | |
| 27: 'Pedestrians', | |
| 28: 'Children crossing', | |
| 29: 'Bicycles crossing', | |
| 30: 'Beware of ice/snow', | |
| 31: 'Wild animals crossing', | |
| 32: 'End of all speed and passing limits', | |
| 33: 'Turn right ahead', | |
| 34: 'Turn left ahead', | |
| 35: 'Ahead only', | |
| 36: 'Go straight or right', | |
| 37: 'Go straight or left', | |
| 38: 'Keep right', | |
| 39: 'Keep left', | |
| 40: 'Roundabout mandatory', | |
| 41: 'End of no passing', | |
| 42: 'End of no passing by vehicles over 3.5 metric tons' | |
| } | |
| # Función para predecir la clase de una imagen | |
| def predict(image): | |
| image = np.array(image) | |
| image = cv2.resize(image, (32, 32)) | |
| image = image / 255.0 | |
| image = np.expand_dims(image, axis=0) | |
| predictions = model.predict(image) | |
| class_idx = np.argmax(predictions) | |
| return classes[class_idx] | |
| # Título y descripción de la aplicación | |
| st.title("Traffic Sign Classifier") | |
| st.write("Esta aplicación clasifica señales de tráfico usando un modelo de CNN.") | |
| # Mostrar ejemplos de imágenes del conjunto de datos | |
| st.header("Ejemplos de Imágenes del Conjunto de Datos") | |
| fig, axes = plt.subplots(2, 5, figsize=(15, 6)) | |
| axes = axes.ravel() | |
| for i in range(10): | |
| idx = np.random.randint(0, len(train_images)) | |
| axes[i].imshow(train_images[idx]) | |
| axes[i].set_title(f"Clase: {train_labels[idx].argmax()}") | |
| axes[i].axis('off') | |
| st.pyplot(fig) | |
| # Mostrar ejemplos de imágenes del conjunto de datos | |
| fig, axes = plt.subplots(2, 5, figsize=(15, 6)) | |
| axes = axes.ravel() | |
| for i in range(10): | |
| idx = np.random.randint(0, len(train_images)) | |
| axes[i].imshow(train_images[idx]) | |
| axes[i].set_title(f"Clase: {train_labels[idx].argmax()}") | |
| axes[i].axis('off') | |
| st.pyplot(fig) | |
| # Mostrar algunas visualizaciones de EDA | |
| st.header("Visualizaciones de EDA") | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.countplot(x='label', data=train_df, ax=ax) | |
| ax.set_title("Conteo de Imágenes por Clase") | |
| ax.set_xlabel("Clase") | |
| ax.set_ylabel("Conteo") | |
| st.pyplot(fig) | |
| # Permitir al usuario cargar una imagen | |
| st.header("Carga tu Propia Imagen de Señal de Tráfico") | |
| uploaded_file = st.file_uploader("Elige una imagen...", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file is not None: | |
| image = Image.open(uploaded_file) | |
| st.image(image, caption='Imagen Cargada', use_column_width=True) | |
| st.write("") | |
| st.write("Clasificando...") | |
| label = predict(image) | |
| st.write(f"Esta señal es: {label}") | |
| # Mostrar métricas del modelo | |
| st.header("Métricas del Modelo") | |
| st.write(f"Exactitud del conjunto de prueba: {test_acc:.2f}") |