Sistema de conteo de personas para Bilbao Kirolak, del Ayuntamiento de Bilbao. Procesa vídeo de múltiples cámaras y muestra la ocupación por centro y zona en un panel web.
Mi contribución
Pipeline de vídeo, backend e infraestructura GPU
Participé en el desarrollo del sistema, centrándome en el pipeline de vídeo, el backend y la infraestructura GPU sobre Kubernetes. El trabajo conecta la detección y el conteo de personas con los eventos de aforo y la visualización en tiempo real.
El problema
Controlar el aforo de varios centros exige convertir las entradas y salidas captadas por distintas cámaras en información de ocupación actualizada por zona.
La solución
Pipeline de detección y seguimiento con NVIDIA DeepStream y Savant, que cuenta cruces de línea y envía eventos firmados al backend Laravel. Kubernetes distribuye el procesamiento entre GPUs; la integración con Milestone XProtect obtiene las fuentes de vídeo y React presenta la ocupación y el vídeo en vivo mediante WebRTC.
De la cámara al aforo
El conteo empieza en una cámara y termina en la ocupación de una zona. En medio hay dos recorridos distintos: los eventos de aforo y el vídeo que consulta una persona.
Eventos de entrada y salida
Backend de aforoLaravel · HMAC · MySQLOcupación por zonaReact · WebSocketObtener el vídeo
Milestone · ONVIF · RTSP
La integración con Milestone XProtect obtiene la fuente RTSP. Un adaptador por cámara entrega el vídeo al sistema de análisis.
Distribuir el procesamiento
ZeroMQ · Kubernetes · GPU
El router distribuye los streams entre los pipelines Savant desplegados sobre GPU. Cada pipeline procesa sus cámaras.
Detectar, seguir y contar
DeepStream · Savant · Python
El detector localiza personas y el tracker sigue sus recorridos. El cruce de una línea configurada produce un evento de entrada o salida.
Actualizar la ocupación
Laravel · MySQL · Reverb
El backend recibe los eventos firmados con HMAC, actualiza el aforo y comunica los cambios al panel React mediante WebSocket.
Los datos de aforo
Los eventos conectan el análisis con la ocupación por centro y zona. El panel recibe las actualizaciones sin necesitar que alguien abra el vídeo.
El vídeo en vivo
Una salida independiente reúne los frames de las GPUs y los entrega al navegador mediante WebRTC. La codificación se activa bajo demanda cuando alguien consulta una cámara.
Los retos detrás del sistema
Un proceso vivo puede haber dejado de contar
La monitorización comprueba el avance real de frames y del procesamiento, además del estado de los contenedores. La detección de degradación y la recuperación con límites ayudan a evitar pipelines que aparecen activos pero ya no producen resultados.
Contar y mostrar vídeo comparten recursos
El procesamiento se distribuye entre GPUs y el vídeo en vivo reúne sus salidas. La codificación bajo demanda evita mantener NVENC trabajando para cámaras que nadie está consultando.
El entorno local y producción no se comportan igual
La documentación recoge incompatibilidades del pipeline de vídeo con GPUs de consumo y un modo MJPEG para el entorno local. Separar esa configuración del despliegue con Tesla T4 permite trabajar con las limitaciones de cada entorno.
Qué permite hacer
- Conteo de entradas y salidas por cruce de línea, con múltiples cámaras.
- Panel de ocupación por centro y zona, con alertas de capacidad.
- Vídeo en vivo mediante WebRTC y codificación bajo demanda.
- Gestión de modelos ONNX, activación y rollback desde el panel.
- Procesamiento multi-GPU e integración con Milestone XProtect.

