evaluador / utils.py
yoel
Refactor: mejora la interfaz de evaluación agregando campos para nombre y matrícula, y actualiza la gestión del leaderboard
a2dd494
import torch
import json
import hashlib
from collections import Counter
from pathlib import Path
LEADERBOARD_PATH = Path("leaderboard.json")
def cargar_etiquetas():
with open("etiquetas.txt", "r") as f:
etiquetas = f.read().splitlines()[1:]
num_clases = len(etiquetas)
codigo = {etiqueta.lower(): i for i, etiqueta in enumerate(etiquetas)}
return etiquetas, num_clases, codigo
def multiclass_accuracy(predictions, labels):
# Obtén las clases predichas (la clase con la mayor probabilidad)
_, predicted_classes = torch.max(predictions, 1)
# Compara las clases predichas con las etiquetas verdaderas
correct_predictions = (predicted_classes == labels).sum().item()
# Calcula la precisión
accuracy = correct_predictions / labels.size(0)
return accuracy
def obtener_sha256(ruta_archivo):
sha256 = hashlib.sha256()
with open(ruta_archivo, "rb") as archivo:
for bloque in iter(lambda: archivo.read(8192), b""):
sha256.update(bloque)
return sha256.hexdigest()
def calcular_puntaje(accuracy):
accuracy_pct = accuracy * 100
base = max(0, min(accuracy_pct - 55, 20))
extra = 10 if accuracy_pct > 95 else 0
return int(base + extra)
def cargar_leaderboard():
if not LEADERBOARD_PATH.exists():
return []
with LEADERBOARD_PATH.open("r", encoding="utf-8") as f:
return json.load(f)
def _marcar_duplicados(registros):
conteo = Counter(entry["sha256"] for entry in registros)
for entry in registros:
entry["duplicado"] = conteo[entry["sha256"]] > 1
return registros
def guardar_registro_leaderboard(entry, max_entries=500):
registros = cargar_leaderboard()
registros.append(entry)
registros = registros[-max_entries:]
registros = _marcar_duplicados(registros)
LEADERBOARD_PATH.write_text(
json.dumps(registros, indent=2, ensure_ascii=False),
encoding="utf-8",
)
return registros
def limpiar_leaderboard():
LEADERBOARD_PATH.write_text("[]", encoding="utf-8")