GateVision
Documentación técnica · Portafolio

Cómo está construido GateVision.

Un sistema de reconocimiento de placas (LPR) offline-first, desplegado en el borde. Esta página es el showcase técnico público; el repositorio es privado.

Visión general del sistema

Sistema LPR monolítico, offline-first, desplegado en un único host (mini-servidor en portería) sobre Docker. Toda lectura y escritura golpea SQLite local; la nube es replicación asíncrona para respaldo y gestión.

Flujo de datos
Cámara RTSP (entrada/salida)Sustracción de fondo MOG2 + máscara ROIDetección YOLOv8 (confianza ≥ 0.6)OCR con PaddleOCR (reconocimiento ≥ 0.85)gate_logic.check_access() valida credencialDisparo del relé y apertura del portónRegistro en SQLite + evento SSEDashboard del portero (React)

Stack tecnológico

BACKEND

FastAPI · Python 3.12

API asíncrona con Uvicorn, sesiones aiosqlite por request.

VISION

YOLOv8 + PaddleOCR

Detección de placa (modelo propio yolo26_lpr_v3.pt) y OCR, ejecutados en CPU, sin GPU.

VISION

OpenCV (headless)

Captura de stream, MOG2 y máscara ROI por polígono.

DATA

SQLite (WAL) · SQLModel

Persistencia local en modo WAL, ORM async con SQLModel/SQLAlchemy.

FRONTEND

React 19 · Vite · Tailwind

SPA del dashboard, eventos en tiempo real vía SSE.

DEVOPS

Docker Compose · Pyarmor

Stack de 3 servicios, ofuscación selectiva del código de aplicación.

Offline-first y sincronización

Todas las operaciones críticas son locales. Un worker de sincronización corre cada 5 minutos y Litestream replica continuamente el WAL de SQLite a Supabase (Postgres + S3). Ante fallos de red, el sistema degrada con elegancia y reintenta en el siguiente ciclo.

  • Lecturas/escrituras siempre contra SQLite local.
  • Sync asíncrono cada 5 min, sin bloquear el acceso.
  • Litestream: replicación continua del WAL para recuperación ante desastres.
  • Toda llamada httpx con timeout explícito; los fallos se registran y continúan.

Pipeline de reconocimiento

El sistema filtra movimiento con MOG2 y una región de interés (ROI) antes de invocar el modelo, con cooldown por placa para evitar duplicados. Las lecturas se clasifican por confianza:

≥ 0.85

Autoriza

Se ejecuta la lógica de acceso, se dispara el relé y se registra el evento.

0.70 – 0.85

Minería de dataset

Se guarda el frame para reentrenar el modelo.

< 0.70

Descarta

Lectura de baja confianza, ignorada.

Modelo de datos y multi-tenant

Esquema 3NF particionado por complex_id (cada conjunto es un tenant). Tablas núcleo: Complex, Apartment, User, AccessCredential, VisitorAuth y AccessLog. El log de auditoría es inmutable y denormaliza la placa para conservar integridad aunque se borre la credencial.

Seguridad

  • Autenticación JWT con aislamiento multi-tenant por complex_id.
  • Cifrado AES-256 en reposo y en tránsito.
  • Licencia atada al hardware por huella (CPU + MAC + UUID de volumen).

Modo de operación actual

GateVision detecta, valida la credencial y dispara la apertura del portón mediante un controlador de relés, dejando el evento en el log inmutable. El portero conserva override manual desde el dashboard. Los tags RFID y la biometría de peatones son parte de la hoja de ruta.

La aplicación por dentro

Capturas reales del dashboard de operación.

Vista general del panel de operación.
Vista general del panel de operación.
Acceso autorizado: identidad, apartamento y placa.
Acceso autorizado: identidad, apartamento y placa.
Acceso denegado con motivo registrado.
Acceso denegado con motivo registrado.
Historial de eventos inmutable.
Historial de eventos inmutable.
Registro de residentes y credenciales.
Registro de residentes y credenciales.
Alta de visitantes con vigencia temporal.
Alta de visitantes con vigencia temporal.