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
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:
# 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