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