Spaces:
Running
Running
Upload . with huggingface_hub
Browse files- .gitignore +1 -0
- .space/README +1 -0
- .space/meta +1 -0
- .streamlit/config.toml +6 -0
- Patacotrón.py +29 -0
- Spacefile +7 -0
- models/ptctrn_v1.5.h5 +3 -0
- models/ptctrn_v1.6.h5 +3 -0
- models/ptctrn_v1.8.h5 +3 -0
- models/ptctrn_v1.9.h5 +3 -0
- pages/Entorno de Ejecución.py +96 -0
- pages/Estadísticas.py +36 -0
- statistics.jpg +0 -0
.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