Spaces:
Sleeping
Sleeping
| 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" | |
| ) | |
| 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." | |
| ) |