File size: 3,839 Bytes
3c4d877
 
 
 
 
 
 
 
 
 
934e107
3c4d877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1db9a6e
 
3c4d877
 
 
 
 
1db9a6e
 
 
 
f1bea19
e769983
 
 
 
ca99111
e769983
 
ca99111
e769983
 
 
 
 
 
 
 
3c4d877
 
 
 
 
 
 
 
 
1db9a6e
f1bea19
3c4d877
e769983
3c4d877
 
 
 
 
 
 
 
 
 
1db9a6e
f1bea19
3c4d877
 
 
f1bea19
3c4d877
 
1db9a6e
 
890a9f7
1db9a6e
c496c70
 
 
 
2765643
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
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
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 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(file_path):
    img = image.load_img(file_path, 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

# Handle binary decision
def binary_decision(confidence):
    return 1 if confidence >= 0.5 else 0

def predict_braintumor(img):
    # Save the uploaded file if it's a file-like object
    if hasattr(img, 'read'):
        filename = "temp_image.png"
        file_path = os.path.join(UPLOAD_FOLDER, filename)

        # Convert Gradio image data to bytes
        img_bytes = img.read()

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

        img_gray = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)

    # If it's a NumPy array, use it directly
    elif isinstance(img, np.ndarray):
        img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 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
    confidence = pred[0][0]
    return "Brain Tumor Found!" if binary_decision(confidence) == 1 else "Brain Tumor Not Found!"


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...")

        # Make prediction
        result = predict_braintumor(uploaded_file)

        # Display prediction
        st.subheader("Prediction:")
        st.success(result)

if __name__ == "__main__":
    # Streamlit app
    main()

    # Gradio interface
    iface = gr.Interface(
        fn=predict_braintumor,
        inputs="image",
        outputs="text",
        examples=[["examples/1_no.jpeg"], ["examples/2_no.jpeg"], ["examples/Y1.jpg"], ["examples/Y2.jpg"]]
    )
    iface.launch()