import gradio as gr import torch from torchvision import transforms from PIL import Image import timm import numpy as np import os import google.generativeai as genai # Load model function def load_tb_detection_model(): """Load the trained TB detection model""" package = torch.load("tb_detection_complete_model.pth", map_location="cpu") model = timm.create_model( package["model_architecture"], pretrained=False, num_classes=len(package["class_names"]) ) model.load_state_dict(package["model_state_dict"]) model.eval() return model, package # Load model and config model, config = load_tb_detection_model() class_names = config["class_names"] peak_accuracy = config["peak_accuracy"] # Gemini API Setup - š GANTI DENGAN API KEY ANDA! GEMINI_API_KEY = "AIzaSyCAOpTxHISV5J3bZm0yzRWbBKr4fryJ93Y" try: genai.configure(api_key=GEMINI_API_KEY) GEMINI_AVAILABLE = True print("ā Gemini API connected") except: GEMINI_AVAILABLE = False print("ā Gemini API not available") # Template recommendations TEMPLATE_RECOMMENDATIONS = { "Tuberculosis": { "urgency": "TINGGI", "color": "#ff4444", "icon": "ā ļø", "actions": [ "š Segera konsultasi dokter spesialis paru", "š¬ Lakukan tes dahak & rontgen thorax lengkap", "š Isolasi diri untuk mencegah penularan", "š Konsultasi pengobatan DOTS dengan dokter" ] }, "Normal": { "urgency": "RENDAH", "color": "#44ff44", "icon": "ā ", "actions": [ "š Pertahankan gaya hidup sehat", "š Lakukan pemeriksaan rutin tahunan", "šŖ Monitor kesehatan pernapasan berkala" ] } } # Define transforms transform = transforms.Compose([ transforms.Resize((config["image_size"], config["image_size"])), transforms.ToTensor(), transforms.Normalize(config["normalization_mean"], config["normalization_std"]) ]) def diagnose_tuberculosis(image_path, model, transforms, class_names): """Perform TB diagnosis on a single image""" image = Image.open(image_path).convert("RGB") input_tensor = transforms(image).unsqueeze(0) model.eval() with torch.no_grad(): output = model(input_tensor) probabilities = torch.nn.functional.softmax(output[0], dim=0) predicted_class = torch.argmax(probabilities).item() confidence = probabilities[predicted_class].item() diagnosis = class_names[predicted_class] return diagnosis, confidence def get_gemini_medical_advice(diagnosis, confidence): """Get AI-powered medical recommendations from Gemini""" if not GEMINI_AVAILABLE: return None try: model = genai.GenerativeModel("gemini-pro") prompt = f""" Sebagai asisten medis AI, berikan rekomendasi singkat (3-4 poin) dalam Bahasa Indonesia untuk: Diagnosis: {diagnosis} Tingkat Kepercayaan AI: {confidence:.1%} Format: poin-poin praktis tanpa disclaimer berulang. Contoh format: ⢠Poin pertama ⢠Poin kedua ⢠Poin ketiga Fokus pada tindakan praktis yang bisa dilakukan pasien. """ response = model.generate_content(prompt) return response.text except Exception as e: print(f"Gemini API error: {e}") return None def predict_tuberculosis(image): """Enhanced prediction with template + AI recommendations""" try: # Save temporary image temp_path = "temp_medical_image.jpg" image.save(temp_path) # Get basic diagnosis diagnosis, confidence = diagnose_tuberculosis(temp_path, model, transform, class_names) # Get template recommendations template_rec = TEMPLATE_RECOMMENDATIONS.get(diagnosis, {}) # Get AI recommendations from Gemini ai_advice = get_gemini_medical_advice(diagnosis, confidence) if GEMINI_AVAILABLE else None # Clean up if os.path.exists(temp_path): os.remove(temp_path) # Build result HTML result_html = f"""
Diagnosis: {diagnosis}
Tingkat Kepercayaan: {confidence:.1%}
Status Urgensi: {template_rec.get('urgency', 'TIDAK DIKETAHUI')}
""" # Add template recommendations result_html += f"""{ai_advice.replace(chr(10), '
')}