File size: 9,675 Bytes
18d216a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
from IPython import get_ipython
from IPython.display import display
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import numpy as np
import pandas as pd
import joblib
import keras
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import load_model
from sklearn.preprocessing import StandardScaler
import io
from PIL import Image
from pyngrok import ngrok
import nest_asyncio
import uvicorn
import cv2
import base64

# Fix async issues in Colab
nest_asyncio.apply()

app = FastAPI(title="AI-Powered Multi-Disease Diagnostic System")


# Add CORS middleware to allow request from all origins
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Allows all origins
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

#################################
# DIABETES MODEL AND ENDPOINT
#################################
diabetes_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Diabetes/SVM.joblib"
diabetes_dataset_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/diabetes.csv"

diabetes_model = joblib.load(diabetes_model_path)
diabetes_df = pd.read_csv(diabetes_dataset_path)
diabetes_scaler = StandardScaler()
diabetes_scaler.fit(diabetes_df.drop(columns="Outcome", axis=1))

class DiabetesInput(BaseModel):
    pregnancies: int
    glucose: float
    blood_pressure: float
    skin_thickness: float
    insulin: float
    bmi: float
    diabetes_pedigree: float
    age: int

@app.post("/diabetes/predict")
def predict_diabetes(data: DiabetesInput):
    input_data = np.array([[data.pregnancies, data.glucose, data.blood_pressure,
                            data.skin_thickness, data.insulin, data.bmi,
                            data.diabetes_pedigree, data.age]])
    input_scaled = diabetes_scaler.transform(input_data)
    prediction = diabetes_model.predict(input_scaled)[0]
    return {"prediction": "Diabetic" if prediction == 1 else "Non-Diabetic"}

#################################
# HEART DISEASE MODEL AND ENDPOINT
#################################
heart_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Heart/saved_models/Support Vector Machine_model.pkl"
heart_dataset_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/heart.csv"

heart_model = joblib.load(heart_model_path)
heart_df = pd.read_csv(heart_dataset_path)
heart_scaler = StandardScaler()
heart_scaler.fit(heart_df.drop(columns="target", axis=1))

class HeartDiseaseInput(BaseModel):
    age: int
    sex: int
    cp: int
    trestbps: float
    chol: float
    fbs: int
    restecg: int
    thalach: float
    exang: int
    oldpeak: float
    slope: int
    ca: int
    thal: int

@app.post("/heart_disease/predict")
def predict_heart_disease(data: HeartDiseaseInput):
    input_data = np.array([[data.age, data.sex, data.cp, data.trestbps, data.chol,
                            data.fbs, data.restecg, data.thalach, data.exang, data.oldpeak,
                            data.slope, data.ca, data.thal]])
    input_scaled = heart_scaler.transform(input_data)
    prediction = heart_model.predict(input_scaled)[0]
    return {"prediction": "Heart Disease Detected" if prediction == 1 else "No Heart Disease"}

#################################
# PARKINSON'S DISEASE MODEL AND ENDPOINT
#################################
parkinsons_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Parkinsons/New_Updated_Models/SVM_model.joblib"
parkinsons_scaler_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Parkinsons/New_Updated_Models/scaler.joblib"

parkinsons_model = joblib.load(parkinsons_model_path)
parkinsons_scaler = joblib.load(parkinsons_scaler_path)

class ParkinsonsInput(BaseModel):
    MDVP_Fo: float
    MDVP_Fhi: float
    MDVP_Flo: float
    MDVP_Jitter_percent: float
    MDVP_Jitter_Abs: float
    MDVP_RAP: float
    MDVP_PPQ: float
    Jitter_DDP: float
    MDVP_Shimmer: float
    MDVP_Shimmer_dB: float
    Shimmer_APQ3: float
    Shimmer_APQ5: float
    MDVP_APQ: float
    Shimmer_DDA: float
    NHR: float
    HNR: float
    RPDE: float
    DFA: float
    spread1: float
    spread2: float
    D2: float
    PPE: float

@app.post("/parkinsons/predict")
def predict_parkinsons(data: ParkinsonsInput):
    input_data = np.array([[data.MDVP_Fo, data.MDVP_Fhi, data.MDVP_Flo, data.MDVP_Jitter_percent,
                            data.MDVP_Jitter_Abs, data.MDVP_RAP, data.MDVP_PPQ, data.Jitter_DDP,
                            data.MDVP_Shimmer, data.MDVP_Shimmer_dB, data.Shimmer_APQ3, data.Shimmer_APQ5,
                            data.MDVP_APQ, data.Shimmer_DDA, data.NHR, data.HNR, data.RPDE,
                            data.DFA, data.spread1, data.spread2, data.D2, data.PPE]])
    input_scaled = parkinsons_scaler.transform(input_data)
    prediction = parkinsons_model.predict(input_scaled)[0]
    probability = parkinsons_model.predict_proba(input_scaled)[:, 1][0]
    return {
        "prediction": "Parkinson's Detected" if prediction == 1 else "No Parkinson's",
        "probability": probability
    }

