scincancer / src /streamlit_app.py
jalesummak's picture
Update src/streamlit_app.py
9152b30 verified
Raw
History Blame Contribute Delete
4.14 kB
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("""
<style>
.main-title {
text-align: center;
font-size: 38px;
font-weight: 800;
color: #d6336c;
}
.sub-title {
text-align: center;
font-size: 18px;
color: #555;
}
.result-box {
padding: 25px;
border-radius: 16px;
text-align: center;
margin-top: 20px;
font-size: 22px;
font-weight: 700;
}
.cancer {
background-color: #ffe3e3;
color: #c92a2a;
border: 2px solid #ff8787;
}
.safe {
background-color: #d3f9d8;
color: #2b8a3e;
border: 2px solid #69db7c;
}
.warning {
background-color: #fff3bf;
color: #e67700;
border: 2px solid #ffd43b;
}
</style>
""", unsafe_allow_html=True)
st.markdown("<div class='main-title'>🧬 Deri Kanseri Görsel Sınıflandırma</div>", unsafe_allow_html=True)
st.markdown(
"<div class='sub-title'>Bir deri lezyonu resmi yükle. Model, görselin kanserli olup olmadığını tahmin etsin.</div>",
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"""
<div class='result-box cancer'>
⚠️ Kanserli Görsel Tespit Edildi<br><br>
Kanser olasılığı: %{cancer_probability * 100:.2f}
</div>
""",
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"""
<div class='result-box safe'>
✅ Kanser Değil Olarak Tahmin Edildi<br><br>
Kanser değil olasılığı: %{non_cancer_probability * 100:.2f}
</div>
""",
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."
)