Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -5,29 +5,22 @@ from PIL import Image
|
|
5 |
import numpy as np
|
6 |
|
7 |
WOUND_TYPES = {
|
8 |
-
"
|
9 |
-
"
|
10 |
-
"
|
11 |
-
"
|
12 |
-
"
|
13 |
-
"
|
14 |
}
|
15 |
|
16 |
-
def
|
17 |
-
#
|
18 |
-
|
19 |
"image-classification",
|
20 |
-
model="
|
21 |
device=0 if torch.cuda.is_available() else -1
|
22 |
)
|
23 |
-
|
24 |
-
tissue_classifier = pipeline(
|
25 |
-
"image-classification",
|
26 |
-
model="viktorcikojevic/wound-tissue-type",
|
27 |
-
device=0 if torch.cuda.is_available() else -1
|
28 |
-
)
|
29 |
-
|
30 |
-
return wound_classifier, tissue_classifier
|
31 |
|
32 |
def preprocess_image(image):
|
33 |
if isinstance(image, np.ndarray):
|
@@ -37,38 +30,29 @@ def preprocess_image(image):
|
|
37 |
|
38 |
def classify_wound(image):
|
39 |
if image is None:
|
40 |
-
return None
|
41 |
|
42 |
-
|
43 |
processed_image = preprocess_image(image)
|
44 |
|
45 |
-
# Classificação
|
46 |
-
|
47 |
-
|
48 |
-
# Classificação do tipo de tecido
|
49 |
-
tissue_results = tissue_classifier(processed_image)
|
50 |
|
51 |
# Formatando resultados
|
52 |
-
|
53 |
-
for result in
|
54 |
-
label = WOUND_TYPES.get(result['label'], result['label'])
|
55 |
-
score = result['score']
|
56 |
-
wound_formatted.append((label, score))
|
57 |
-
|
58 |
-
tissue_formatted = []
|
59 |
-
for result in tissue_results:
|
60 |
label = result['label'].replace('_', ' ').title()
|
61 |
score = result['score']
|
62 |
-
|
63 |
|
64 |
-
return
|
65 |
|
66 |
# Interface Gradio
|
67 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
68 |
gr.Markdown("""
|
69 |
-
# 🏥 Classificador
|
70 |
|
71 |
-
Sistema de classificação
|
72 |
""")
|
73 |
|
74 |
with gr.Row():
|
@@ -77,46 +61,34 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
77 |
label="Upload da Imagem",
|
78 |
type="pil"
|
79 |
)
|
80 |
-
submit_btn = gr.Button("Analisar
|
81 |
|
82 |
with gr.Column():
|
83 |
-
|
84 |
-
label="
|
85 |
-
num_top_classes=3
|
86 |
-
)
|
87 |
-
tissue_output = gr.Label(
|
88 |
-
label="Tipo de Tecido",
|
89 |
num_top_classes=3
|
90 |
)
|
91 |
|
92 |
with gr.Row():
|
93 |
-
with gr.Accordion("Informações
|
94 |
gr.Markdown("""
|
95 |
-
### Tipos de Feridas Detectáveis:
|
96 |
-
- Úlcera de Pressão
|
97 |
-
- Úlcera Venosa
|
98 |
-
- Úlcera Diabética
|
99 |
-
- Ferida Cirúrgica
|
100 |
-
- Queimadura
|
101 |
-
|
102 |
-
### Tipos de Tecidos Analisados:
|
103 |
-
- Tecido de Granulação
|
104 |
-
- Tecido Necrótico
|
105 |
-
- Tecido Fibrinoso
|
106 |
-
- Tecido Epitelial
|
107 |
-
|
108 |
### Recomendações para Melhores Resultados:
|
109 |
1. Use imagens bem iluminadas
|
110 |
-
2. Capture a imagem em um ângulo perpendicular
|
111 |
3. Mantenha um fundo neutro e limpo
|
112 |
4. Evite sombras ou reflexos excessivos
|
|
|
|
|
|
|
|
|
|
|
113 |
""")
|
114 |
|
115 |
# Configurando eventos
|
116 |
submit_btn.click(
|
117 |
fn=classify_wound,
|
118 |
inputs=input_image,
|
119 |
-
outputs=
|
120 |
)
|
121 |
|
122 |
if __name__ == "__main__":
|
|
|
5 |
import numpy as np
|
6 |
|
7 |
WOUND_TYPES = {
|
8 |
+
"stage1": "Estágio 1 - Lesão Superficial",
|
9 |
+
"stage2": "Estágio 2 - Lesão Parcial",
|
10 |
+
"stage3": "Estágio 3 - Lesão Profunda",
|
11 |
+
"stage4": "Estágio 4 - Lesão Grave",
|
12 |
+
"unstageable": "Não Classificável",
|
13 |
+
"healthy": "Pele Saudável"
|
14 |
}
|
15 |
|
16 |
+
def load_model():
|
17 |
+
# Usando um modelo público do Hugging Face para classificação de imagens
|
18 |
+
classifier = pipeline(
|
19 |
"image-classification",
|
20 |
+
model="google/vit-base-patch16-224",
|
21 |
device=0 if torch.cuda.is_available() else -1
|
22 |
)
|
23 |
+
return classifier
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
def preprocess_image(image):
|
26 |
if isinstance(image, np.ndarray):
|
|
|
30 |
|
31 |
def classify_wound(image):
|
32 |
if image is None:
|
33 |
+
return None
|
34 |
|
35 |
+
classifier = load_model()
|
36 |
processed_image = preprocess_image(image)
|
37 |
|
38 |
+
# Classificação da imagem
|
39 |
+
results = classifier(processed_image)
|
|
|
|
|
|
|
40 |
|
41 |
# Formatando resultados
|
42 |
+
formatted_results = []
|
43 |
+
for result in results:
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
label = result['label'].replace('_', ' ').title()
|
45 |
score = result['score']
|
46 |
+
formatted_results.append((label, score))
|
47 |
|
48 |
+
return formatted_results
|
49 |
|
50 |
# Interface Gradio
|
51 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
52 |
gr.Markdown("""
|
53 |
+
# 🏥 Classificador de Imagens Médicas
|
54 |
|
55 |
+
Sistema de classificação de imagens usando Vision Transformer (ViT).
|
56 |
""")
|
57 |
|
58 |
with gr.Row():
|
|
|
61 |
label="Upload da Imagem",
|
62 |
type="pil"
|
63 |
)
|
64 |
+
submit_btn = gr.Button("Analisar Imagem", variant="primary")
|
65 |
|
66 |
with gr.Column():
|
67 |
+
output = gr.Label(
|
68 |
+
label="Classificação",
|
|
|
|
|
|
|
|
|
69 |
num_top_classes=3
|
70 |
)
|
71 |
|
72 |
with gr.Row():
|
73 |
+
with gr.Accordion("Informações", open=False):
|
74 |
gr.Markdown("""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
### Recomendações para Melhores Resultados:
|
76 |
1. Use imagens bem iluminadas
|
77 |
+
2. Capture a imagem em um ângulo perpendicular
|
78 |
3. Mantenha um fundo neutro e limpo
|
79 |
4. Evite sombras ou reflexos excessivos
|
80 |
+
|
81 |
+
### Observações:
|
82 |
+
- Este é um modelo de classificação geral
|
83 |
+
- Os resultados são aproximações e não substituem avaliação médica
|
84 |
+
- Consulte sempre um profissional de saúde para diagnóstico
|
85 |
""")
|
86 |
|
87 |
# Configurando eventos
|
88 |
submit_btn.click(
|
89 |
fn=classify_wound,
|
90 |
inputs=input_image,
|
91 |
+
outputs=output
|
92 |
)
|
93 |
|
94 |
if __name__ == "__main__":
|