fcernafukuzaki's picture
Update app.py
7a15c7d verified
import os
import pandas as pd
import streamlit as st
import torch
from PIL import Image
from ultralytics import YOLO
from database_connect import db_connection
class YOLODetect():
def __init__(self, modelo):
self.modelo = modelo
def predecir(self, source, imgsz=1280, conf=0.7, iou=0.50):
# conf float 0.25 umbral de confianza del objeto para la detecci贸n
# iou float 0.7 umbral de intersecci贸n sobre uni贸n (IoU) para NMS
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
path_best_model = 'best.pt'
modelo_yolo = YOLO(path_best_model)
def detect_objects(size, iou, conf, im):
'''Wrapper fn for 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
#im = im.resize((int(x * g) for x in im.size), Image.LANCZOS) # resize with antialiasing
#im = np.asarray(im, dtype=np.float32)
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:
db_connection.insert_data('lego.lego_detectado', (size, iou, conf, user_text, feedback_text, check_status))
st.success("Se guard贸 el feeback exitosamente.")
except Exception as err:
print(err)
st.warning("Error al guardar el feedback.")
# Streamlit app layout
st.title('YOLOv8 Detecci贸n de figuras LEGO')
# Input
col1, col2 = st.columns(2)
with col1:
iou_threshold = st.slider("NMS IoU Threshold (0.0 - 1.0)", 0.0, 1.0, 0.8, key="iou")
conf_threshold = st.slider("Umbral o threshold (0.0 - 1.0)", 0.0, 1.0, 0.9, key="conf")
with col2:
size = st.selectbox("Tama帽o de la imagen", options=["640", "1280"], key="size")
uploaded_image = st.file_uploader("Cargar imagen", type=["jpg", "jpeg", "png"], key="image")
# Process uploaded image
if uploaded_image is not None:
image = Image.open(uploaded_image)
result_image, objects_nested_list = detect_objects(size=int(size), iou=iou_threshold, conf=conf_threshold, im=image)
object_count = len(objects_nested_list)
if result_image is not None:
col1, col2 = st.columns(2)
with col1:
st.image(image, caption="Imagen original", use_column_width=True)
with col2:
st.image(result_image, caption="Resultado", use_column_width=True)
with st.form("my_form", clear_on_submit=True):
st.title("Formulario para feedback")
st.write(f'Cantidad detectados: {object_count}')
st.table(objects_nested_list)
check_status = st.checkbox("驴El resultado contiene la cantidad correcta de figuras detectadas?", value=False)
user_text = st.text_input("Ingrese el nombre del usuario que realiz贸 la prueba (m谩ximo 50 caracteres)", max_chars=50)
feedback_text = st.text_input("Ingrese su feedback (m谩ximo 100 caracteres)", max_chars=100)
# save_button = st.button("Guardar feedback")
save_button = st.form_submit_button('Guardar feedback')
if save_button:
save_feedback(size=int(size), iou=iou_threshold, conf=conf_threshold,
object_count_detected=object_count,
objects_list=objects_nested_list,
user_text=user_text, feedback_text=feedback_text, check_status=check_status)
else:
st.warning("Error procesando la imagen. Volver a probar.")