pgomez611 commited on
Commit
ed212f9
·
1 Parent(s): 65cd5c5

Arreglo compatibilidad NumPy y actualización app.py y requirements

Browse files
Files changed (2) hide show
  1. app.py +58 -70
  2. requirements.txt +0 -1
app.py CHANGED
@@ -1,63 +1,59 @@
1
- # ----------------------------------------------------------------------------------
 
 
 
2
  # Carga de librerías necesarias
3
- # ----------------------------------------------------------------------------------
4
  from transformers import DetrImageProcessor, DetrForObjectDetection
5
  import torch
6
  from PIL import Image
7
  import gradio as gr
8
 
9
- # Explicación:
10
- # transformers: librería de Hugging Face con modelos ya entrenados, como DETR.
11
  # DetrImageProcessor: preprocesa la imagen para que el modelo la entienda.
12
- # DetrForObjectDetection: modelo DETR preentrenado.
13
- # torch: PyTorch, biblioteca para cálculos con redes neuronales.
14
- # PIL.Image: permite trabajar con imágenes.
15
- # gradio: para crear interfaces gráficas web sencillas.
16
 
17
  # ----------------------------------------------------------------------------------
18
- # Cargar el procesador y el modelo
19
- # ----------------------------------------------------------------------------------
20
  processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
21
  model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
22
 
23
- # Explicación:
24
- # Se carga un modelo preentrenado: facebook/detr-resnet-50
25
- # No necesitamos entrenar nada desde cero.
26
- # processor prepara la imagen (redimensiona y normaliza).
27
- # model detecta los objetos.
28
- # Decisión: usar modelo preentrenado para evitar requerir millones de imágenes y alto poder de cómputo.
29
 
30
  # ----------------------------------------------------------------------------------
31
- # Función para procesar la imagen
32
- # ----------------------------------------------------------------------------------
33
  def detect_objects(image):
34
- # Preprocesamiento
35
- inputs = processor(images=image, return_tensors="pt")
 
36
 
37
  # Explicación:
38
- # detect_objects recibe la imagen y devuelve los objetos encontrados.
39
- # processor convierte la imagen en tensores que entiende PyTorch.
40
- # return_tensors="pt" indica que se generan tensores para PyTorch.
41
 
42
- # Detectar objetos
43
- with torch.no_grad():
44
  outputs = model(**inputs)
45
 
46
- # Explicación:
47
- # torch.no_grad() desactiva el cálculo de gradientes, porque no entrenamos.
48
- # model(**inputs) corre la imagen por la red neuronal y devuelve predicciones.
49
-
50
- # Filtrar resultados
51
  target_sizes = torch.tensor([image.size[::-1]]) # (alto, ancho)
52
- results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=0.9)[0]
 
 
53
 
54
  # Explicación:
55
- # image.size[::-1]: invierte ancho y alto (PIL usa ancho,alto y el modelo espera alto, ancho)
56
- # post_process_object_detection convierte predicciones en resultados entendibles
57
- # threshold=0.9: solo se aceptan predicciones con 90% de confianza
58
- # Decisión: umbral alto para reducir falsos positivos
59
 
60
- # Crear lista de resultados con nombre y puntuación
61
  labels = results["labels"]
62
  scores = results["scores"]
63
  boxes = results["boxes"]
@@ -65,48 +61,40 @@ def detect_objects(image):
65
  detected_objects = []
66
  for score, label, box in zip(scores, labels, boxes):
67
  detected_objects.append(f"Objeto: {label}, Score: {score:.2f}, Box: {box.tolist()}")
68
-
69
- return "\n".join(detected_objects)
70
 
71
- # Explicación:
72
- # labels: números que representan clases (1=persona, 17=gato, etc.)
73
- # scores: probabilidad de acierto
74
- # boxes: coordenadas de la caja delimitadora
75
- # Se muestra el resultado como texto para entender primero qué devuelve el modelo.
76
- # Decisión: esto permite ver resultados rápidamente; luego se puede mejorar para dibujar cajas.
77
 
78
  # ----------------------------------------------------------------------------------
79
- # Crear interfaz con Gradio
80
- # ----------------------------------------------------------------------------------
81
- interface = gr.Interface(
82
- fn=detect_objects, # conecta la app con el modelo
83
- inputs=gr.Image(type="pil"), # entrada: imagen cargada por el usuario
84
- outputs=gr.Textbox(), # salida: resultados en texto
85
- title="Detección de Objetos con Transformers",
86
- description="Sube una imagen y descubre qué objetos detecta el modelo DETR.",
87
- live=True # procesa automáticamente al cargar la imagen
88
- )
89
-
90
- # Explicación:
91
- # gr.Interface facilita crear interfaces web.
92
- # live=True: la imagen se procesa inmediatamente.
93
- # Decisión: usar Gradio para una prueba rápida y despliegue simple.
94
 
95
- # ----------------------------------------------------------------------------------
96
- # Ejecutar la aplicación
97
- # ----------------------------------------------------------------------------------
98
- if __name__ == "__main__":
99
- # Para Hugging Face Space, no usar live=True al lanzar
100
  interface = gr.Interface(
101
- fn=detect_objects,
102
- inputs=gr.Image(type="pil"),
103
- outputs=gr.Textbox(),
 
104
  title="Detección de Objetos con Transformers",
105
  description="Sube una imagen y descubre qué objetos detecta el modelo DETR."
106
  )
 
 
 
 
 
 
107
  interface.launch()
