File size: 3,673 Bytes
ab0f059
89dcdea
ab0f059
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89dcdea
ab0f059
 
 
 
 
89dcdea
ab0f059
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89dcdea
ab0f059
 
 
 
 
 
 
 
 
 
 
 
 
 
89dcdea
ab0f059
 
 
 
 
 
 
 
 
 
 
89dcdea
ab0f059
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89dcdea
1
2
3
4
5
6
7
8
9
10
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import gradio as gr
from transformers import pipeline
import torch
from PIL import Image
import numpy as np

WOUND_TYPES = {
    "pressure_ulcer": "Úlcera de Pressão",
    "venous_ulcer": "Úlcera Venosa",
    "diabetic_ulcer": "Úlcera Diabética",
    "surgical_wound": "Ferida Cirúrgica",
    "burn": "Queimadura",
    "healthy_skin": "Pele Saudável"
}

def load_models():
    # Carregando modelos específicos para feridas
    wound_classifier = pipeline(
        "image-classification",
        model="stevhliu/wound-classification",
        device=0 if torch.cuda.is_available() else -1
    )
    
    tissue_classifier = pipeline(
        "image-classification",
        model="viktorcikojevic/wound-tissue-type",
        device=0 if torch.cuda.is_available() else -1
    )
    
    return wound_classifier, tissue_classifier

def preprocess_image(image):
    if isinstance(image, np.ndarray):
        image = Image.fromarray(image)
    image = image.convert('RGB')
    return image

def classify_wound(image):
    if image is None:
        return None, None
    
    wound_classifier, tissue_classifier = load_models()
    processed_image = preprocess_image(image)
    
    # Classificação do tipo de ferida
    wound_results = wound_classifier(processed_image)
    
    # Classificação do tipo de tecido
    tissue_results = tissue_classifier(processed_image)
    
    # Formatando resultados
    wound_formatted = []
    for result in wound_results:
        label = WOUND_TYPES.get(result['label'], result['label'])
        score = result['score']
        wound_formatted.append((label, score))
    
    tissue_formatted = []
    for result in tissue_results:
        label = result['label'].replace('_', ' ').title()
        score = result['score']
        tissue_formatted.append((label, score))
    
    return wound_formatted, tissue_formatted

# Interface Gradio
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🏥 Classificador Especializado de Feridas
    
    Sistema de classificação utilizando modelos especializados para análise de feridas e tecidos.
    """)
    
    with gr.Row():
        with gr.Column():
            input_image = gr.Image(
                label="Upload da Imagem",
                type="pil"
            )
            submit_btn = gr.Button("Analisar Ferida", variant="primary", size="lg")
        
        with gr.Column():
            wound_output = gr.Label(
                label="Tipo de Ferida",
                num_top_classes=3
            )
            tissue_output = gr.Label(
                label="Tipo de Tecido",
                num_top_classes=3
            )
    
    with gr.Row():
        with gr.Accordion("Informações Importantes", open=False):
            gr.Markdown("""
            ### Tipos de Feridas Detectáveis:
            - Úlcera de Pressão
            - Úlcera Venosa
            - Úlcera Diabética
            - Ferida Cirúrgica
            - Queimadura
            
            ### Tipos de Tecidos Analisados:
            - Tecido de Granulação
            - Tecido Necrótico
            - Tecido Fibrinoso
            - Tecido Epitelial
            
            ### Recomendações para Melhores Resultados:
            1. Use imagens bem iluminadas
            2. Capture a imagem em um ângulo perpendicular à ferida
            3. Mantenha um fundo neutro e limpo
            4. Evite sombras ou reflexos excessivos
            """)
    
    # Configurando eventos
    submit_btn.click(
        fn=classify_wound,
        inputs=input_image,
        outputs=[wound_output, tissue_output]
    )

if __name__ == "__main__":
    demo.launch()