|
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 |
|
|
|
|
|
nest_asyncio.apply() |
|
|
|
app = FastAPI(title="AI-Powered Multi-Disease Diagnostic System") |
|
|
|
|
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=["*"], |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
|
|
|
|
|
|
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_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"} |
|
|
|
|
|
|
|
|
|
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_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'} |
|
|
|
|
|
|
|
|
|
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_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'] |
|
|
|
|
|
|
|
|
|
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)}") |
|
|
|
|
|
|
|
|
|
@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)) |
|
|
|
|
|
|
|
|
|
@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)) |
|
|
|
|
|
|
|
|
|
@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.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) |