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