Spaces:
Sleeping
Sleeping
| import os | |
| import numpy as np | |
| import tensorflow as tf | |
| from PIL import Image | |
| from django.conf import settings | |
| # Define the path to the model | |
| MODEL_PATH = os.path.join(settings.BASE_DIR, 'model', 'efficientnet_b0.h5') | |
| model = None | |
| # Load the model once when the server starts | |
| try: | |
| model = tf.keras.models.load_model(MODEL_PATH) | |
| print("✅ ML Model Loaded Successfully") | |
| except Exception as e: | |
| print(f"⚠️ ML Model not found or error loading: {e}. Using dummy mode.") | |
| def predict_xray(image_file): | |
| """ | |
| Predicts if an X-ray image is Positive (Tuberculosis) or Negative (Normal). | |
| """ | |
| if not model: | |
| # Dummy fallback if model didn't load | |
| return "Negative", 85.5, "Low" | |
| try: | |
| # 1. Load and Preprocess Image | |
| # Convert to RGB to ensure 3 channels | |
| img = Image.open(image_file).convert('RGB') | |
| # Resize to 128x128 (Must match your training notebook size) | |
| img = img.resize((128, 128)) | |
| # Convert to array and add batch dimension | |
| img_array = tf.keras.preprocessing.image.img_to_array(img) | |
| img_array = np.expand_dims(img_array, axis=0) | |
| # CRITICAL FIX: Normalize pixel values to 0-1 range | |
| img_array = img_array / 255.0 | |
| # 2. Make Prediction | |
| # Expected output shape: [[prob_normal, prob_tb]] | |
| prediction = model.predict(img_array) | |
| # Get the class with the highest probability | |
| # Class 0 = Normal, Class 1 = Tuberculosis | |
| class_idx = np.argmax(prediction, axis=1)[0] | |
| confidence = float(np.max(prediction)) | |
| # 3. Interpret Results | |
| if class_idx == 1: | |
| result = "Positive" # Tuberculosis detected | |
| if confidence > 0.8: | |
| risk_level = "High" | |
| elif confidence >= 0.5: | |
| risk_level = "Medium" | |
| else: | |
| risk_level = "Low" | |
| else: | |
| result = "Negative" # Normal | |
| risk_level = "Low" | |
| return (result, round(confidence * 100, 2), risk_level) | |
| except Exception as e: | |
| print(f"❌ Error processing image: {e}") | |
| # Return error state or safe default | |
| return "Error", 0.0, "Low" |