Spaces:
Build error
Build error
| import streamlit as st | |
| import tensorflow as tf | |
| from PIL import Image | |
| import numpy as np | |
| from tensorflow.keras.applications.efficientnet import EfficientNetB7 as PretrainedModel, preprocess_input | |
| from tensorflow.keras.layers import GlobalAveragePooling2D, Flatten, Dense | |
| from tensorflow.keras.models import Model | |
| from skimage.filters import threshold_otsu | |
| import cv2 | |
| import time | |
| X = Y = 224 | |
| import os | |
| os.environ["CUDA_VISIBLE_DEVICES"] = "-1" | |
| def preprocess_image(image, predicted_label): | |
| img= cv2.imread(image.name) | |
| img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) | |
| img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) | |
| thresh = threshold_otsu(img_gray) | |
| img_otsu = img_gray < thresh | |
| total_area = img_otsu.size | |
| black_area = np.count_nonzero(img_otsu == 0) | |
| white_area = np.count_nonzero(img_otsu == 1) | |
| #print(total_area) | |
| #print(white_area) | |
| #print(black_area) | |
| if predicted_label != 'lung_n': | |
| if white_area >= 300000: | |
| level = 3 | |
| elif 200000 <= white_area < 3000000: | |
| level = 2 | |
| elif 100000 <= white_area < 200000: | |
| level = 1 | |
| elif white_area < 100000: | |
| level = 0 | |
| if level == 3: | |
| st.error("Cancer type: "+ predicted_label ) | |
| st.error("Level of Cancer: 3") | |
| #st.error("Please consult a doctor immediately") | |
| elif level == 2: | |
| st.warning("Cancer type: "+ predicted_label ) | |
| st.warning("Level of Cancer: 2") | |
| elif level == 1: | |
| st.info("Cancer type: "+ predicted_label) | |
| st.info("Level of Cancer: 1") | |
| elif level == 0: | |
| st.success("Cancer type: "+ predicted_label) | |
| st.success("Level of Cancer: 0") | |
| else: | |
| st.success("Predicted as Lung with Benign Tumor") | |
| # Create a Streamlit application | |
| def main(): | |
| st.title('Lung Cancer Detection & Severity Level using Deep Learning') | |
| input_shape = (X, Y, 3) | |
| K = 3 | |
| start_time = time.time() | |
| ptm = PretrainedModel( | |
| input_shape=(X, Y, 3), | |
| weights='imagenet', | |
| include_top=False | |
| ) | |
| ptm.trainable = False | |
| x = GlobalAveragePooling2D()(ptm.output) | |
| x = Flatten()(x) | |
| x = Dense(128, activation='relu')(x) | |
| x = Dense(64, activation='relu')(x) | |
| y = Dense(K, activation='softmax')(x) | |
| model = Model(inputs=ptm.input, outputs=y) | |
| model.load_weights('lungs_weights.h5') | |
| # model.save('lungs_model.h5') | |
| label_map = {0: 'lung_Adenocarcinoma', 1: 'lung_benign', 2: 'lung_squamous cell carcinoma'} | |
| uploaded_image = st.file_uploader('Upload an image') | |
| if uploaded_image is not None: | |
| image = Image.open(uploaded_image) | |
| image = image.resize((224, 224)) | |
| image_array = np.array(image) | |
| image_array = preprocess_input(image_array) | |
| image_array = np.expand_dims(image_array, axis=0) | |
| predictions = model.predict(image_array) | |
| predicted_class = np.argmax(predictions) | |
| predicted_label = label_map[predicted_class] | |
| preprocess_image(uploaded_image, predicted_label) | |
| end_time = time.time() | |
| elapsed_time = end_time - start_time | |
| st.write('Time taken to predict is approximately:', round(elapsed_time, 2), 'seconds') | |
| st.image(image, caption='Uploaded Image', width=300) | |
| else: | |
| st.write('Please upload an image') | |
| if __name__ == '__main__': | |
| main() | |