skin_research / app.py
SonoUno's picture
Update app.py
f7a4db1 verified
import gradio as gr
from transformers import pipeline
from PIL import Image
import numpy as np
# Załaduj model klasyfikacji zmian skórnych
skin_model = pipeline("image-classification", model="Anwarkh1/Skin_Cancer-Image_Classification")
# Definicje typów zmian skórnych z interpretacją medyczną
SKIN_CONDITIONS = {
"Actinic keratoses": {
"name": "Rogowacenie słoneczne",
"risk": "medium",
"description": "Przedrakowе zmiany wywołane długotrwałym narażeniem na słońce",
"recommendation": "Wymaga kontroli dermatologicznej - może prowadzić do raka płaskonabłonkowego"
},
"Basal cell carcinoma": {
"name": "Rak podstawnokomórkowy",
"risk": "high",
"description": "Najczęstszy typ raka skóry, rzadko daje przerzuty",
"recommendation": "PILNIE skonsultuj się z onkologiem/dermatologiem"
},
"Dermatofibroma": {
"name": "Włókniak skóry",
"risk": "low",
"description": "Łagodny guzek składający się z tkanki włóknistej",
"recommendation": "Zwykle nie wymaga leczenia, kontrola dermatologiczna"
},
"Melanoma": {
"name": "Czerniak",
"risk": "high",
"description": "Najgroźniejszy typ raka skóry, może szybko dawać przerzuty",
"recommendation": "NATYCHMIAST skonsultuj się z onkologiem!"
},
"Nevus": {
"name": "Znamię",
"risk": "low",
"description": "Zwykle łagodna zmiana pigmentowa",
"recommendation": "Obserwuj zmiany według reguły ABCDE"
},
"Pigmented benign keratosis": {
"name": "Łagodne rogowacenie barwnikowe",
"risk": "low",
"description": "Łagodna zmiana wieku, często ciemno zabarwiona",
"recommendation": "Zwykle nie wymaga leczenia"
},
"Seborrheic keratosis": {
"name": "Rogowacenie łojotokowe",
"risk": "low",
"description": "Łagodna zmiana starcza, często brodawkowata",
"recommendation": "Nie wymaga leczenia, możliwość usunięcia kosmetycznego"
},
"Squamous cell carcinoma": {
"name": "Rak płaskonabłonkowy",
"risk": "high",
"description": "Drugi najczęstszy typ raka skóry",
"recommendation": "PILNIE skonsultuj się z onkologiem/dermatologiem"
}
}
def get_risk_indicator(risk_level):
"""Zwraca kolorowy wskaźnik ryzyka"""
if risk_level == "high":
return "🔴 WYSOKIE RYZYKO"
elif risk_level == "medium":
return "🟡 ŚREDNIE RYZYKO"
else:
return "🟢 NISKIE RYZYKO"
def analyze_skin(image):
if image is None:
return "❌ Proszę wgrać zdjęcie", None, ""
try:
# Analiza zmiany skórnej
result = skin_model(image)
# Formatuj wynik z kolorowymi wskaźnikami
output = "# 🔬 WYNIK ANALIZY ZMIANY SKÓRNEJ\n\n"
# Główny wynik (najwyższe prawdopodobieństwo)
top_result = result[0]
top_condition = SKIN_CONDITIONS.get(top_result['label'], {
'name': top_result['label'],
'risk': 'medium',
'description': 'Nieznana zmiana skórna',
'recommendation': 'Skonsultuj się z dermatologiem'
})
risk_indicator = get_risk_indicator(top_condition['risk'])
output += f"## 🎯 NAJBARDZIEJ PRAWDOPODOBNE:\n"
output += f"**{top_condition['name']}** ({top_result['label']})\n"
output += f"**Prawdopodobieństwo:** {top_result['score']:.1%}\n"
output += f"**Poziom ryzyka:** {risk_indicator}\n\n"
output += f"### 📋 Opis medyczny:\n"
output += f"{top_condition['description']}\n\n"
output += f"### 💡 Zalecenia:\n"
output += f"{top_condition['recommendation']}\n\n"
# Wszystkie wyniki
output += "## 📊 SZCZEGÓŁOWE PRAWDOPODOBIEŃSTWA:\n\n"
for i, r in enumerate(result, 1):
condition = SKIN_CONDITIONS.get(r['label'], {'name': r['label'], 'risk': 'medium'})
risk_emoji = "🔴" if condition['risk'] == 'high' else "🟡" if condition['risk'] == 'medium' else "🟢"
output += f"{i}. {risk_emoji} **{condition['name']}** – {r['score']:.2%}\n"
# Ostrzeżenia bezpieczeństwa
safety_warning = """
---
## ⚠️ WAŻNE OSTRZEŻENIA BEZPIECZEŃSTWA:
🩺 **Ta aplikacja NIE ZASTĘPUJE konsultacji lekarskiej!**
- Wyniki mają charakter orientacyjny
- Ostateczną diagnozę może postawić tylko lekarz
- W przypadku podejrzanych zmian skórnych - skonsultuj się z dermatologiem
🔍 **Zasada ABCDE dla znamion:**
- **A**symetria
- **B**rzegi nieregularne
- **C**olor niejednolity
- **D**średnica > 6mm
- **E**wolucja (zmiany)
📞 **Kiedy natychmiast do lekarza:**
- Zmiany rosnące, krwawiące, swędzące
- Nowe znamiona po 30. roku życia
- Zmiany wyglądu istniejących znamion
"""
return output, image, safety_warning
except Exception as e:
return f"❌ Błąd podczas analizy: {str(e)}", None, ""
# Utwórz zaawansowany interfejs Gradio
with gr.Blocks(theme=gr.themes.Soft(), title="🔬 Klasyfikator Raka Skóry") as demo:
gr.Markdown("""
# 🔬 Klasyfikator Zmian Skórnych - Detekcja Raka Skóry
**Zaawansowana analiza AI wykrywająca 8 typów zmian skórnych**
Wgraj zdjęcie zmiany skórnej, a aplikacja przeanalizuje:
- Czerniak (Melanoma) 🔴
- Rak podstawnokomórkowy 🔴
- Rak płaskonabłonkowy 🔴
- Rogowacenie słoneczne 🟡
- Znamiona i inne łagodne zmiany 🟢
""")
with gr.Row():
with gr.Column():
image_input = gr.Image(
type="pil",
label="📸 Wgraj zdjęcie zmiany skórnej",
height=400
)
analyze_btn = gr.Button(
"🔍 ANALIZUJ ZMIANĘ SKÓRNĄ",
variant="primary",
size="lg"
)
with gr.Column():
result_output = gr.Markdown(
label="🔎 Wynik analizy",
value="Wgraj zdjęcie i kliknij 'Analizuj' aby rozpocząć"
)
with gr.Row():
uploaded_image = gr.Image(
label="📷 Przesłane zdjęcie",
height=300
)
safety_output = gr.Markdown(
label="⚠️ Ostrzeżenia bezpieczeństwa"
)
# Obsługa kliknięcia
analyze_btn.click(
fn=analyze_skin,
inputs=[image_input],
outputs=[result_output, uploaded_image, safety_output]
)
# Przykłady użycia
gr.Markdown("""
## 📋 Instrukcje użycia:
1. **Wgraj zdjęcie** - najlepiej wysokiej jakości, dobrze oświetlone
2. **Kliknij 'Analizuj'** - poczekaj na wynik AI
3. **Sprawdź wynik** - poziom ryzyka i prawdopodobieństwa
4. **Przeczytaj zalecenia** - czy potrzebna konsultacja lekarska
## 🎯 Aplikacja analizuje 8 typów zmian:
- 🔴 **Wysokie ryzyko:** Czerniak, Rak podstawnokomórkowy, Rak płaskonabłonkowy
- 🟡 **Średnie ryzyko:** Rogowacenie słoneczne
- 🟢 **Niskie ryzyko:** Znamiona, Włókniak skóry, Rogowacenie łojotokowe
""")
if __name__ == "__main__":
demo.launch(share=True)