VicGerardoPR commited on
Commit
d5541c9
1 Parent(s): 6de46a3
Files changed (1) hide show
  1. app.py +27 -134
app.py CHANGED
@@ -1,127 +1,40 @@
1
- # -*- coding: utf-8 -*-
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
- from sklearn.model_selection import train_test_split
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 matplotlib.pyplot as plt
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
- # Funci贸n para cargar datos desde archivos .p
31
- def load_pickle(file_path):
32
- with open(file_path, 'rb') as file:
33
- data = pickle.load(file)
34
- return data
35
 
36
- # Cargar datos de entrenamiento, validaci贸n y prueba
37
- train_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/train.p"))
38
- val_data = load_pickle(os.path.join("/Users/victorg/Documents/DataScience/ProjectoAvanzado/CSV/valid.p"))
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 = to_categorical(labels, num_classes=43)
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
- # Evaluar el modelo en datos de prueba
117
- test_loss, test_acc = model.evaluate(test_images, test_labels)
118
- print(f"Test Accuracy: {test_acc:.2f}")
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
- predictions = model.predict(image)
180
- class_idx = np.argmax(predictions)
 
 
 
 
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].argmax()}")
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}")