File size: 5,469 Bytes
3cc72c9
 
f4aa6fb
 
 
 
3cc72c9
baa52d2
 
3cc72c9
baa52d2
f4aa6fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
baa52d2
f4aa6fb
 
 
 
 
 
 
 
 
 
 
dbcd7b8
 
f4aa6fb
 
 
 
dbcd7b8
 
f4aa6fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3cc72c9
baa52d2
f4aa6fb
3cc72c9
 
 
 
baa52d2
f4aa6fb
dbcd7b8
5d1ec21
f4aa6fb
 
 
 
 
 
 
 
 
 
dcc0dbe
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
138
139
140
141
import fastai
import PIL
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from fastai.vision.all import *

# Crear la clase
class ADA_SKIN(object):
  
    # Inicializar el objeto
    def __init__(self, name="Wallaby", verbose=True, *args, **kwargs):
        super(ADA_SKIN, self).__init__(*args, **kwargs)
        self.author = "Jey"
        self.name = name
        if verbose:
            self._ph()
            self._pp("Hola desde la clase", str(self.__class__) + " Clase: " + str(self.__class__.__name__))
            self._pp("Nombre del c贸digo", self.name)
            self._pp("Autor", self.author)
            self._ph()

        self.article = '<h3>Predice las siguientes patologias en piel</h3><ol>'
        self.article += '<li>Enfermedad de Bowen (AKIEC)</li>'
        self.article += '<li>Carcinoma de c茅lulas basales</li>'
        self.article += '<li>Lesiones benignas similares a queratosis</li>'
        self.article += '<li>Dermatofibroma</li>'
        self.article += '<li>Melanoma</li>'
        self.article += '<li>Lunares melanoc铆ticos</li>'
        self.article += '<li>Carcinoma de c茅lulas escamosas</li>'   
        self.article += '<li>Lesiones vasculares</li>' 
        self.article += '<li>Benigno</li>' 
        self.article += '<li></li></ol>'         
        self.article += '<h3>                                  Prueba Jey(2023)</h3><ul>'
        self.examples = ['akiec1.jpg','bcc1.jpg','bkl1.jpg','df1.jpg','mel1.jpg',
                         'nevi1.jpg','scc1.jpg','vl1.jpg','benign1.jpg','benign3.jpg']
        self.title = "Predicci贸n C谩ncer de Piel prueba "
        return

    # Imprimir de manera legible el nombre y valor de una l铆nea
    def _pp(self, a, b):
        print("%34s : %s" % (str(a), str(b)))
        return

    # Imprimir la l铆nea de encabezado o pie de p谩gina
    def _ph(self):
        print("-" * 34, ":", "-" * 34)
        return

    def _predict_image(self, img, cat):
        # Convertir la imagen a PILImage
        img = PILImage.create(img)
        pred, idx, probs = learn.predict(img)
        return dict(zip(cat, map(float, probs)))

    def _predict_image2(self, img, cat):
        # Convertir la imagen a PILImage
        img = PILImage.create(img)
        pred, idx, probs = learn2.predict(img)
        return dict(zip(cat, map(float, probs)))

    def _draw_pred(self, df_pred, df2):
        fig, pic = plt.subplots(1, 2, figsize=(12, 6))
        ti = df_pred["vocab"].head(3).values
        ti2 = df2["vocab"].head(2).values
        
        try:
            df_pred["pred"].head(3).plot(ax=pic[0], kind="pie",
                cmap="Set2", labels=ti, explode=(0.02, 0, 0),
                wedgeprops=dict(width=.4),
                normalize=False)
            df2["pred"].head(2).plot(ax=pic[1], kind="pie",
                colors=["cornflowerblue", "darkorange"], labels=ti2, explode=(0.02, 0),
                wedgeprops=dict(width=.4),
                normalize=False)      
        except:
            df_pred["pred"].head(3).plot(ax=pic[0], kind="pie",
                cmap="Set2", labels=ti, explode=(0.02, 0, 0),
                wedgeprops=dict(width=.4))
            df2["pred"].head(2).plot(ax=pic[1], kind="pie",
                colors=["cornflowerblue", "darkorange"], labels=ti2, explode=(0.02, 0),
                wedgeprops=dict(width=.4))
        
        t = str(ti[0]) + ": " + str(np.round(df_pred.head(1).pred.values[0] * 100, 2)) + "% de predicci贸n"
        pic[0].set_title(t, fontsize=14.0, fontweight="bold")
        pic[0].axis('off')
        pic[0].legend(ti, loc="lower right", title="C谩ncer de Piel: ")
        
        k0 = np.round(df2.head(1).pred.values[0] * 100, 2)
        k1 = np.round(df2.tail(1).pred.values[0] * 100, 2)
        if k0 > k1:
            t2 = str(ti2[0]) + ": " + str(k0) + "% de predicci贸n"
        else:
            t2 = str(ti2[1]) + ": " + str(k1) + "% de predicci贸n"
        pic[1].set_title(t2, fontsize=14.0, fontweight="bold")
        pic[1].axis('off')
        pic[1].legend(ti2, loc="lower right", title="Predicci贸n C谩ncer de Piel:")
        
        fig.tight_layout()
        return fig

    def predict_donut(self, img):
        d = self._predict_image(img, self.categories)
        df = pd.DataFrame(d, index=[0])
        df = df.transpose().reset_index()
        df.columns = ["vocab", "pred"]
        df.sort_values("pred", inplace=True, ascending=False, ignore_index=True)
        
        d2 = self._predict_image2(img, self.categories2)
        df2 = pd.DataFrame(d2, index=[0])
        df2 = df2.transpose().reset_index()
        df2.columns = ["vocab", "pred"]
        
        fig = self._draw_pred(df, df2)
        return fig

# Inicializar el objeto ADA_SKIN
maxi = ADA_SKIN(verbose=False)

# Cargar modelos
learn = fastai.learner.load_learner('ada_learn_skin_norm2000.pkl')
learn2 = fastai.learner.load_learner('ada_learn_malben.pkl')
maxi.categories = learn.dls.vocab
maxi.categories2 = learn2.dls.vocab

# Crear la interfaz de Gradio
hf_image = gr.Image()  # Se elimina el argumento 'type' porque no es necesario
hf_plot = gr.Plot()

intf = gr.Interface(fn=maxi.predict_donut, 
                    inputs=hf_image, 
                    outputs=hf_plot, 
                    examples=maxi.examples,
                    title=maxi.title,
                    live=True,
                    article=maxi.article)

# Lanzar la interfaz
intf.launch(share=True)