Spaces:
Runtime error
Runtime error
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()
|