File size: 4,569 Bytes
3c4d877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d726cc3
 
 
3c4d877
 
 
 
 
890a9f7
 
 
 
 
 
 
3c4d877
 
 
 
 
 
 
 
 
c496c70
3c4d877
c496c70
3c4d877
 
 
 
 
 
 
 
 
 
 
d726cc3
3c4d877
d726cc3
 
3c4d877
 
d726cc3
 
 
 
 
 
 
 
 
 
 
 
3c4d877
c496c70
 
 
3c4d877
 
c496c70
3c4d877
 
890a9f7
 
 
 
 
c496c70
 
 
 
9e85036
 
 
 
 
 
c496c70
 
890a9f7
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
import streamlit as st
import gradio as gr
import cv2
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.applications.vgg16 import preprocess_input
from tensorflow.keras.preprocessing import image
from werkzeug.utils import secure_filename
import os

# Loading Models
braintumor_model = load_model('models/brain_tumor_binary.h5')

# Configuring Streamlit
UPLOAD_FOLDER = 'static/uploads'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
st.set_page_config(page_title="Brain Tumor Prediction App", page_icon=":brain:")

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

def preprocess_imgs(set_name, img_size):
    set_new = []
    for img in set_name:
        img = cv2.resize(img, dsize=img_size, interpolation=cv2.INTER_CUBIC)
        set_new.append(preprocess_input(img))
    return np.array(set_new)

def crop_imgs(set_name, add_pixels_value=0):
    set_new = []
    for img in set_name:
        gray = cv2.GaussianBlur(img, (5, 5), 0)
        thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
        thresh = cv2.erode(thresh, None, iterations=2)
        thresh = cv2.dilate(thresh, None, iterations=2)
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnts = cnts[0] if len(cnts) == 2 else cnts[1]
        c = max(cnts, key=cv2.contourArea)
        extLeft = tuple(c[c[:, :, 0].argmin()][0])
        extRight = tuple(c[c[:, :, 0].argmax()][0])
        extTop = tuple(c[c[:, :, 1].argmin()][0])
        extBot = tuple(c[c[:, :, 1].argmax()][0])
        ADD_PIXELS = add_pixels_value
        new_img = img[extTop[1] - ADD_PIXELS:extBot[1] + ADD_PIXELS,
                      extLeft[0] - ADD_PIXELS:extRight[0] + ADD_PIXELS].copy()
        set_new.append(new_img)
    return np.array(set_new)

# Function to preprocess the image
def preprocess_image(img_array):
    img_array = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB)
    img = image.array_to_img(img_array, target_size=(200, 200))
    img_array = image.img_to_array(img)
    img_array = np.expand_dims(img_array, axis=0)
    img_array /= 255.0  # Normalize the image
    return img_array

def predict_braintumor(img_input):
    if isinstance(img_input, str):  # File path (for Streamlit)
        img_path = img_input
        img_gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    else:  # NumPy array (for Gradio)
        img_array = img_input.astype(np.uint8)
        img_gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)

    # Crop and preprocess the grayscale image
    img_processed = crop_imgs([img_gray])
    img_processed = preprocess_imgs(img_processed, (224, 224))

    # Make prediction
    pred = braintumor_model.predict(img_processed)

    # Handle binary decision
    pred = 1 if pred[0] >= 0.5 else 0

    return pred

def main():
    st.title("Brain Tumor Prediction App")

    uploaded_file = st.file_uploader("Choose an image...", type=["png", "jpg", "jpeg"])

    if uploaded_file is not None:
        st.image(uploaded_file, caption="Uploaded Image.", use_column_width=True)
        st.write("")
        st.write("Classifying...")

        # Read the contents of the uploaded file or the input image
        file_contents = uploaded_file.read()
        uploaded_array = np.asarray(bytearray(file_contents), dtype=np.uint8)
        uploaded_img = cv2.imdecode(uploaded_array, -1)

        # Save the uploaded file
        if isinstance(file_contents, bytes):
            filename = secure_filename(uploaded_file.name)
            file_path = os.path.join(UPLOAD_FOLDER, filename)

            with open(file_path, "wb") as f:
                f.write(file_contents)

            # Make prediction
            result = predict_braintumor(file_path)
        else:
            # Make prediction for Gradio (direct input of image)
            result = predict_braintumor(uploaded_img)

        # Handle binary decision
        result_text = "Brain Tumor Found!" if result == 1 else "Brain Tumor Not Found!"
        
        # Display prediction
        st.subheader("Prediction:")
        st.success(result_text)

if __name__ == "__main__":
    # Streamlit part
    if "streamlit" in st.__version__.lower():
        main()

    # Gradio part
    iface = gr.Interface(
        fn=predict_braintumor,
        inputs="image",
        outputs="text",
        examples = [
    ["examples/1 no.jpeg"],
    ["examples/2 no.jpeg"],
    ["examples/3 yes.jpg"],
    ["examples/4 yes.jpg"]
],
        enable_queue=True
    )
    iface.launch()