moonboard-2 / app.py
Ignaciobfp's picture
Update app.py
883a28a verified
import gradio as gr
import numpy as np
from PIL import Image
from fastai.vision.all import *
from huggingface_hub import from_pretrained_fastai
import pathlib
# Cargar el modelo preentrenado
repo_id = "ignaciobfp/moonboard_difficulty"
learner = from_pretrained_fastai(repo_id)
labels = learner.dls.vocab
# Funci贸n para realizar predicciones
def predict(img):
pred,pred_idx,probs = learner.predict(img)
return {labels[i]: float(probs[i]) for i in range(len(labels))}
def row_to_image(presas, ano, inclinacion):
m, n = 20, 18
image_matrix = np.zeros((n, m, 3), dtype=np.uint8)
for presa in presas:
letra, numero = presa[0], int(presa[1:])
valor = 1 # Se asume que todas las presas marcadas son blancas
image_matrix[numero-1, ord(letra) - ord('A')] = [255 * valor, 255 * valor, 255 * valor]
ano_scaled = (ano - 2016) / (2019 - 2016)
grey_intensity_ano = int(ano_scaled * (255 - 50) + 50)
image_matrix[:, -7:-5] = [grey_intensity_ano, grey_intensity_ano, grey_intensity_ano]
inclinacion_scaled = (inclinacion - 25) / (40 - 25)
grey_intensity_inclinacion = int(inclinacion_scaled * (100) + 100)
image_matrix[:, -3:-1] = [grey_intensity_inclinacion, grey_intensity_inclinacion, grey_intensity_inclinacion]
image_matrix_padded = np.pad(image_matrix, ((3, 3), (2, 2), (0, 0)), mode='constant')
image_pil = Image.fromarray(image_matrix_padded, 'RGB')
new_size = (image_pil.width * 3, image_pil.height * 3)
resized_image_pil = image_pil.resize(new_size, resample=Image.NEAREST)
return resized_image_pil
def mostrar_parametros(ano, inclinacion, *seleccion):
# Imprimir en el log la variable seleccion
print("Seleccion:", seleccion)
# Asegurarse de que la selecci贸n sea una lista plana
seleccion_plana = [item for sublist in seleccion for item in sublist]
imagen = row_to_image(seleccion_plana, int(ano), int(inclinacion))
return (imagen, predict(imagen))
# Generar todas las combinaciones posibles de letras y n煤meros
letras = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
numeros = list(map(str, range(1, 19)))
combinaciones = [f"{letra}{numero}" for numero in numeros for letra in letras]
# Dividir las combinaciones en listas de 11 elementos (A-K)
combinaciones_por_filas = [combinaciones[i:i+11] for i in range(0, len(combinaciones), 11)]
# Crear la interfaz
inputs = [
gr.Dropdown(["2016", "2017", "2019"], label="A帽o"),
gr.Dropdown(["25", "40"], label="Inclinaci贸n"),
]
# Agregar un CheckboxGroup para cada fila (del 1 al 18)
for i, fila in enumerate(combinaciones_por_filas, start=1):
inputs.append(gr.CheckboxGroup(fila, label=f"Fila {i}", scale=4, min_width=2000))
iface = gr.Interface(
fn=mostrar_parametros,
inputs=inputs,
outputs=[gr.Image(label="Output"), gr.Label("Predicci贸n del Modelo")],
)
iface.launch(share=False)