108
 
109
- # Explicación:
110
- # La aplicación solo se ejecuta si se corre directamente python app.py
111
- # Esto evita que se ejecute si el archivo es importado como módulo.
 
 
 
 
 
 
 
 
 
 
112
 
 
1
+ # -----------------------------
2
+ # app.py - Detección de objetos con DETR y Gradio
3
+ # -----------------------------
4
+
5
  # Carga de librerías necesarias
 
6
  from transformers import DetrImageProcessor, DetrForObjectDetection
7
  import torch
8
  from PIL import Image
9
  import gradio as gr
10
 
11
+ # Librerías utilizadas:
12
+ # transformers: Hugging Face, modelos preentrenados como DETR.
13
  # DetrImageProcessor: preprocesa la imagen para que el modelo la entienda.
14
+ # DetrForObjectDetection: modelo DETR preentrenado para detección de objetos.
15
+ # torch: cálculos con tensores y redes neuronales.
16
+ # PIL.Image: manejo de imágenes en Python.
17
+ # gradio: interfaz gráfica web sencilla para probar el modelo.
18
 
19
  # ----------------------------------------------------------------------------------
20
+
21
+ # Cargar procesador y modelo preentrenado
22
  processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
23
  model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
24
 
25
+ # Justificación:
26
+ # Usamos un modelo preentrenado porque entrenar uno desde cero requiere millones de imágenes y mucho poder de cómputo.
27
+ # Hugging Face permite reutilizar un modelo ya entrenado con buenas métricas en objetos comunes.
 
 
 
28
 
29
  # ----------------------------------------------------------------------------------
30
+
31
+ # Función para procesar la imagen y detectar objetos
32
  def detect_objects(image):
33
+ # Preprocesamiento de la imagen
34
+ # padding=True: necesario para que imágenes de diferentes tamaños se puedan convertir en batch sin errores
35
+ inputs = processor(images=image, return_tensors="pt", padding=True)
36
 
37
  # Explicación:
38
+ # El processor convierte la imagen a tensores PyTorch, lista para la red neuronal.
39
+ # return_tensors="pt" indica que se usan tensores de PyTorch.
40
+ # padding=True evita errores de batch cuando la imagen no coincide con el tamaño esperado.
41
 
42
+ # Detección de objetos
43
+ with torch.no_grad(): # no calculamos gradientes, solo inferencia
44
  outputs = model(**inputs)
45
 
46
+ # Postprocesamiento para obtener resultados entendibles
 
 
 
 
47
  target_sizes = torch.tensor([image.size[::-1]]) # (alto, ancho)
48
+ results = processor.post_process_object_detection(
49
+ outputs, target_sizes=target_sizes, threshold=0.9
50
+ )[0]
51
 
52
  # Explicación:
53
+ # threshold=0.9: solo aceptamos predicciones con 90% o más de confianza para reducir falsos positivos.
54
+ # post_process_object_detection convierte las predicciones crudas en nombres de clases, scores y boxes.
 
 
55
 
56
+ # Preparar resultados para mostrar
57
  labels = results["labels"]
58
  scores = results["scores"]
59
  boxes = results["boxes"]
 
61
  detected_objects = []
62
  for score, label, box in zip(scores, labels, boxes):
63
  detected_objects.append(f"Objeto: {label}, Score: {score:.2f}, Box: {box.tolist()}")
 
 
64
 
65
+ return "\n".join(detected_objects)
 
 
 
 
 
66
 
67
  # ----------------------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
+ # Crear interfaz con Gradio
70
+ def create_interface():
 
 
 
71
  interface = gr.Interface(
72
+ fn=detect_objects, # función principal que conecta modelo con la app
73
+ inputs=gr.Image(type="pil"), # entrada: imagen cargada por el usuario
74
+ outputs=gr.Textbox(), # salida: resultados en texto
75
+ live=True, # procesa inmediatamente al cargar la imagen
76
  title="Detección de Objetos con Transformers",
77
  description="Sube una imagen y descubre qué objetos detecta el modelo DETR."
78
  )
79
+
80
+ # Explicación:
81
+ # live=True: la imagen se procesa automáticamente al cargar, sin necesidad de un botón extra.
82
+ # gr.Image(type="pil") permite subir y trabajar con imágenes en formato PIL, compatible con el processor.
83
+ # Textbox devuelve los resultados como texto legible.
84
+
85
  interface.launch()
86
 
87
+ # ----------------------------------------------------------------------------------
88
+
89
+ # Ejecutar la aplicación
90
+ if __name__ == "__main__":
91
+ create_interface()
92
+
93
+ # ----------------------------------------------------------------------------------
94
+ # Conclusión:
95
+ # Esta aplicación permite cargar imágenes y obtener los objetos detectados usando DETR.
96
+ # La decisión de usar un modelo preentrenado y el processor de Hugging Face simplifica la implementación y reduce riesgos de error.
97
+ # padding=True corrige el error que aparecía en versiones recientes de transformers y NumPy.
98
+ # Puede ejecutarse localmente con `python app.py` y también desplegarse en Hugging Face Spaces.
99
+ # ----------------------------------------------------------------------------------
100
 
requirements.txt CHANGED
@@ -5,4 +5,3 @@ torchvision==0.15.2
5
  timm==0.9.8
6
  pillow==9.5.0
7
  huggingface-hub>=0.19.0
8
-
 
5
  timm==0.9.8
6
  pillow==9.5.0
7
  huggingface-hub>=0.19.0