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"""

{template_rec.get('icon', 'šŸ”')} Hasil Deteksi Tuberculosis

Diagnosis: {diagnosis}

Tingkat Kepercayaan: {confidence:.1%}

Status Urgensi: {template_rec.get('urgency', 'TIDAK DIKETAHUI')}

""" # Add template recommendations result_html += f"""

šŸ“‹ Rekomendasi Standar Medis:

""" # Add AI recommendations if available if ai_advice: result_html += f"""

šŸ¤– Rekomendasi AI Cerdas:

{ai_advice.replace(chr(10), '
')}

""" else: result_html += """
āš ļø Fitur rekomendasi AI sementara tidak tersedia. Menggunakan rekomendasi standar medis.
""" # Add disclaimer result_html += """
āš ļø Disclaimer Medis: Hasil ini merupakan bantuan diagnosis awal. Konsultasi dengan tenaga medis profesional tetap diperlukan untuk diagnosis dan pengobatan yang akurat.
""" return result_html except Exception as e: return f"
Error: {str(e)}
" # Create Gradio interface demo = gr.Interface( fn=predict_tuberculosis, inputs=gr.Image(type="pil", label="šŸ“ Upload Chest X-Ray Image"), outputs=gr.HTML(label="šŸŽÆ Detection Result"), title="🩺 Tuberculosis Detection from Chest X-Ray", description="AI-powered tuberculosis detection with **{peak_accuracy:.1f}% accuracy**. Upload a chest X-ray image for instant analysis.\n\nāš ļø **Medical Disclaimer:** This tool is for educational purposes only. Always consult healthcare professionals for medical diagnosis.", examples=[ ["sample_Tuberculosis_0.jpg"], ["sample_Normal_0.jpg"] ] if all(os.path.exists(f) for f in ["sample_Tuberculosis_0.jpg", "sample_Normal_0.jpg"]) else [] ) if __name__ == "__main__": demo.launch()