pgomez611 commited on
Commit
1189eac
·
1 Parent(s): ed212f9

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

Browse files
Files changed (1) hide show
  1. app.py +61 -59
app.py CHANGED
@@ -2,99 +2,101 @@
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"]
60
-
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
-
 
 
 
2
  # app.py - Detección de objetos con DETR y Gradio
3
  # -----------------------------
4
 
5
+ # -----------------------------
6
  # Carga de librerías necesarias
7
+ # -----------------------------
8
  from transformers import DetrImageProcessor, DetrForObjectDetection
9
  import torch
10
+ from PIL import Image, ImageDraw
11
  import gradio as gr
12
 
13
+ # -----------------------------
14
+ # Justificación de librerías:
15
+ # -----------------------------
16
+ # transformers: Librería de Hugging Face, permite usar modelos preentrenados como DETR para tareas de visión por computadora.
17
+ # DetrImageProcessor: Preprocesa la imagen para que DETR la entienda.
18
+ # DetrForObjectDetection: Modelo DETR preentrenado en COCO para detección de objetos.
19
+ # torch: Cálculos de tensores y soporte para GPU si está disponible.
20
+ # PIL.Image: Manejo de imágenes en Python.
21
+ # gradio: Interfaz gráfica web sencilla para probar modelos de ML.
22
+ # -----------------------------
23
 
24
+ # -----------------------------
25
+ # Cargar modelo y procesador preentrenado
26
+ # -----------------------------
27
  processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
28
  model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
29
 
30
+ # -----------------------------
31
+ # Justificación de decisiones:
32
+ # -----------------------------
33
+ # 1. Se usa modelo preentrenado para evitar entrenar desde cero, lo cual requiere millones de imágenes y alto costo computacional.
34
+ # 2. Se usa processor de Hugging Face para manejar correctamente el tamaño de la imagen y normalizarla.
35
+ # 3. Torch se usa para tensor computations y evitar errores de incompatibilidad.
36
+ # -----------------------------
37
 
38
+ # -----------------------------
39
+ # Función para detectar objetos en la imagen
40
+ # -----------------------------
41
  def detect_objects(image):
42
+ # Manejo de casos donde no se sube imagen
43
+ if image is None:
44
+ return "⚠️ Por favor, sube una imagen para detectar objetos."
45
 
46
+ # Preprocesamiento
47
+ inputs = processor(images=image, return_tensors="pt", padding=True)
 
 
48
 
49
+ # Inferencia (sin calcular gradientes)
50
+ with torch.no_grad():
51
  outputs = model(**inputs)
52
 
53
+ # Postprocesamiento
54
  target_sizes = torch.tensor([image.size[::-1]]) # (alto, ancho)
55
  results = processor.post_process_object_detection(
56
  outputs, target_sizes=target_sizes, threshold=0.9
57
  )[0]
58
 
59
+ # Preparar visualización de resultados
60
+ draw = ImageDraw.Draw(image)
 
 
 
 
 
 
 
61
  detected_objects = []
62
+ for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
63
+ # Coordenadas de la caja
64
+ box = [round(i, 2) for i in box.tolist()]
65
+ draw.rectangle(box, outline="red", width=2)
66
+ draw.text((box[0], box[1]-10), f"{label}: {score:.2f}", fill="red")
67
+ detected_objects.append(f"Objeto: {label}, Score: {score:.2f}, Box: {box}")
68
 
69
+ # Devuelve la imagen con cajas y un resumen textual
70
+ return image, "\n".join(detected_objects)
71
 
72
+ # -----------------------------
73
  # Crear interfaz con Gradio
74
+ # -----------------------------
75
  def create_interface():
76
  interface = gr.Interface(
77
  fn=detect_objects, # función principal que conecta modelo con la app
78
  inputs=gr.Image(type="pil"), # entrada: imagen cargada por el usuario
79
+ outputs=[gr.Image(type="pil"), gr.Textbox()], # salida: imagen con cajas y texto
 
80
  title="Detección de Objetos con Transformers",
81
+ description="Sube una imagen y descubre qué objetos detecta el modelo DETR. Las cajas rojas indican los objetos detectados."
82
+ # NOTA: Se quita live=True para evitar errores de NoneType
83
  )
84
+ # Explicación: Gradio permite subir imagen en PIL y obtener resultados tanto visuales como textuales.
 
 
 
 
 
85
  interface.launch()
86
 
87
+ # -----------------------------
 
88
  # Ejecutar la aplicación
89
+ # -----------------------------
90
  if __name__ == "__main__":
91
  create_interface()
92
 
93
+ # -----------------------------
94
  # Conclusión:
95
+ # -----------------------------
96
+ # 1. Esta app permite subir imágenes y detectar objetos con DETR.
97
+ # 2. Se muestra la imagen con cajas rojas y texto con la clase y score.
98
+ # 3. Se maneja el caso de no subir imagen para evitar errores de tipo NoneType.
99
+ # 4. Se usan librerías estables y preentrenadas para minimizar errores y tiempo de desarrollo.
100
+ # 5. Puede ejecutarse localmente con: python app.py
101
+ # 6. También puede desplegarse en Hugging Face Spaces si se desea.
102
+ # -----------------------------