File size: 3,404 Bytes
2017254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fcef679
 
 
2017254
 
 
 
 
 
fcef679
 
 
2017254
 
 
 
 
fcef679
2017254
 
 
 
 
fcef679
2017254
fcef679
 
 
2017254
fcef679
2017254
fcef679
2017254
 
fcef679
2017254
 
 
 
 
fcef679
2017254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()