File size: 4,287 Bytes
ab0f059
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
from transformers import pipeline, AutoModelForImageClassification, AutoImageProcessor
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",  # Modelo específico para classificação de feridas
        device=0 if torch.cuda.is_available() else -1
    )
    
    tissue_classifier = pipeline(
        "image-classification",
        model="viktorcikojevic/wound-tissue-type",  # Modelo para classificação do tipo de tecido
        device=0 if torch.cuda.is_available() else -1
    )
    
    return wound_classifier, tissue_classifier

def preprocess_image(image):
    # Normalização e pré-processamento da imagem
    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 da classificação de feridas
    wound_formatted = []
    for result in wound_results:
        label = WOUND_TYPES.get(result['label'], result['label'])
        score = result['score']
        wound_formatted.append((label, score))
    
    # Formatando resultados da classificação de tecidos
    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

# Criando a interface do 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",
                tool="select"
            )
            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]
    )
    
    # Exemplos
    gr.Examples(
        examples=[
            ["exemplo_pressure_ulcer.jpg"],
            ["exemplo_diabetic_wound.jpg"],
        ],
        inputs=input_image,
        outputs=[wound_output, tissue_output],
        cache_examples=True
    )

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