Todos los proyectos

ConteoBK

Control de aforo con visión artificial y vídeo en tiempo real.

Proyecto estrella · IA y datosSistema desplegado

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.

Cámaras conectadasMilestone · RTSPDetección y seguimientoDeepStream · Savant · GPU
Selecciona un componente para conocer su función en el mapa.
  1. Obtener 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.

  2. Distribuir el procesamiento

    ZeroMQ · Kubernetes · GPU

    El router distribuye los streams entre los pipelines Savant desplegados sobre GPU. Cada pipeline procesa sus cámaras.

  3. 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.

  4. 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.

Cómo funciona

Las imágenes de las cámaras se convierten en eventos y ocupación visible por centro y zona.

Selecciona una parte del mapa para conocer su función.

Cámaras conectadas

El ONVIF Bridge de Milestone XProtect proporciona las fuentes RTSP. El sistema gestiona varias cámaras y las relaciona con sus centros y zonas.

Detección en GPU

El pipeline detecta y sigue personas, y cuenta cruces de línea para identificar entradas y salidas. Kubernetes distribuye los pipelines entre GPUs; el panel permite activar modelos ONNX y hacer rollback.

Eventos y ocupación

Los cruces se envían como eventos firmados al backend. Laravel registra los movimientos y mantiene el aforo por zona, con Redis y Reverb para los procesos y la actualización en tiempo real.

Panel y vídeo en vivo

El dashboard muestra ocupación y alertas por centro y zona. WebRTC permite inspeccionar el vídeo en vivo y la codificación se activa bajo demanda cuando alguien lo consulta.

¿Encaja con lo que buscas?

Podemos hablar sobre tu equipo y el software que necesitas construir.

Escríbeme