SonoUno commited on
Commit
f7a4db1
·
verified ·
1 Parent(s): 8c34723

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +194 -26
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
- # Bezpośrednia analiza zmiany skórnej
13
- result = skin_model(image)
14
-
15
- # Formatuj wynik
16
- output = "✅ Wynik klasyfikacji:\n\n"
17
- for r in result:
18
- output += f"🔹 **{r['label']}** – {r['score']:.2%}\n"
19
-
20
- return output, image
21
-
22
- # Utwórz interfejs Gradio
23
- demo = gr.Interface(
24
- fn=analyze_skin,
25
- inputs=gr.Image(type="pil", label="📸 Wgraj zdjęcie zmiany skórnej"),
26
- outputs=[
27
- gr.Textbox(label="🔎 Wynik analizy", lines=5),
28
- gr.Image(label="Przesłane zdjęcie")
29
- ],
30
- title="🧴 Klasyfikator zmian skórnych (melanoma etc.)",
31
- description="Wgraj zdjęcie zmiany skórnej, a aplikacja przeanalizuje rodzaj zmiany. Upewnij się, że zdjęcie przedstawia fragment ludzkiej skóry.",
32
- theme="soft",
33
- allow_flagging="never"
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)