import streamlit as st from tensorflow.keras.models import load_model from PIL import Image import numpy as np # ----------------------------- # SAYFA AYARLARI # ----------------------------- st.set_page_config( page_title="Deri Kanseri Sınıflandırma", page_icon="🧬", layout="centered" ) # ----------------------------- # MODEL YÜKLEME # ----------------------------- @st.cache_resource def load_skin_model(): return load_model("src/skin_cancer_model.h5") model = load_skin_model() # ----------------------------- # GÖRSEL İŞLEME # ----------------------------- def process_image(img): img = img.convert("RGB") img = img.resize((170, 170)) img_array = np.array(img) img_array = img_array / 255.0 img_array = np.expand_dims(img_array, axis=0) return img_array # ----------------------------- # TASARIM # ----------------------------- st.markdown(""" """, unsafe_allow_html=True) st.markdown("
🧬 Deri Kanseri Görsel Sınıflandırma
", unsafe_allow_html=True) st.markdown( "
Bir deri lezyonu resmi yükle. Model, görselin kanserli olup olmadığını tahmin etsin.
", unsafe_allow_html=True ) st.divider() # ----------------------------- # DOSYA YÜKLEME # ----------------------------- file = st.file_uploader( "Bir deri görüntüsü yükle", type=["jpg", "jpeg", "png"] ) if file is not None: img = Image.open(file) col1, col2 = st.columns([1, 1]) with col1: st.image(img, caption="Yüklenen Görsel", use_container_width=True) with col2: st.write("### Analiz Sonucu") processed_img = process_image(img) prediction = model.predict(processed_img)[0][0] cancer_probability = float(prediction) non_cancer_probability = 1 - cancer_probability threshold = 0.5 if cancer_probability >= threshold: st.markdown( f"""
⚠️ Kanserli Görsel Tespit Edildi

Kanser olasılığı: %{cancer_probability * 100:.2f}
""", unsafe_allow_html=True ) st.error( "Model bu görseli kanserli sınıfa daha yakın tahmin etti. " "Bu sonuç kesin tıbbi tanı değildir. Dermatoloji uzmanına başvurulmalıdır." ) else: st.markdown( f"""
✅ Kanser Değil Olarak Tahmin Edildi

Kanser değil olasılığı: %{non_cancer_probability * 100:.2f}
""", unsafe_allow_html=True ) st.warning( "Bu görselde kanserli hücre / kanserli lezyon tespit edilmedi. " "Kanserli fotoğraf yüklenmemiş olabilir." ) st.divider() st.write("### Model Olasılıkları") st.progress(cancer_probability) st.write(f"Kanser olasılığı: **%{cancer_probability * 100:.2f}**") st.write(f"Kanser değil olasılığı: **%{non_cancer_probability * 100:.2f}**") else: st.info("Analiz yapmak için bir deri görüntüsü yükleyin.") st.divider() st.caption( "Not: Bu uygulama eğitim ve demo amaçlıdır. Tıbbi tanı koymaz. " "Şüpheli durumlarda mutlaka uzman doktora başvurulmalıdır." )