Saltar al contenido
giron.ai
← Proyectos

El Empleado Juan

El reconocimiento facial deja de ser demo cuando corre en hardware de doscientos dólares.

Con
co-fundador, MTCNN, RetinaFace, FaceNet, ArcFace, anti-spoofing, edge, Hikvision, GPS

Co-fundador. SaaS B2B de control de asistencia biométrica y prenómina automatizada para PYMEs latinoamericanas.

Captura en tres capas

Ningún cliente tiene una sola realidad operativa, así que el sistema marca de tres formas y las concilia:

  • Quiosco con reconocimiento facial propio — pipeline de detección con MTCNN/RetinaFace, embeddings con FaceNet/ArcFace, anti-spoofing, desplegado en hardware de bajo costo.
  • Relojes Hikvision, para las plantas que ya tenían terminales instaladas.
  • Marcación móvil con GPS y geocercas, para el personal en ruta.

La otra mitad: la ley

La biometría sólo resuelve quién marcó y cuándo. Lo que el cliente compra es lo que viene después: el cálculo de nómina colombiano conforme a la reforma laboral — Ley 2101 de 2021, semana de 42 horas, recargos auditables minuto a minuto. Cada día trabajado se liquida con la ley vigente ese día, incluso cuando el período cruza un cambio normativo.

Juanito, el asistente de IA, cierra el círculo por WhatsApp: marcar, consultar horario y horas, pedir permisos.

Escala real

Cliente ancla: una operación de logística de alimentos con 900 empleados en Medellín.

El origen fue un bot de WhatsApp sobre Twilio que se convirtió en plataforma. La biometría que empecé en los quioscos del Tribunal Electoral, ahora en manos de las PYMEs.

El pipeline, de la cámara a la marca

De la cámara a la marca: detección, alineación, anti-spoofing, embedding y decisión por umbral. Cámaraframe RGB DetecciónRetinaFace Alineación5 puntos ¿Vivo?anti-spoofing EmbeddingArcFace, 512-d Decisiónumbral por sede una foto muere aquí
El anti-spoofing va antes del matcher: una foto no debe llegar a comparar.

Los vectores salen normalizados, así que la similitud coseno es un producto escalar y comparar contra la sede entera es una multiplicación matriz-vector:

sim⁡(u,v)=u⋅v∥u∥ ∥v∥=u⋅vcon∥u∥=∥v∥=1\operatorname{sim}(u,v)=\frac{u\cdot v}{\lVert u\rVert\,\lVert v\rVert}=u\cdot v \qquad\text{con}\qquad \lVert u\rVert=\lVert v\rVert=1
# El índice es por SEDE, no global: comparar contra los 900 vectores de
# una planta no es la misma operación que contra los 40.000 del cliente.
indice = sede.embeddings()                    # (n, 512) float32, L2-normalizados

def identificar(rostro: np.ndarray, umbral: float) -> Marca | None:
    if not vivo(rostro):          # anti-spoofing primero: una foto
        return None               # no tiene por qué llegar al matcher

    v = arcface.embed(alinear(rostro))        # (512,)
    similitudes = indice @ v                  # coseno, por ser unitarios
    i = int(similitudes.argmax())

    # El umbral se calibra con los datos de ESTA sede. El de laboratorio
    # no sobrevive al primer turno: cámara barata, contraluz a las 6 a.m.
    # y gente con prisa mueven la distribución entera.
    return Marca(sede.empleado(i)) if similitudes[i] >= umbral else None

Todo esto corre en el propio quiosco. Subir el frame a un servidor sería más cómodo de programar y convertiría cada caída de red en una planta que no puede marcar.

Escríbeme

Si estás pensando en hacer algo con IA y quieres hablarlo con alguien que ya lo puso en producción, escríbeme. Contesto yo.

hola@giron.ai