import os import pandas as pd import torch from PIL import Image from ultralytics import YOLO import gradio as gr class YOLODetect(): def __init__(self, modelo): self.modelo = modelo def predecir(self, source, imgsz=640, conf=0.7, iou=0.50): self.results = self.modelo.predict(source=source, save=True, imgsz=imgsz, conf=conf, iou=iou) return self.results def render(self): result = self.results[0] file_name = os.path.join(result.save_dir, result.path) render = Image.open(file_name) return render # Inicializa el modelo YOLOv8 path_best_model = 'yolov8n-pose.pt' modelo_yolo = YOLO(path_best_model) def detect_objects(im, size, iou, conf): '''Wrapper para Gradio''' g = (int(size) / max(im.size)) # gain im = im.resize(tuple([int(x * g) for x in im.size]), Image.LANCZOS) # resize with antialiasing model = YOLODetect(modelo_yolo) results = model.predecir(source=im, imgsz=int(size), conf=conf, iou=iou) objects_detected = results[0].boxes.cls.tolist() # Clases detectadas. objects_conf = results[0].boxes.conf.tolist() # Probabilidad de detección por clase detectada. objects_nested_list = pd.DataFrame({'Clase': objects_detected, 'Probabilidad': objects_conf}) result_img = model.render() return result_img, objects_nested_list def save_feedback(size, iou, conf, object_count_detected, objects_list, user_text, feedback_text, check_status): try: # Aquí puede ir el código para almacenar los datos en una base de datos. return "Se guardó el feedback exitosamente." except Exception as err: print(err) return "Error al guardar el feedback." # Configura la interfaz de Gradio with gr.Blocks() as demo: gr.Markdown("# YOLOv8 Detección de postura") with gr.Row(): iou_threshold = gr.Slider(label="NMS IoU Threshold (0.0 - 1.0)", minimum=0.0, maximum=1.0, value=0.8) conf_threshold = gr.Slider(label="Umbral o threshold (0.0 - 1.0)", minimum=0.0, maximum=1.0, value=0.9) size = gr.Dropdown(label="Tamaño de la imagen", choices=["640", "1280"], value="640") with gr.Row(): uploaded_image = gr.Image(type="pil", label="Cargar imagen") result_image = gr.Image(label="Resultado") detect_btn = gr.Button("Detectar postura") objects_table = gr.DataFrame(label="Objetos detectados") feedback = gr.Textbox(label="Ingrese su feedback (máximo 100 caracteres)", max_lines=2) user_text = gr.Textbox(label="Ingrese el nombre del usuario (máximo 50 caracteres)", max_lines=2) check_status = gr.Checkbox(label="¿El resultado contiene la cantidad correcta de figuras detectadas?", value=False) save_btn = gr.Button("Guardar feedback") output_message = gr.Textbox(label="Mensaje de salida", interactive=False) detect_btn.click(fn=detect_objects, inputs=[uploaded_image, size, iou_threshold, conf_threshold], outputs=[result_image, objects_table]) save_btn.click(fn=save_feedback, inputs=[size, iou_threshold, conf_threshold, objects_table, user_text, feedback, check_status], outputs=[output_message]) # Ejecuta la interfaz de Gradio if __name__ == "__main__": demo.launch()