import streamlit as st import pandas as pd from PIL import Image import sys import os # --- CORRECCIÓN DE RUTAS --- current_dir = os.path.dirname(os.path.abspath(__file__)) src_path = os.path.join(current_dir, 'src') # Quitamos la barra inicial '/' que causaba error en Linux sys.path.append(os.path.abspath(src_path)) try: from inference import MemePredictor except ImportError as e: st.error(f"Error crítico de importación: {e}") st.stop() # --- 1. CONFIGURACIÓN DE PÁGINA --- st.set_page_config( page_title="DIME-MEX", layout="centered", initial_sidebar_state="collapsed" ) # --- 2. ESTILOS CSS "APPLE STYLE" --- st.markdown(""" """, unsafe_allow_html=True) # --- 3. CARGA DEL MOTOR --- @st.cache_resource def get_engine(): return MemePredictor() try: predictor = get_engine() except Exception as e: st.error(f"Error iniciando el motor: {e}") st.stop() # --- 4. INTERFAZ DE USUARIO --- st.markdown("
Análisis de contenido mediante IA.
", unsafe_allow_html=True) st.write("") # Configuración with st.expander("Elegir modelo"): task_mode = st.radio( "Sensibilidad del modelo", options=["simple", "complex"], format_func=lambda x: "Estándar ( none, inappropriate, hate-speech )" if x == "simple" else "Detallado ( none, inappropriate, sexism, racism, classicis, hate-speech )", label_visibility="collapsed" ) # Carga uploaded_file = st.file_uploader("Subir imagen", type=["jpg", "png", "jpeg"], label_visibility="collapsed") if uploaded_file is not None: image = Image.open(uploaded_file) st.image(image, use_container_width=True) st.write("") # Botón de Acción if st.button("Analizar"): with st.spinner("Analizando..."): try: result = predictor.predict(uploaded_file, task=task_mode) if "error" in result: # Mostrar error lógico (del backend) st.error(f"Error de procesamiento: {result['error']}") else: st.write("") # --- RESULTADOS --- col1, col2 = st.columns(2) with col1: st.metric(label="Clasificación", value=result['label']) with col2: st.metric(label="Certeza", value=f"{result['confidence']:.1%}") st.progress(result['confidence']) # --- DETALLES --- st.write("") with st.expander("Detalles del análisis"): st.caption("TEXTO DETECTADO") # Usamos .get() para evitar errores si la clave no existe st.markdown(f"_{result.get('ocr_text', 'No disponible')}_") st.write("") st.caption("PROBABILIDADES") if 'all_labels' in result and 'probabilities' in result: chart_data = pd.DataFrame({ "Categoría": result['all_labels'], "Probabilidad": result['probabilities'] }) st.bar_chart(chart_data.set_index("Categoría"), color="#86868b") # --- CAPTURA DE ERROR TÉCNICO (AQUÍ VERÁS QUÉ PASA) --- except Exception as e: st.error(f"Error técnico crítico: {str(e)}") # Pista probable if "libGL" in str(e): st.warning("Falta el archivo 'packages.txt' con libgl1 en el repositorio.")