Spaces:
Sleeping
Sleeping
| # -*- coding: utf-8 -*- | |
| """app.ipynb | |
| Automatically generated by Colab. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1sjyLFLqBccpUzaUi4eyyP3NYE3gDtHfs | |
| """ | |
| import streamlit as st | |
| from streamlit_option_menu import option_menu | |
| import tensorflow as tf | |
| from tensorflow import keras | |
| import numpy as np | |
| import pandas as pd | |
| import torch | |
| import torch.nn as nn | |
| import torch.nn.functional as F | |
| from torchvision import transforms | |
| from PIL import Image | |
| import os | |
| import time | |
| from efficientnet_pytorch import EfficientNet | |
| from fastai.vision.all import load_learner | |
| # Set up environment variables for GPU handling | |
| os.environ['CUDA_VISIBLE_DEVICES'] = '-1' | |
| # Cache to load models efficiently | |
| def load_skin_model(): | |
| model = MelanomaModel(out_size=9) | |
| model_path = "multi_weight.pth" | |
| checkpoint = torch.load(model_path, map_location=torch.device('cpu'), weights_only=False) | |
| model.load_state_dict(checkpoint["model_state_dict"]) | |
| model.eval() | |
| return model | |
| # Transform for skin lesion images | |
| transform = transforms.Compose([ | |
| transforms.Resize(256), | |
| transforms.CenterCrop(224), | |
| transforms.ToTensor(), | |
| transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) | |
| ]) | |
| # Diagnosis map for skin disease model | |
| DIAGNOSIS_MAP = { | |
| 0: 'Melanoma', 1: 'Melanocytic nevus', 2: 'Basal cell carcinoma', 3: 'Actinic keratosis', | |
| 4: 'Benign keratosis', 5: 'Dermatofibroma', 6: 'Vascular lesion', 7: 'Squamous cell carcinoma', 8: 'Unknown' | |
| } | |
| # Model for skin lesion classification | |
| class MelanomaModel(nn.Module): | |
| def __init__(self, out_size, dropout_prob=0.5): | |
| super(MelanomaModel, self).__init__() | |
| self.efficient_net = EfficientNet.from_pretrained('efficientnet-b0') | |
| self.efficient_net._fc = nn.Identity() | |
| self.fc1 = nn.Linear(1280, 512) | |
| self.fc2 = nn.Linear(512, 256) | |
| self.fc3 = nn.Linear(256, out_size) | |
| self.dropout = nn.Dropout(dropout_prob) | |
| def forward(self, x): | |
| x = self.efficient_net(x) | |
| x = x.view(x.size(0), -1) | |
| x = F.relu(self.fc1(x)) | |
| x = self.dropout(x) | |
| x = F.relu(self.fc2(x)) | |
| x = self.dropout(x) | |
| x = self.fc3(x) | |
| return x | |
| # Alzheimer's Prediction | |
| def load_alzheimer_model(): | |
| return keras.models.load_model('alzheimer_99.5.h5') | |
| # Brain Tumor Prediction | |
| def load_brain_tumor_model(classes): | |
| if classes == '44 Classes': | |
| return keras.models.load_model('44class_96.5.h5') | |
| elif classes == '17 Classes': | |
| return keras.models.load_model('17class_98.1.h5') | |
| elif classes == '15 Classes': | |
| return keras.models.load_model('15class_99.8.h5') | |
| else: # Default 2 classes | |
| return keras.models.load_model('2calss_lagre_dataset_99.1.h5') | |
| # Prediction for Skin Disease | |
| def predict_skin_lesion(img: Image.Image, model: nn.Module): | |
| img_tensor = transform(img).unsqueeze(0) | |
| with torch.no_grad(): | |
| outputs = model(img_tensor) | |
| probs = F.softmax(outputs, dim=1) | |
| top_probs, top_idxs = torch.topk(probs, 3, dim=1) | |
| predictions = [(DIAGNOSIS_MAP.get(idx.item(), "Unknown"), prob.item() * 100) for prob, idx in zip(top_probs[0], top_idxs[0])] | |
| return predictions | |
| # Prediction for Brain Tumor and Alzheimer | |
| def predict(img_path, model, result_classes): | |
| img = tf.keras.utils.load_img(img_path, target_size=(224, 224)) | |
| img_array = np.array(img).reshape(-1, 224, 224, 3) | |
| pred = model.predict(img_array) | |
| return result_classes[np.argmax(pred, axis=1)[0]] | |
| # Sidebar for Disease Categories | |
| def spr_sidebar(): | |
| menu = option_menu( | |
| menu_title="Navigation", | |
| options=["Brain Tumor", "Alzheimer", "Skin Disease", "Eye Disease", "About"], | |
| icons=["house", "brain", "microscope", "eye", "info-square"], | |
| menu_icon="cast", | |
| default_index=0, | |
| orientation="horizontal" | |
| ) | |
| return menu | |
| # Home Page Content | |
| def home_page(selected_category): # Accept selected_category as a parameter | |
| st.title("Disease Detection Web App") | |
| uploaded_file = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"]) | |
| if uploaded_file is not None: | |
| st.image(uploaded_file, caption="Uploaded Image", use_column_width=True) | |
| if st.button("Classify"): | |
| if selected_category == "Brain Tumor": | |
| classes = st.selectbox("Select Number of Classes", ['44 Classes', '17 Classes', '15 Classes', '2 Classes']) | |
| model = load_brain_tumor_model(classes) | |
| result_classes = ['Astrocitoma', 'Carcinoma', 'Ependimoma', '_NORMAL', 'etc...'] # Define all the classes | |
| result = predict(uploaded_file, model, result_classes) | |
| st.success(f"Prediction: {result}") | |
| elif selected_category == "Alzheimer": | |
| model = load_alzheimer_model() | |
| result_classes = ['Mild_Demented', 'Moderate_Demented', 'Non_Demented'] | |
| result = predict(uploaded_file, model, result_classes) | |
| st.success(f"Prediction: {result}") | |
| elif selected_category == "Skin Disease": | |
| model = load_skin_model() | |
| img = Image.open(uploaded_file) | |
| predictions = predict_skin_lesion(img, model) | |
| for idx, (label, confidence) in enumerate(predictions, 1): | |
| st.write(f"{idx}. {label}: {confidence:.2f}%") | |
| elif selected_category == "Eye Disease": | |
| # Implement Eye Disease prediction (similar to others) | |
| pass | |
| # About Page Content | |
| def about_page(): | |
| st.header('About the Project') | |
| st.write(""" | |
| This web app detects different diseases using machine learning models. | |
| The diseases it covers include: | |
| """) | |
| st.subheader("1. Brain Tumor Detection") | |
| st.write(""" | |
| **Brain Tumor Detection** involves classifying various types of brain tumors using image analysis. | |
| The model can identify different classes of brain tumors such as Astrocytomas, Gliomas, and more. | |
| It aids doctors in diagnosing brain tumors early for timely intervention. | |
| """) | |
| st.subheader("2. Alzheimer’s Disease Detection") | |
| st.write(""" | |
| **Alzheimer's Disease Detection** focuses on predicting the stages of Alzheimer's disease from brain scans. | |
| It classifies the brain images into stages such as Mild Demented, Moderate Demented, and Non-Demented. | |
| Early detection of Alzheimer's can help in planning the appropriate treatment for patients. | |
| """) | |
| st.subheader("3. Skin Disease Classification") | |
| st.write(""" | |
| **Skin Disease Classification** uses deep learning models to detect and classify different types of skin lesions. | |
| This includes conditions like Melanoma, Basal Cell Carcinoma, and various benign lesions. | |
| Early detection of skin cancer, like Melanoma, can significantly improve the survival rate of patients. | |
| """) | |
| st.subheader("4. Eye Disease Detection") | |
| st.write(""" | |
| **Eye Disease Detection** (TBD) focuses on diagnosing eye conditions from images of the eye. | |
| This could include diseases such as diabetic retinopathy, cataracts, and glaucoma, which can affect vision and lead to blindness if untreated. | |
| """) | |
| st.write(""" | |
| This is a project by **Fawad Haider** and **Sameer Ahmed**. | |
| We aim to assist healthcare professionals in diagnosing various diseases early, improving the accuracy of predictions using AI and deep learning models. | |
| """) | |
| # Main Function to Run the App | |
| def main(): | |
| selected_category = spr_sidebar() | |
| if selected_category == "Brain Tumor": | |
| home_page(selected_category) # Pass selected_category here | |
| elif selected_category == "Alzheimer": | |
| home_page(selected_category) # Pass selected_category here | |
| elif selected_category == "Skin Disease": | |
| home_page(selected_category) # Pass selected_category here | |
| elif selected_category == "Eye Disease": | |
| home_page(selected_category) # Pass selected_category here | |
| elif selected_category == "About": | |
| about_page() | |
| if __name__ == '__main__': | |
| main() | |