import traceback # Asegúrate de tener esto al inicio de tu script def analizar_lesion_combined(img): try: # Convertir imagen para Fastai img_fastai = PILImage.create(img) # ViT prediction inputs = feature_extractor(img, return_tensors="pt") with torch.no_grad(): outputs = model_vit(**inputs) probs_vit = outputs.logits.softmax(dim=-1).cpu().numpy()[0] pred_idx_vit = int(np.argmax(probs_vit)) pred_class_vit = CLASSES[pred_idx_vit] confidence_vit = probs_vit[pred_idx_vit] # Fast.ai models pred_fast_malignant, _, probs_fast_mal = model_malignancy.predict(img_fastai) prob_malignant = float(probs_fast_mal[1]) # índice 1 = maligno pred_fast_type, _, probs_fast_type = model_norm2000.predict(img_fastai) # Modelo TensorFlow ISIC (usando TFSMLayer) x_isic = preprocess_image_isic(img) preds_isic_dict = model_isic(x_isic) print("🔍 Claves de salida de model_isic:", preds_isic_dict.keys()) key = list(preds_isic_dict.keys())[0] preds_isic = preds_isic_dict[key].numpy()[0] pred_idx_isic = int(np.argmax(preds_isic)) pred_class_isic = CLASSES[pred_idx_isic] confidence_isic = preds_isic[pred_idx_isic] # Gráfico ViT colors_bars = [RISK_LEVELS[i]['color'] for i in range(7)] fig, ax = plt.subplots(figsize=(8, 3)) ax.bar(CLASSES, probs_vit*100, color=colors_bars) ax.set_title("Probabilidad ViT por tipo de lesión") ax.set_ylabel("Probabilidad (%)") ax.set_xticks(np.arange(len(CLASSES))) ax.set_xticklabels(CLASSES, rotation=45, ha='right') ax.grid(axis='y', alpha=0.2) plt.tight_layout() buf = io.BytesIO() plt.savefig(buf, format="png") plt.close(fig) img_bytes = buf.getvalue() img_b64 = base64.b64encode(img_bytes).decode("utf-8") html_chart = f'' # Informe HTML con los 4 modelos informe = f"""

🧪 Diagnóstico por 4 modelos de IA

🔍 ModeloResultadoConfianza
🧠 ViT (transformer){pred_class_vit}{confidence_vit:.1%}
🧬 Fast.ai (clasificación){pred_fast_type}N/A
⚠️ Fast.ai (malignidad){"Maligno" if prob_malignant > 0.5 else "Benigno"}{prob_malignant:.1%}
🔬 ISIC TensorFlow{pred_class_isic}{confidence_isic:.1%}

🩺 Recomendación automática:
""" cancer_risk_score = sum(probs_vit[i] * RISK_LEVELS[i]['weight'] for i in range(7)) if prob_malignant > 0.7 or cancer_risk_score > 0.6: informe += "🚨 CRÍTICO – Derivación urgente a oncología dermatológica" elif prob_malignant > 0.4 or cancer_risk_score > 0.4: informe += "⚠️ ALTO RIESGO – Consulta con dermatólogo en 7 días" elif cancer_risk_score > 0.2: informe += "📋 RIESGO MODERADO – Evaluación programada (2-4 semanas)" else: informe += "✅ BAJO RIESGO – Seguimiento de rutina (3-6 meses)" informe += "
" return informe, html_chart except Exception as e: print("🔴 ERROR en analizar_lesion_combined:") print(str(e)) traceback.print_exc() return f"Error interno: {str(e)}", ""