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