Commit
路
d5541c9
1
Parent(s):
6de46a3
App.py
Browse files
app.py
CHANGED
@@ -1,127 +1,40 @@
|
|
1 |
-
|
2 |
-
"""ProyectoAvanzado1.ipynb
|
3 |
-
|
4 |
-
Automatically generated by Colab.
|
5 |
-
|
6 |
-
Original file is located at
|
7 |
-
https://colab.research.google.com/drive/1R5pOFRcOn9faAiaFmIL6GcuWweWYGswX
|
8 |
-
"""
|
9 |
-
|
10 |
-
import os
|
11 |
-
import pickle
|
12 |
import numpy as np
|
13 |
-
|
14 |
-
from tensorflow.keras.utils import to_categorical
|
15 |
import matplotlib.pyplot as plt
|
16 |
import seaborn as sns
|
17 |
-
import pandas as pd
|
18 |
-
from sklearn import preprocessing
|
19 |
-
import streamlit as st
|
20 |
-
import tensorflow as tf
|
21 |
-
import numpy as np
|
22 |
import cv2
|
|
|
|
|
|
|
23 |
from PIL import Image
|
24 |
-
import
|
25 |
-
import seaborn as sns
|
26 |
-
import tensorflow as tf
|
27 |
-
from tensorflow.keras.models import Sequential
|
28 |
-
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
|
29 |
|
30 |
-
#
|
31 |
-
|
32 |
-
|
33 |
-
data = pickle.load(file)
|
34 |
-
return data
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
test_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/test.p"))
|
40 |
|
41 |
-
# Separar im谩genes y etiquetas
|
42 |
train_images, train_labels = train_data['features'], train_data['labels']
|
43 |
-
val_images, val_labels = val_data['features'], val_data['labels']
|
44 |
-
test_images, test_labels = test_data['features'], test_data['labels']
|
45 |
|
46 |
# Preprocesar datos
|
47 |
def preprocess_data(images, labels):
|
48 |
images = images.astype('float32') / 255.0
|
49 |
-
labels =
|
50 |
return images, labels
|
51 |
|
52 |
train_images, train_labels = preprocess_data(train_images, train_labels)
|
53 |
-
val_images, val_labels = preprocess_data(val_images, val_labels)
|
54 |
-
test_images, test_labels = preprocess_data(test_images, test_labels)
|
55 |
-
|
56 |
-
|
57 |
-
# Convertir etiquetas a DataFrame para visualizaci贸n
|
58 |
-
train_df = pd.DataFrame({"label": train_labels.argmax(axis=1)})
|
59 |
-
|
60 |
-
# Conteo de im谩genes por clase
|
61 |
-
plt.figure(figsize=(10, 6))
|
62 |
-
sns.countplot(x=train_df['label'])
|
63 |
-
plt.title("Conteo de Im谩genes por Clase")
|
64 |
-
plt.xlabel("Clase")
|
65 |
-
plt.ylabel("Conteo")
|
66 |
-
plt.show()
|
67 |
-
|
68 |
-
# Visualizaci贸n 2: Ejemplos de im谩genes por clase
|
69 |
-
fig, axes = plt.subplots(5, 5, figsize=(15, 15))
|
70 |
-
axes = axes.ravel()
|
71 |
-
for i in range(25):
|
72 |
-
axes[i].imshow(train_images[i])
|
73 |
-
axes[i].set_title(f"Clase: {train_labels[i].argmax()}")
|
74 |
-
axes[i].axis('off')
|
75 |
-
plt.subplots_adjust(hspace=0.5)
|
76 |
-
plt.show()
|
77 |
-
|
78 |
-
# Visualizaci贸n 3: Muestra aleatoria de im谩genes
|
79 |
-
fig, axes = plt.subplots(3, 3, figsize=(12, 12))
|
80 |
-
axes = axes.ravel()
|
81 |
-
for i in range(9):
|
82 |
-
idx = np.random.randint(0, len(train_images))
|
83 |
-
axes[i].imshow(train_images[idx])
|
84 |
-
axes[i].set_title(f"Clase: {train_labels[idx].argmax()}")
|
85 |
-
axes[i].axis('off')
|
86 |
-
plt.subplots_adjust(hspace=0.5)
|
87 |
-
plt.show()
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
# Definir la arquitectura de la CNN
|
92 |
-
model = Sequential([
|
93 |
-
Conv2D(32, (3, 3), activation="relu", input_shape=(32, 32, 3)),
|
94 |
-
MaxPooling2D((2, 2)),
|
95 |
-
Conv2D(64, (3, 3), activation="relu"),
|
96 |
-
MaxPooling2D((2, 2)),
|
97 |
-
Conv2D(128, (3, 3), activation="relu"),
|
98 |
-
MaxPooling2D((2, 2)),
|
99 |
-
Flatten(),
|
100 |
-
Dense(215, activation="relu"),
|
101 |
-
Dropout(0.5),
|
102 |
-
Dense(43, activation="softmax")
|
103 |
-
])
|
104 |
-
|
105 |
-
# Compilar el modelo
|
106 |
-
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
|
107 |
-
|
108 |
-
# Verificar si el modelo ya est谩 guardado
|
109 |
-
model_path = "traffic_sign_classifier.h5"
|
110 |
-
if os.path.exists(model_path):
|
111 |
-
model = tf.keras.models.load_model(model_path)
|
112 |
-
else:
|
113 |
-
model.fit(train_images, train_labels, epochs=10, validation_data=(val_images, val_labels))
|
114 |
-
model.save(model_path)
|
115 |
|
116 |
-
#
|
117 |
-
|
118 |
-
|
119 |
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
# Cargar el modelo
|
124 |
-
model = tf.keras.models.load_model("traffic_sign_classifier.h5")
|
125 |
|
126 |
# Diccionario de clases de se帽ales de tr谩fico
|
127 |
classes = {
|
@@ -170,14 +83,17 @@ classes = {
|
|
170 |
42: 'End of no passing by vehicles over 3.5 metric tons'
|
171 |
}
|
172 |
|
173 |
-
# Funci贸n para predecir la clase de una imagen
|
174 |
def predict(image):
|
175 |
image = np.array(image)
|
176 |
image = cv2.resize(image, (32, 32))
|
177 |
image = image / 255.0
|
178 |
image = np.expand_dims(image, axis=0)
|
179 |
-
|
180 |
-
|
|
|
|
|
|
|
|
|
181 |
return classes[class_idx]
|
182 |
|
183 |
# T铆tulo y descripci贸n de la aplicaci贸n
|
@@ -191,29 +107,10 @@ axes = axes.ravel()
|
|
191 |
for i in range(10):
|
192 |
idx = np.random.randint(0, len(train_images))
|
193 |
axes[i].imshow(train_images[idx])
|
194 |
-
axes[i].set_title(f"Clase: {train_labels[idx]
|
195 |
-
axes[i].axis('off')
|
196 |
-
st.pyplot(fig)
|
197 |
-
# Mostrar ejemplos de im谩genes del conjunto de datos
|
198 |
-
|
199 |
-
fig, axes = plt.subplots(2, 5, figsize=(15, 6))
|
200 |
-
axes = axes.ravel()
|
201 |
-
for i in range(10):
|
202 |
-
idx = np.random.randint(0, len(train_images))
|
203 |
-
axes[i].imshow(train_images[idx])
|
204 |
-
axes[i].set_title(f"Clase: {train_labels[idx].argmax()}")
|
205 |
axes[i].axis('off')
|
206 |
st.pyplot(fig)
|
207 |
|
208 |
-
# Mostrar algunas visualizaciones de EDA
|
209 |
-
st.header("Visualizaciones de EDA")
|
210 |
-
fig, ax = plt.subplots(figsize=(10, 6))
|
211 |
-
sns.countplot(x='label', data=train_df, ax=ax)
|
212 |
-
ax.set_title("Conteo de Im谩genes por Clase")
|
213 |
-
ax.set_xlabel("Clase")
|
214 |
-
ax.set_ylabel("Conteo")
|
215 |
-
st.pyplot(fig)
|
216 |
-
|
217 |
# Permitir al usuario cargar una imagen
|
218 |
st.header("Carga tu Propia Imagen de Se帽al de Tr谩fico")
|
219 |
uploaded_file = st.file_uploader("Elige una imagen...", type=["jpg", "jpeg", "png"])
|
@@ -223,8 +120,4 @@ if uploaded_file is not None:
|
|
223 |
st.write("")
|
224 |
st.write("Clasificando...")
|
225 |
label = predict(image)
|
226 |
-
st.write(f"Esta se帽al es: {label}")
|
227 |
-
|
228 |
-
# Mostrar m茅tricas del modelo
|
229 |
-
st.header("M茅tricas del Modelo")
|
230 |
-
st.write(f"Exactitud del conjunto de prueba: {test_acc:.2f}")
|
|
|
1 |
+
import streamlit as st
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
import numpy as np
|
3 |
+
import pandas as pd
|
|
|
4 |
import matplotlib.pyplot as plt
|
5 |
import seaborn as sns
|
|
|
|
|
|
|
|
|
|
|
6 |
import cv2
|
7 |
+
import torch
|
8 |
+
from transformers import AutoTokenizer, AutoModelForImageClassification
|
9 |
+
from huggingface_hub import hf_hub_download
|
10 |
from PIL import Image
|
11 |
+
import pickle
|
|
|
|
|
|
|
|
|
12 |
|
13 |
+
# Cargar dataset
|
14 |
+
dataset_repo = "VicGerardoPR/Traffic_Sign_Classifier"
|
15 |
+
dataset_file = "train.p"
|
|
|
|
|
16 |
|
17 |
+
dataset_path = hf_hub_download(repo_id=dataset_repo, filename=dataset_file)
|
18 |
+
with open(dataset_path, 'rb') as file:
|
19 |
+
train_data = pickle.load(file)
|
|
|
20 |
|
|
|
21 |
train_images, train_labels = train_data['features'], train_data['labels']
|
|
|
|
|
22 |
|
23 |
# Preprocesar datos
|
24 |
def preprocess_data(images, labels):
|
25 |
images = images.astype('float32') / 255.0
|
26 |
+
labels = pd.Series(labels).astype('category').cat.codes.to_numpy()
|
27 |
return images, labels
|
28 |
|
29 |
train_images, train_labels = preprocess_data(train_images, train_labels)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
|
31 |
+
# Cargar modelo
|
32 |
+
model_repo = "VicGerardoPR/Traffic_Sign_Classifier"
|
33 |
+
model_file = "traffic_sign_classifier.h5"
|
34 |
|
35 |
+
model_path = hf_hub_download(repo_id=model_repo, filename=model_file)
|
36 |
+
model = torch.load(model_path, map_location=torch.device('cpu'))
|
37 |
+
model.eval()
|
|
|
|
|
38 |
|
39 |
# Diccionario de clases de se帽ales de tr谩fico
|
40 |
classes = {
|
|
|
83 |
42: 'End of no passing by vehicles over 3.5 metric tons'
|
84 |
}
|
85 |
|
|
|
86 |
def predict(image):
|
87 |
image = np.array(image)
|
88 |
image = cv2.resize(image, (32, 32))
|
89 |
image = image / 255.0
|
90 |
image = np.expand_dims(image, axis=0)
|
91 |
+
image = np.transpose(image, (0, 3, 1, 2)) # Reordenar dimensiones para PyTorch
|
92 |
+
image = torch.tensor(image).float()
|
93 |
+
|
94 |
+
with torch.no_grad():
|
95 |
+
predictions = model(image)
|
96 |
+
class_idx = predictions.argmax().item()
|
97 |
return classes[class_idx]
|
98 |
|
99 |
# T铆tulo y descripci贸n de la aplicaci贸n
|
|
|
107 |
for i in range(10):
|
108 |
idx = np.random.randint(0, len(train_images))
|
109 |
axes[i].imshow(train_images[idx])
|
110 |
+
axes[i].set_title(f"Clase: {train_labels[idx]}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
axes[i].axis('off')
|
112 |
st.pyplot(fig)
|
113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
# Permitir al usuario cargar una imagen
|
115 |
st.header("Carga tu Propia Imagen de Se帽al de Tr谩fico")
|
116 |
uploaded_file = st.file_uploader("Elige una imagen...", type=["jpg", "jpeg", "png"])
|
|
|
120 |
st.write("")
|
121 |
st.write("Clasificando...")
|
122 |
label = predict(image)
|
123 |
+
st.write(f"Esta se帽al es: {label}")
|
|
|
|
|
|
|
|