#################################
# BREAST CANCER DETECTION MODEL AND ENDPOINT
#################################
breast_cancer_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Breast Cancer Detection/Breast Cancer Detection DenseNet121/Breast_Cancer_Detection_DenseNet121.h5"
breast_cancer_model = keras.models.load_model(breast_cancer_model_path)
breast_cancer_labels = {0: 'benign', 1: 'malignant', 2: 'normal'}

#################################
# TUBERCULOSIS DETECTION MODEL AND ENDPOINT
#################################
tb_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Tuberculosis Classification/Tuberculosis Classification DenseNet/Tuberculosis_detection_DenseNet169.h5"
tb_model = load_model(tb_model_path)
tb_labels = {0: "Normal", 1: "Tuberculosis"}

#################################
# BRAIN TUMOR DETECTION MODEL AND ENDPOINT
#################################
brain_tumor_model_path = "/content/drive/MyDrive/AI Powered Multi Disease Diagnostic System/Brain Tumor Detection/Brain Tumor VGG16/Brain_tumor_VGG16.h5"
brain_tumor_model = load_model(brain_tumor_model_path, compile=False)
brain_tumor_labels = ['Glioma Tumor', 'Meningioma Tumor', 'No Tumor', 'Pituitary Tumor']

#################################
# UTILITY: BASE64 IMAGE CONVERSION
#################################
class Base64ImageRequest(BaseModel):
    base64_image: str

def base64_to_array(base64_string, target_size=(256, 256)):
    """
    Convert a Base64 string to a NumPy image array with a given target size.
    """
    try:
        image_bytes = base64.b64decode(base64_string)
        img = Image.open(io.BytesIO(image_bytes)).convert("RGB")
        img = img.resize(target_size)
        img_array = image.img_to_array(img)
        img_array = np.expand_dims(img_array, axis=0) / 255.0
        return img_array
    except Exception as e:
        raise HTTPException(status_code=400, detail=f"Invalid image data: {str(e)}")

#################################
# BREAST CANCER PREDICTION ENDPOINT (256x256 input)
#################################
@app.post("/breast_cancer/predict")
async def predict_cancer(request: Base64ImageRequest):
    try:
        img_array = base64_to_array(request.base64_image, target_size=(256, 256))
        prediction = breast_cancer_model.predict(img_array)
        predicted_label_index = np.argmax(prediction)
        predicted_label = breast_cancer_labels.get(predicted_label_index, "Unknown")
        confidence = np.max(prediction) * 100
        return {
            "predicted_class": predicted_label,
            "confidence": f"{confidence:.2f}%",
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

#################################
# TUBERCULOSIS PREDICTION ENDPOINT (224x224 input)
#################################
@app.post("/tuberculosis/predict")
async def predict_tuberculosis(request: Base64ImageRequest):
    try:
        img_array = base64_to_array(request.base64_image, target_size=(224, 224))
        y_pred = tb_model.predict(img_array)
        predicted_label_index = np.argmax(y_pred, axis=1)[0]
        predicted_label = tb_labels.get(predicted_label_index, "Unknown")
        confidence = np.max(y_pred) * 100
        return {
            "prediction": predicted_label,
            "confidence": f"{confidence:.2f}%",
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

#################################
# BRAIN TUMOR PREDICTION ENDPOINT (224x224 input)
#################################
@app.post("/brain_tumor/predict")
async def predict_brain_tumor(request: Base64ImageRequest):
    try:
        img_array = base64_to_array(request.base64_image, target_size=(224, 224))
        predictions = brain_tumor_model.predict(img_array)
        predicted_class = np.argmax(predictions)
        confidence = np.max(predictions) * 100
        return {
            "prediction": brain_tumor_labels[predicted_class],
            "confidence": f"{confidence:.2f}%",
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

#################################
# NGROK & SERVER SETUP
#################################
ngrok.set_auth_token("28WOZmFsePzDohg4URD5MU7tgBN_3onpraLYjUsXNXoB4iiro")
ngrok_tunnel = ngrok.connect(8000)
print(f"FastAPI running at {ngrok_tunnel.public_url}")
uvicorn.run(app, host="0.0.0.0", port=8000)