Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,37 +1,205 @@
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
from PIL import Image
|
|
|
4 |
|
5 |
# Załaduj model klasyfikacji zmian skórnych
|
6 |
skin_model = pipeline("image-classification", model="Anwarkh1/Skin_Cancer-Image_Classification")
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
def analyze_skin(image):
|
9 |
if image is None:
|
10 |
-
return "❌ Proszę wgrać zdjęcie", None
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
if __name__ == "__main__":
|
37 |
-
demo.launch()
|
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
from PIL import Image
|
4 |
+
import numpy as np
|
5 |
|
6 |
# Załaduj model klasyfikacji zmian skórnych
|
7 |
skin_model = pipeline("image-classification", model="Anwarkh1/Skin_Cancer-Image_Classification")
|
8 |
|
9 |
+
# Definicje typów zmian skórnych z interpretacją medyczną
|
10 |
+
SKIN_CONDITIONS = {
|
11 |
+
"Actinic keratoses": {
|
12 |
+
"name": "Rogowacenie słoneczne",
|
13 |
+
"risk": "medium",
|
14 |
+
"description": "Przedrakowе zmiany wywołane długotrwałym narażeniem na słońce",
|
15 |
+
"recommendation": "Wymaga kontroli dermatologicznej - może prowadzić do raka płaskonabłonkowego"
|
16 |
+
},
|
17 |
+
"Basal cell carcinoma": {
|
18 |
+
"name": "Rak podstawnokomórkowy",
|
19 |
+
"risk": "high",
|
20 |
+
"description": "Najczęstszy typ raka skóry, rzadko daje przerzuty",
|
21 |
+
"recommendation": "PILNIE skonsultuj się z onkologiem/dermatologiem"
|
22 |
+
},
|
23 |
+
"Dermatofibroma": {
|
24 |
+
"name": "Włókniak skóry",
|
25 |
+
"risk": "low",
|
26 |
+
"description": "Łagodny guzek składający się z tkanki włóknistej",
|
27 |
+
"recommendation": "Zwykle nie wymaga leczenia, kontrola dermatologiczna"
|
28 |
+
},
|
29 |
+
"Melanoma": {
|
30 |
+
"name": "Czerniak",
|
31 |
+
"risk": "high",
|
32 |
+
"description": "Najgroźniejszy typ raka skóry, może szybko dawać przerzuty",
|
33 |
+
"recommendation": "NATYCHMIAST skonsultuj się z onkologiem!"
|
34 |
+
},
|
35 |
+
"Nevus": {
|
36 |
+
"name": "Znamię",
|
37 |
+
"risk": "low",
|
38 |
+
"description": "Zwykle łagodna zmiana pigmentowa",
|
39 |
+
"recommendation": "Obserwuj zmiany według reguły ABCDE"
|
40 |
+
},
|
41 |
+
"Pigmented benign keratosis": {
|
42 |
+
"name": "Łagodne rogowacenie barwnikowe",
|
43 |
+
"risk": "low",
|
44 |
+
"description": "Łagodna zmiana wieku, często ciemno zabarwiona",
|
45 |
+
"recommendation": "Zwykle nie wymaga leczenia"
|
46 |
+
},
|
47 |
+
"Seborrheic keratosis": {
|
48 |
+
"name": "Rogowacenie łojotokowe",
|
49 |
+
"risk": "low",
|
50 |
+
"description": "Łagodna zmiana starcza, często brodawkowata",
|
51 |
+
"recommendation": "Nie wymaga leczenia, możliwość usunięcia kosmetycznego"
|
52 |
+
},
|
53 |
+
"Squamous cell carcinoma": {
|
54 |
+
"name": "Rak płaskonabłonkowy",
|
55 |
+
"risk": "high",
|
56 |
+
"description": "Drugi najczęstszy typ raka skóry",
|
57 |
+
"recommendation": "PILNIE skonsultuj się z onkologiem/dermatologiem"
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
def get_risk_indicator(risk_level):
|
62 |
+
"""Zwraca kolorowy wskaźnik ryzyka"""
|
63 |
+
if risk_level == "high":
|
64 |
+
return "🔴 WYSOKIE RYZYKO"
|
65 |
+
elif risk_level == "medium":
|
66 |
+
return "🟡 ŚREDNIE RYZYKO"
|
67 |
+
else:
|
68 |
+
return "🟢 NISKIE RYZYKO"
|
69 |
+
|
70 |
def analyze_skin(image):
|
71 |
if image is None:
|
72 |
+
return "❌ Proszę wgrać zdjęcie", None, ""
|
73 |
+
|
74 |
+
try:
|
75 |
+
# Analiza zmiany skórnej
|
76 |
+
result = skin_model(image)
|
77 |
+
|
78 |
+
# Formatuj wynik z kolorowymi wskaźnikami
|
79 |
+
output = "# 🔬 WYNIK ANALIZY ZMIANY SKÓRNEJ\n\n"
|
80 |
+
|
81 |
+
# Główny wynik (najwyższe prawdopodobieństwo)
|
82 |
+
top_result = result[0]
|
83 |
+
top_condition = SKIN_CONDITIONS.get(top_result['label'], {
|
84 |
+
'name': top_result['label'],
|
85 |
+
'risk': 'medium',
|
86 |
+
'description': 'Nieznana zmiana skórna',
|
87 |
+
'recommendation': 'Skonsultuj się z dermatologiem'
|
88 |
+
})
|
89 |
+
|
90 |
+
risk_indicator = get_risk_indicator(top_condition['risk'])
|
91 |
+
|
92 |
+
output += f"## 🎯 NAJBARDZIEJ PRAWDOPODOBNE:\n"
|
93 |
+
output += f"**{top_condition['name']}** ({top_result['label']})\n"
|
94 |
+
output += f"**Prawdopodobieństwo:** {top_result['score']:.1%}\n"
|
95 |
+
output += f"**Poziom ryzyka:** {risk_indicator}\n\n"
|
96 |
+
|
97 |
+
output += f"### 📋 Opis medyczny:\n"
|
98 |
+
output += f"{top_condition['description']}\n\n"
|
99 |
+
|
100 |
+
output += f"### 💡 Zalecenia:\n"
|
101 |
+
output += f"{top_condition['recommendation']}\n\n"
|
102 |
+
|
103 |
+
# Wszystkie wyniki
|
104 |
+
output += "## 📊 SZCZEGÓŁOWE PRAWDOPODOBIEŃSTWA:\n\n"
|
105 |
+
for i, r in enumerate(result, 1):
|
106 |
+
condition = SKIN_CONDITIONS.get(r['label'], {'name': r['label'], 'risk': 'medium'})
|
107 |
+
risk_emoji = "🔴" if condition['risk'] == 'high' else "🟡" if condition['risk'] == 'medium' else "🟢"
|
108 |
+
output += f"{i}. {risk_emoji} **{condition['name']}** – {r['score']:.2%}\n"
|
109 |
+
|
110 |
+
# Ostrzeżenia bezpieczeństwa
|
111 |
+
safety_warning = """
|
112 |
+
---
|
113 |
+
## ⚠️ WAŻNE OSTRZEŻENIA BEZPIECZEŃSTWA:
|
114 |
+
|
115 |
+
🩺 **Ta aplikacja NIE ZASTĘPUJE konsultacji lekarskiej!**
|
116 |
+
- Wyniki mają charakter orientacyjny
|
117 |
+
- Ostateczną diagnozę może postawić tylko lekarz
|
118 |
+
- W przypadku podejrzanych zmian skórnych - skonsultuj się z dermatologiem
|
119 |
+
|
120 |
+
🔍 **Zasada ABCDE dla znamion:**
|
121 |
+
- **A**symetria
|
122 |
+
- **B**rzegi nieregularne
|
123 |
+
- **C**olor niejednolity
|
124 |
+
- **D**średnica > 6mm
|
125 |
+
- **E**wolucja (zmiany)
|
126 |
+
|
127 |
+
📞 **Kiedy natychmiast do lekarza:**
|
128 |
+
- Zmiany rosnące, krwawiące, swędzące
|
129 |
+
- Nowe znamiona po 30. roku życia
|
130 |
+
- Zmiany wyglądu istniejących znamion
|
131 |
+
"""
|
132 |
+
|
133 |
+
return output, image, safety_warning
|
134 |
+
|
135 |
+
except Exception as e:
|
136 |
+
return f"❌ Błąd podczas analizy: {str(e)}", None, ""
|
137 |
+
|
138 |
+
# Utwórz zaawansowany interfejs Gradio
|
139 |
+
with gr.Blocks(theme=gr.themes.Soft(), title="🔬 Klasyfikator Raka Skóry") as demo:
|
140 |
+
gr.Markdown("""
|
141 |
+
# 🔬 Klasyfikator Zmian Skórnych - Detekcja Raka Skóry
|
142 |
+
|
143 |
+
**Zaawansowana analiza AI wykrywająca 8 typów zmian skórnych**
|
144 |
+
|
145 |
+
Wgraj zdjęcie zmiany skórnej, a aplikacja przeanalizuje:
|
146 |
+
- Czerniak (Melanoma) 🔴
|
147 |
+
- Rak podstawnokomórkowy 🔴
|
148 |
+
- Rak płaskonabłonkowy 🔴
|
149 |
+
- Rogowacenie słoneczne 🟡
|
150 |
+
- Znamiona i inne łagodne zmiany 🟢
|
151 |
+
""")
|
152 |
+
|
153 |
+
with gr.Row():
|
154 |
+
with gr.Column():
|
155 |
+
image_input = gr.Image(
|
156 |
+
type="pil",
|
157 |
+
label="📸 Wgraj zdjęcie zmiany skórnej",
|
158 |
+
height=400
|
159 |
+
)
|
160 |
+
|
161 |
+
analyze_btn = gr.Button(
|
162 |
+
"🔍 ANALIZUJ ZMIANĘ SKÓRNĄ",
|
163 |
+
variant="primary",
|
164 |
+
size="lg"
|
165 |
+
)
|
166 |
+
|
167 |
+
with gr.Column():
|
168 |
+
result_output = gr.Markdown(
|
169 |
+
label="🔎 Wynik analizy",
|
170 |
+
value="Wgraj zdjęcie i kliknij 'Analizuj' aby rozpocząć"
|
171 |
+
)
|
172 |
+
|
173 |
+
with gr.Row():
|
174 |
+
uploaded_image = gr.Image(
|
175 |
+
label="📷 Przesłane zdjęcie",
|
176 |
+
height=300
|
177 |
+
)
|
178 |
+
|
179 |
+
safety_output = gr.Markdown(
|
180 |
+
label="⚠️ Ostrzeżenia bezpieczeństwa"
|
181 |
+
)
|
182 |
+
|
183 |
+
# Obsługa kliknięcia
|
184 |
+
analyze_btn.click(
|
185 |
+
fn=analyze_skin,
|
186 |
+
inputs=[image_input],
|
187 |
+
outputs=[result_output, uploaded_image, safety_output]
|
188 |
+
)
|
189 |
+
|
190 |
+
# Przykłady użycia
|
191 |
+
gr.Markdown("""
|
192 |
+
## 📋 Instrukcje użycia:
|
193 |
+
1. **Wgraj zdjęcie** - najlepiej wysokiej jakości, dobrze oświetlone
|
194 |
+
2. **Kliknij 'Analizuj'** - poczekaj na wynik AI
|
195 |
+
3. **Sprawdź wynik** - poziom ryzyka i prawdopodobieństwa
|
196 |
+
4. **Przeczytaj zalecenia** - czy potrzebna konsultacja lekarska
|
197 |
+
|
198 |
+
## 🎯 Aplikacja analizuje 8 typów zmian:
|
199 |
+
- 🔴 **Wysokie ryzyko:** Czerniak, Rak podstawnokomórkowy, Rak płaskonabłonkowy
|
200 |
+
- 🟡 **Średnie ryzyko:** Rogowacenie słoneczne
|
201 |
+
- 🟢 **Niskie ryzyko:** Znamiona, Włókniak skóry, Rogowacenie łojotokowe
|
202 |
+
""")
|
203 |
|
204 |
if __name__ == "__main__":
|
205 |
+
demo.launch(share=True)
|