import os import streamlit as st import tensorflow as tf import numpy as np from PIL import Image IMG_SIZE = 224 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MODEL_PATH = os.path.join(BASE_DIR, "cobb_angle_model_mae_3_42.keras") @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 predict_cobb(image): image = image.convert("RGB") image = image.resize((IMG_SIZE, IMG_SIZE)) arr = np.array(image) / 255.0 arr = np.expand_dims(arr, axis=0) pred = model.predict(arr, verbose=0)[0][0] return float(pred) st.set_page_config( page_title="Cobb Angle Estimator", page_icon="🩻", layout="centered" ) st.title("🩻 Cobb Angle Estimator") st.write("X-Ray görüntüsünden tahmini Cobb açısı ve klinik yorum üretir.") uploaded_file = st.file_uploader( "X-Ray görüntüsü yükle", type=["jpg", "jpeg", "png"] ) if uploaded_file is not None: image = Image.open(uploaded_file) st.image(image, caption="Yüklenen Görüntü", use_container_width=True) if st.button("Tahmin Et"): pred_angle = predict_cobb(image) comment = yorumla(pred_angle) st.subheader("Tahmin Sonucu") st.metric("Tahmini Cobb Açısı", f"{pred_angle:.2f}°") if pred_angle < 10: st.success(comment) elif pred_angle < 25: st.info(comment) elif pred_angle < 40: st.warning(comment) else: st.error(comment) st.warning( "Bu sistem yalnızca araştırma ve eğitim amaçlıdır. " "Kesin tanı ve tedavi kararı için uzman hekim değerlendirmesi gereklidir." )