File size: 6,182 Bytes
61172ff
 
c458088
61172ff
8a1e479
55c3ec2
61172ff
 
 
6a7ecb7
61172ff
 
 
 
 
 
f6f244b
d0f65b9
c4cf1cf
61172ff
3f7c323
bf4858a
3f7c323
23518e7
3f7c323
d0f65b9
3f7c323
 
b6152a3
 
3f7c323
 
92f82c8
3f7c323
 
 
b6152a3
3f7c323
 
 
 
23518e7
3f7c323
 
 
 
 
f664cd8
3f7c323
 
 
f664cd8
 
c4cf1cf
3f7c323
e07bf57
3f7c323
f664cd8
3f7c323
3148aff
 
f664cd8
 
80eca14
8a1e479
f664cd8
3148aff
dc41bf1
 
f664cd8
 
79efe44
dc41bf1
 
 
 
 
8a1e479
3f7c323
 
 
 
 
 
4aaeb5c
 
 
3f7c323
 
 
8a1e479
3f7c323
dc41bf1
3f7c323
 
 
 
 
49b9b87
8a1e479
49b9b87
8a1e479
49b9b87
8a1e479
3f7c323
 
d0f65b9
f664cd8
8a1e479
49b9b87
8a1e479
49b9b87
3f7c323
5029012
3f7c323
f9bd8a4
3f7c323
c4cf1cf
f6f244b
5ba58ac
3f7c323
75d3600
7d7fb98
f9bd8a4
36bf530
3f7c323
 
77ce902
 
 
 
 
 
 
 
 
 
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 streamlit as st
import tensorflow as tf
from tensorflow.keras.models import load_model
import os
import cv2
import numpy as np

st.set_page_config(
    page_title = 'Patacotrón',
    layout = 'wide',
    menu_items = {
        "About" : 'Proyecto ideado para la investigación de "Clasificación de imágenes de una sola clase con algortimos de Inteligencia Artificial".',
        "Report a Bug" : 'https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link'
    }
)

st.sidebar.write("contact@patacotron.tech")

cnn, autoencoder, svm, iforest, gan, vit = st.tabs(["CNN", "Autoencoder", "OC-SVM", 'iForest', 'GAN', 'ViT'])

with cnn:

    col_a, col_b, = st.columns(2)
    
    with col_a:
        st.title("Redes neuronales convolucionales")
        st.caption("Los modelos no están en orden de eficacia, sino en orden de creación.")
        
        current_dir = os.getcwd()
        root_dir = os.path.dirname(current_dir)
        
        # Join the path to the models folder
        DIR = os.path.join(current_dir, "models")
        models = os.listdir(DIR)
        
        model_dict = dict()
        for model in models: #preprocessing of strings so the name is readable in the multiselect bar
            model_name = model.split(DIR)
            model_name = str(model.split('.h5')[0])
            model_dir = os.path.join(DIR, model)
            model_dict[model_name] = model_dir
    
        ultraversions = ['ptctrn_v1.4', 'ptctrn_v1.5', 'ptctrn_v1.6', 'ptctrn_v1.12']
        ultra_button = st.checkbox('Ultra-Patacotrón (mejores resultados)')
        ultra_flag = False
        if ultra_button:
            ultra_flag = True
            weight_list = [1, 1.4, 1.1, 7]
        
        # Create a dropdown menu to select the model
        model_choice = st.multiselect("Seleccione uno o varios modelos de clasificación", model_dict.keys())
        weight_list = []
        threshold = st.slider('¿Cuál va a ser el límite donde se considere patacón? (el valor recomendado para Ultra-Patacotrón es 60%, para los demás, 75%-80%)', 0, 100, 75)
        
        selected_models = []
    
        @tf.function
        def tf_predict(model_list, weights, img): #faster, but for few formats
            y_gorrito = 0
            raw_img = tf.image.decode_image(img, channels=3)
            img = tf.image.resize(raw_img,(IMAGE_WIDTH, IMAGE_HEIGHT))
            for model, weight in zip(model_list, weights):
                y_gorrito += tf.cast(model(tf.expand_dims(img/255., 0)), dtype=tf.float32)*weight
            return [y_gorrito / sum(weights), raw_img.numpy()]

        def basic_predict(model_list, weights, img): #for non-supported formats
            y_gorrito = 0
            raw_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            img = cv2.resize(img, (IMAGE_WIDTH, IMAGE_HEIGHT))
            for model, weight in zip(model_list, weights):
                y_gorrito += tf.cast(model(tf.expand_dims(img/255., 0)), dtype=tf.float32)*weight
            return [y_gorrito / sum(weights), raw_img]

        def preprocess(file_uploader): #makes the uploaded image readable
            img = np.frombuffer(uploaded_file.read(), np.uint8)
            img = cv2.imdecode(img, cv2.IMREAD_COLOR)
            return img
                
        # Set the image dimensions
        IMAGE_WIDTH = IMAGE_HEIGHT = 224
    
        executed = False
        
    with col_b:
        
        uploaded_file = st.file_uploader(label = '',type= ['jpg','png', 'jpeg', 'jfif', 'webp', 'heic'])
        
        if st.button('¿Hay un patacón en la imagen?'):
            if len(selected_models) > 0 and ultra_flag:
                st.write('Debe elegir un solo método: Ultra-Patacotrón o selección múltiple.')
            
            elif uploaded_file is not None:
                img = preprocess(uploaded_file)
                if ultra_flag:
                    with st.spinner('Cargando ultra-predicción...'):
                        if not executed: 
                            ultraptctrn = [load_model(model_dict[model]) for model in ultraversions]
                            executed = True
                        final_weights = weight_list if len(weight_list) >= 1 else [1 for i in range(len(ultraptctrn))]
                        try:
                            y_gorrito, raw_img = tf_predict(ultraptctrn, final_weights, img)
                        except:
                            y_gorrito, raw_img = basic_predict(ultraptctrn, final_weights, img)
                        
                else:
                    with st.spinner('Cargando predicción...'):
                        selected_models = [load_model(model_dict[model]) for model in model_choice if model not in selected_models]
                        final_weights = weight_list if len(weight_list) >= 1 else [1 for i in range(len(selected_models))]
                        try:             
                            y_gorrito, raw_img = tf_predict(selected_models, final_weights, img)
                        except:
                            y_gorrito, raw_img = basic_predict(selected_models, final_weights, img)
        
                if round(float(y_gorrito*100)) >= threshold:
                    st.success("¡Patacón Detectado!")
                
                else:
                    st.error("No se considera que haya un patacón en la imagen")
                    
                st.caption(f'La probabilidad de que la imagen tenga un patacón es del: {round(float(y_gorrito * 100), 2)}%')
                st.caption('Si los resultados no fueron los esperados, por favor, [haz click aquí](https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link)')
                
                st.image(raw_img)
            
            else:
                st.write('Revisa haber seleccionado los modelos y la imagen correctamente.')

with autoencoder:
    st.write('Próximamente')
with svm:
    st.write('Próximamente')
with iforest:
    st.write('Próximamente')
with gan:
    st.write('Próximamente')
with vit:
    st.write('Próximamente')