Kesheratmex commited on
Commit
45e8554
·
1 Parent(s): 50f5fdc

Fix infer(): usar results[0].save_dir y guardar en carpeta temporal única

Browse files
Files changed (1) hide show
  1. app.py +38 -19
app.py CHANGED
@@ -1,33 +1,52 @@
1
- # app.py
 
 
2
  import os
3
- # ── Ajuste para OpenMP *antes* de que Torch se cargue ──
4
- os.environ["OMP_NUM_THREADS"] = "1"
5
-
6
- import gradio as gr, tempfile, shutil
7
  from ultralytics import YOLO
8
 
9
  # ────────────────────────────
10
- # Modelo
11
  # ────────────────────────────
12
- model = YOLO("best.pt") # se carga una sola vez al arrancar
 
13
 
 
 
 
 
14
 
15
  def infer(video):
16
- """Corre la detección sobre el vídeo subido y devuelve el vídeo anotado"""
17
- tmp = tempfile.mkdtemp()
18
- inp = os.path.join(tmp, "in.mp4")
19
- shutil.copy(video, inp)
20
- res = model.predict(source=inp, save=True, conf=0.25, iou=0.45)
21
- return os.path.join(res.save_dir, "in.mp4")
22
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  def show_classes():
25
- """Devuelve las clases aprendidas por el modelo en formato legible"""
26
- return ", ".join(model.names.values()) # ← FIX: usar los valores (str)
27
-
28
 
29
  # ────────────────────────────
30
- # UI en Blocks
31
  # ────────────────────────────
32
  with gr.Blocks(title="Kesherat · Inspección de palas eólicas") as demo:
33
  gr.Markdown("## Inspección de palas eólicas con YOLO")
@@ -43,4 +62,4 @@ with gr.Blocks(title="Kesherat · Inspección de palas eólicas") as demo:
43
  btn_classes.click(fn=show_classes, outputs=txt_classes)
44
 
45
  if __name__ == "__main__":
46
- demo.launch() # añade share=True si quieres enlace público
 
1
+ import gradio as gr
2
+ import tempfile
3
+ import shutil
4
  import os
 
 
 
 
5
  from ultralytics import YOLO
6
 
7
  # ────────────────────────────
8
+ # Configuración de entorno
9
  # ────────────────────────────
10
+ # Evita el error de OpenMP en algunos entornos
11
+ os.environ["OMP_NUM_THREADS"] = "1"
12
 
13
+ # ────────────────────────────
14
+ # Carga del modelo (sólo una vez)
15
+ # ────────────────────────────
16
+ model = YOLO("best.pt")
17
 
18
  def infer(video):
19
+ """
20
+ Corre la detección sobre el vídeo subido y devuelve
21
+ la ruta al vídeo resultante con las cajas dibujadas.
22
+ """
23
+ # 1) Crear un directorio temporal único por llamada
24
+ tmp_dir = tempfile.mkdtemp()
25
+ # 2) Copiar ahí el vídeo de entrada
26
+ orig_name = os.path.basename(video)
27
+ inp_path = os.path.join(tmp_dir, orig_name)
28
+ shutil.copy(video, inp_path)
29
+ # 3) Ejecutar la predicción y guardar resultados en tmp_dir/predict
30
+ results = model.predict(
31
+ source=inp_path,
32
+ save=True,
33
+ conf=0.25,
34
+ iou=0.45,
35
+ project=tmp_dir, # raíz de salida
36
+ name="predict" # subcarpeta dentro de tmp_dir
37
+ )
38
+ # 4) results es una lista de Results; tomamos el primero
39
+ save_dir = results[0].save_dir # pathlib.Path
40
+ # 5) El archivo de salida conserva el mismo nombre que el de entrada
41
+ out_path = os.path.join(save_dir, orig_name)
42
+ return out_path
43
 
44
  def show_classes():
45
+ """Devuelve las clases aprendidas por el modelo."""
46
+ return ", ".join(model.names)
 
47
 
48
  # ────────────────────────────
49
+ # Interfaz en Gradio Blocks
50
  # ────────────────────────────
51
  with gr.Blocks(title="Kesherat · Inspección de palas eólicas") as demo:
52
  gr.Markdown("## Inspección de palas eólicas con YOLO")
 
62
  btn_classes.click(fn=show_classes, outputs=txt_classes)
63
 
64
  if __name__ == "__main__":
65
+ demo.launch()