frncscp commited on
Commit
61172ff
1 Parent(s): 57a2b8f

Upload . with huggingface_hub

Browse files
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .space
.space/README ADDED
@@ -0,0 +1 @@
 
 
1
+ Don't commit this folder (.space) to git as it may contain security-sensitive data.
.space/meta ADDED
@@ -0,0 +1 @@
 
 
1
+ {"id":"e0dJkRg93coB","name":"Patacotron","alias":"patacotron"}
.streamlit/config.toml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ [theme]
2
+ primaryColor="#3d2c2c"
3
+ backgroundColor="#d29213"
4
+ secondaryBackgroundColor="#b7b791"
5
+ textColor="#604747"
6
+
Patacotrón.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ st.set_page_config(
4
+ page_title = 'Patacotrón',
5
+ layout= 'wide',
6
+ initial_sidebar_state = 'collapsed',
7
+ menu_items = {
8
+ "About" : 'Proyecto ideado para la investigación de "Clasificación de imágenes de una sola clase con algortimos de Inteligencia Artificial".',
9
+ "Report a Bug" : 'https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link'
10
+ }
11
+ )
12
+
13
+ st.title("Patacotrón™: Página principal")
14
+
15
+ st.markdown(
16
+ """
17
+ Patacotrón es un proyecto desarrollado simultáneamente con una investigación sobre "Clasificación de imágenes de una sola clase con algoritmos de Inteligencia
18
+ Artificial".
19
+
20
+ Su función es clasificar patacones como clase positiva, y objetos anómalos como clase
21
+ negativa, esta página permite usar diferentes modelos (y unirlos para sacar el promedio
22
+ de varias predicciones) y reportar errores, además de entender cómo se clasificaron según
23
+ su eficacia.
24
+
25
+ Repositorio del proyecto: https://github.com/frncscp/ptctrn
26
+
27
+ Ante cualquier error o bug que presente la página, por favor, entre al ícono de las tres barras ubicado arriba a la izquierda y presione "Report a Bug"
28
+ """
29
+ )
Spacefile ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Spacefile Docs: https://go.deta.dev/docs/spacefile/v0
2
+ v: 0
3
+ micros:
4
+ - name: Patacotron
5
+ src: Patacotrón.py
6
+ engine: python3.9
7
+ primary: true
models/ptctrn_v1.5.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7bd5173455ce4677eab79f82602b3eeed313f8d4b141f1769fdb2b4339379e72
3
+ size 33410336
models/ptctrn_v1.6.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2ca3c1ae258fdc53c450c631aa6644a9d99d03bfa90a91ab0b87fa783b77c165
3
+ size 48283832
models/ptctrn_v1.8.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e18f1c1fe84686a08e462c4e32b0f9d0b57c93e9792c7ca763c516101ce3a397
3
+ size 104925176
models/ptctrn_v1.9.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:49176cf2d8b230081ef9ad25aa189e8734f550aa23e0525ed2bfc4852ae7da0f
3
+ size 53272040
pages/Entorno de Ejecución.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ import streamlit as st
4
+ import tensorflow as tf
5
+ import numpy as np
6
+ from keras.models import load_model
7
+ from tensorflow.keras.backend import clear_session
8
+ import cv2
9
+ import os
10
+
11
+ st.set_page_config(
12
+ page_title = 'Patacotrón',
13
+ layout= 'wide',
14
+ initial_sidebar_state = 'collapsed',
15
+ menu_items = {
16
+ "About" : 'Proyecto ideado para la investigación de "Clasificación de imágenes de una sola clase con algortimos de Inteligencia Artificial".',
17
+ "Report a Bug" : 'https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link'
18
+ }
19
+ )
20
+
21
+
22
+ st.title("Entorno de ejecución")
23
+ st.markdown("Los modelos no están en orden de eficacia, sino en orden de creación. En la pestaña de Estadísticas podrá encontrar más información.")
24
+
25
+ DIR = 'D:\ptctrn\modelos\models'
26
+ models = os.listdir(DIR)
27
+
28
+ model_dict = dict()
29
+ #for model in models:
30
+ # model_name = model.split(DIR)
31
+ # model_dict[model_name] = 0
32
+ #model_list = []
33
+
34
+ for model in models:
35
+ model_name = model.split(DIR)
36
+ model_name = str(model.split('.h5')[0])
37
+ model_dir = os.path.join(DIR, model)
38
+ model_dict[model_name] = model_dir
39
+ #model_list.append(os.path.join(DIR, model))
40
+
41
+ # Create a dropdown menu to select the model
42
+ model_choice = st.multiselect("Seleccione un modelo de clasificación", model_dict.keys())
43
+
44
+ selected_models = []
45
+ for model in model_choice:
46
+ selected_models.append(model)
47
+
48
+ def ensemble_model(model_list, img):
49
+ average = len(model_list)
50
+ y_gorrito = np.zeros((1, 1))
51
+ for model in model_list:
52
+ instance_model = load_model(model_dict[model])
53
+ y_gorrito += float(instance_model.predict(np.expand_dims(img, 0)))
54
+ clear_session()
55
+ return y_gorrito/average
56
+
57
+ # Set the image dimensions
58
+ IMAGE_WIDTH = IMAGE_HEIGHT = 224
59
+
60
+ # Create a file uploader widget
61
+ uploaded_file = st.file_uploader("Elige una imagen...", type= ['jpg','png', 'jpeg', 'jfif', 'webp', 'heic'])
62
+
63
+ if uploaded_file is not None:
64
+ # Load the image and resize it to the required dimensions
65
+ img = np.frombuffer(uploaded_file.read(), np.uint8)
66
+ img = cv2.imdecode(img, cv2.IMREAD_COLOR)
67
+ raw_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
68
+ img = cv2.resize(img, (IMAGE_WIDTH, IMAGE_HEIGHT))
69
+
70
+ # Convert the image to RGB and preprocess it for the model
71
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
72
+ img = img / 255
73
+
74
+ # Pass the image to the model and get the prediction
75
+ with st.spinner('Cargando predicción...'):
76
+ y_gorrito = ensemble_model(selected_models, img)
77
+ #y_gorrito = model.predict(np.expand_dims(img, 0))
78
+
79
+ # Show the image
80
+ col1, col2, col3 = st.columns(3)
81
+
82
+ with col1:
83
+ st.write(' ')
84
+
85
+ with col2:
86
+ #check_type = isinstance(y_gorrito, (int, float))
87
+ #if not check_type:
88
+ #st.write('No se ha escogido ningún modelo.')
89
+ #else:
90
+ st.write(f'La probabilidad de que la imagen tenga un patacón es del: {round(float(y_gorrito), 2)*100}%')
91
+ st.write('Si los resultados no fueron los esperados, por favor, despliga la barra lateral y entra al botón "Report a Bug"')
92
+ st.image(raw_img)
93
+
94
+ with col3:
95
+ st.write(' ')
96
+
pages/Estadísticas.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ st.set_page_config(
4
+ page_title = 'Patacotrón',
5
+ layout= 'wide',
6
+ initial_sidebar_state = 'collapsed',
7
+ menu_items = {
8
+ "About" : 'Proyecto ideado para la investigación de "Clasificación de imágenes de una sola clase con algortimos de Inteligencia Artificial".',
9
+ "Report a Bug" : 'https://docs.google.com/forms/d/e/1FAIpQLScH0ZxAV8aSqs7TPYi86u0nkxvQG3iuHCStWNB-BoQnSW2V0g/viewform?usp=sf_link'
10
+ }
11
+ )
12
+
13
+ st.title("Estadísticas")
14
+
15
+ col1, col2, col3 = st.columns(3)
16
+
17
+ with col1:
18
+ statistics = 'statistics.jpg'
19
+ st.image(statistics)
20
+
21
+ with col2:
22
+ st.write('Se usaron 4 carpetas distintas que suman +15000 archivos: ')
23
+ st.write('Patacón-True/Frames: imágenes de patacones.')
24
+ st.write('Bias/Almost-Patacón: objetos similares a patacones.')
25
+ st.write('La eficiencia fue formulada de la siguiente manera: ')
26
+ st.write('Para clases positivas: ')
27
+ st.latex(r'''E = \frac{(S * {S}')+(P * {P}')}{{S}'+{P}'}''')
28
+ st.write('Para clases negativas: ')
29
+ st.latex(r'''E = \frac{(S * {S}')+((1-P) * {P}')}{{S}'+{P}'}''')
30
+
31
+ with col3:
32
+ st.write('Donde:')
33
+ st.write('S es la puntuación (score) normalizada entre 0 y 1, donde por cada imagen sumaba un punto y por cada falso positivo se le restaba otro. La franja para predecir la clase como positiva fue de encima del 80%')
34
+ st.write('P es la predicción promedio entre 0 y 1 para todas las imágenes de la carpeta.')
35
+ st.write("S′ y P′ son los pesos para cada variable, en este caso, la predicción tuvo un peso de 1.2")
36
+ st.write("El rango de la fórmula es de [0, 1), representando 1 un modelo con la mayor eficiencia posible que generaliza bien y es igualmente bueno para predecir clases positivas y anómalas. ")
statistics.jpg ADDED