cobb_3outputs_predict / src /streamlit_app.py
jalesummak's picture
Update src/streamlit_app.py
6161e82 verified
Raw
History Blame Contribute Delete
3 kB
import streamlit as st
import tensorflow as tf
import numpy as np
from PIL import Image
import cv2
IMG_SIZE = 224
MODEL_PATH = "cobb_3outputs_model.keras"
st.set_page_config(
page_title="Cobb 3 Açılı Skolyoz Analizi",
page_icon="🦴",
layout="centered"
)
@st.cache_resource
def load_model():
return tf.keras.models.load_model(MODEL_PATH)
model = load_model()
def yorumla(angle):
if angle < 10:
return "Normal, takip yok"
elif angle < 25:
return "Hafif skolyoz, 6 ayda bir kontrol"
elif angle < 40:
return "Orta şiddetli, korse tedavisi"
else:
return "Şiddetli, cerrahi düşünülür"
def preprocess_image(image):
image = image.convert("RGB")
img = np.array(image)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
clahe = cv2.createCLAHE(
clipLimit=2.0,
tileGridSize=(8, 8)
)
enhanced = clahe.apply(gray)
enhanced_rgb = cv2.cvtColor(enhanced, cv2.COLOR_GRAY2RGB)
resized = cv2.resize(enhanced_rgb, (IMG_SIZE, IMG_SIZE))
arr = resized.astype("float32") / 255.0
arr = np.expand_dims(arr, axis=0)
return arr, enhanced_rgb
def predict_cobb_angles(image):
processed_img, enhanced_preview = preprocess_image(image)
pred = model.predict(processed_img, verbose=0)[0]
pred_PT = max(0.0, float(pred[0]))
pred_MT = max(0.0, float(pred[1]))
pred_TL = max(0.0, float(pred[2]))
pred_max = max(pred_PT, pred_MT, pred_TL)
return pred_PT, pred_MT, pred_TL, pred_max, enhanced_preview
st.title("🦴 Skolyoz Cobb Açısı Analiz Sistemi")
st.write(
"Model röntgen görüntüsünden PT, MT ve TL olmak üzere 3 Cobb açısı analiz eder."
)
uploaded_file = st.file_uploader(
"Röntgen görüntüsü yükleyin",
type=["jpg", "jpeg", "png"]
)
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.subheader("Orijinal Görüntü")
st.image(image, use_container_width=True)
pred_PT, pred_MT, pred_TL, pred_max, enhanced_preview = predict_cobb_angles(image)
st.subheader("CLAHE Sonrası Görüntü")
st.image(enhanced_preview, use_container_width=True, clamp=True)
st.subheader("Analiz Edilen Cobb Açıları")
col1, col2, col3 = st.columns(3)
with col1:
st.metric("PT Açısı", f"{pred_PT:.2f}°")
with col2:
st.metric("MT Açısı", f"{pred_MT:.2f}°")
with col3:
st.metric("TL Açısı", f"{pred_TL:.2f}°")
st.divider()
st.metric("Maksimum Cobb Açısı", f"{pred_max:.2f}°")
st.success(f"Klinik Yorum: {yorumla(pred_max)}")
with st.expander("Teknik Bilgi"):
st.write("Model çıkış sırası:")
st.code("PT, MT, TL")
st.write("Kullanılan preprocessing:")
st.code("RGB → Grayscale → CLAHE → RGB → Resize 224x224 → Normalize")
st.warning(
"Bu sistem klinik karar destek amaçlıdır. Kesin tanı ve tedavi kararı için uzman hekim değerlendirmesi gerekir."
)