Sistema de vigilancia inteligente basado en visión por computador e inteligencia artificial para la detección y seguimiento automático de vehículos en zonas específicas. El sistema utiliza NVIDIA DeepStream SDK para realizar inferencia en tiempo real sobre streams de video, identificando vehículos y monitoreando su permanencia dentro de una Región de Interés (ROI) configurable.
- Detección de vehículos en tiempo real usando modelos pre-entrenados (ResNet10)
- ROI configurable con posicionamiento y dimensiones ajustables
- Sistema de alertas basado en tiempo de permanencia en la ROI
- Seguimiento multi-objeto con NvDCF tracker
- Generación automática de reportes con estadísticas de detección
- Soporte para múltiples modos de salida: archivo de video, streaming UDP/RTP y display local
- Visualización con código de colores:
- Verde: Vehículos fuera de la ROI
- Naranja: Vehículos dentro de la ROI (tiempo < límite)
- Rosa: Vehículos en alerta (tiempo > límite)
- Efecto de parpadeo al activarse la alerta
- Especificaciones de hardware
- Especificaciones de software
- Algoritmo y arquitectura
- Estructura del proyecto
- Prerequisitos
- Instalación
- Compilación
- Cómo utilizar
- Scripts de prueba
- Monitoreo de recursos
- Licencia
- Contacto
- SoC: Tegra X1
- SoM: NVIDIA Jetson Nano
- Carrier board: NVIDIA Jetson Nano Developer Kit
- Memoria: 4GB LPDDR4
- GPU: 128-core Maxwell
- BSP: JetPack 4.6.4
- Sistema operativo: Ubuntu 18.04 LTS
- Multimedia framework: GStreamer 1.14.5
- Video analytics / AI framework: NVIDIA DeepStream SDK 6.0
- Compilador: g++ 7.5.0 con soporte C++17
- Librerías adicionales: gst-pbutils, CUDA 10.2
El sistema utiliza un pipeline de DeepStream compuesto por los siguientes elementos:
- Decodificación de video:
nvv4l2decoderpara aceleración por hardware - Multiplexado de streams:
nvstreammuxcon resolución dinámica detectada - Inferencia primaria:
nvinfercon modelo ResNet10 pre-entrenado - Tracking multi-objeto:
nvtrackercon algoritmo NvDCF - Conversión de formato:
nvvideoconvert - Overlay en pantalla:
nvdsosdpara visualización de bounding boxes y ROI - Codificación:
nvv4l2h264encpara salida de video
El modelo ResNet10 detecta las siguientes clases de objetos:
- class_id 0: Car (Automóvil)
- class_id 1: Person (Persona) - Solo detectada, no rastreada
- class_id 2: Bicycle (Bicicleta)
- class_id 5: Bus
- class_id 7: Truck (Camión)
Solo los automóviles son rastreados y pueden generar alertas para efectos de esta aplicación.
El sistema implementa una máquina de estados para cada vehículo:
- STATE_OUTSIDE: Vehículo fuera de la ROI
- STATE_INSIDE: Vehículo dentro de la ROI, temporizador activo
- STATE_ALERT: Vehículo ha excedido el tiempo límite en la ROI
La verificación de posición se basa en el centro del bounding box del objeto.
IE0301-Proyecto-Final/
├── src/
│ ├── main.cpp # Punto de entrada de la aplicación
│ ├── video_utils.h/cpp # Detección automática de resolución
│ ├── config/
│ │ ├── app_config.hpp/cpp # Parser de argumentos CLI
│ │ └── track_info.hpp/cpp # Lógica de tracking y ROI
│ ├── pipeline/
│ │ └── pipeline.hpp/cpp # Construcción del pipeline GStreamer
│ ├── roi/
│ │ └── render.h/cpp # Renderizado del ROI y overlays
│ └── report/
│ └── report.hpp/cpp # Generación de reportes
├── build/ # Archivos objeto (generado)
├── bin/ # Ejecutable (generado)
├── videosPrueba/ # Videos de entrada para pruebas
├── resultados/ # Videos procesados (generado)
├── reportes/ # Reportes de detección (generado)
├── stats/ # Logs de tegrastats (generado)
├── plots/ # Gráficos de rendimiento (generado)
├── pruebas.sh # Script para probar configuraciones de ROI
├── test_videos.sh # Script para procesamiento batch
├── test_udp_network.sh # Script para streaming UDP
├── plot_stats.py # Visualizador de estadísticas
├── Makefile # Sistema de compilación
└── README.md # Este archivo
- NVIDIA JetPack 4.6.4 o superior
- DeepStream SDK 6.0
- GStreamer 1.14.5+
- Python 3.6+ (para scripts de monitoreo)
- VLC o FFplay (opcional, para visualización de streams UDP)
sudo apt-get install python3-matplotlib python3-numpygit clone https://github.com/dfonsecz/IE0301-Proyecto-Final.git
cd IE0301-Proyecto-Finalmkdir -p videosPrueba resultados reportes stats plots build binls /opt/nvidia/deepstream/deepstream/Si DeepStream no está instalado, siga la guía oficial de NVIDIA.
make clean
makeEl ejecutable se generará en bin/roi_surveillance.
make- Compila el proyectomake clean- Elimina archivos objetomake distclean- Elimina objetos y binariosmake help- Muestra ayuda
./bin/roi_surveillance vi-file <input.mp4> [opciones]--width <0-1>- Ancho del ROI normalizado (default: 0.4)--height <0-1>- Alto del ROI normalizado (default: 0.4)--left <0-1>- Posición X del ROI normalizado (default: centrado)--top <0-1>- Posición Y del ROI normalizado (default: centrado)--center- Forzar centrado automático del ROI
--time <segundos>- Tiempo máximo en ROI antes de alerta (default: 5)
--mode video- Guardar a archivo de video (default)--mode udp- Streaming por UDP/RTPvo-file <archivo>- Archivo de salida (modo video)
--udp-host <IP>- Dirección IP destino (default: 127.0.0.1)--udp-port <puerto>- Puerto UDP (default: 5000)
--file-name <archivo>- Nombre del archivo de reporte (default: report.txt)
./bin/roi_surveillance vi-file videosPrueba/video.mp4 vo-file output.mp4./bin/roi_surveillance vi-file input.mp4 vo-file output.mp4 \
--width 0.5 --height 0.5 --center --time 10./bin/roi_surveillance vi-file input.mp4 \
--mode udp --udp-host 192.168.1.100 --udp-port 5000./bin/roi_surveillance vi-file input.mp4 vo-file output.mp4 \
--left 0.2 --top 0.3 --width 0.6 --height 0.4 --time 8El proyecto incluye varios scripts para facilitar las pruebas:
Script interactivo para probar diferentes tamaños y posiciones del ROI.
./pruebas.shPermite probar:
- ROI pequeño, mediano y grande
- Diferentes posiciones (esquinas, centro)
- Diferentes tiempos de alerta
Procesa todos los videos en videosPrueba/ de forma automática.
./test_videos.shCaracterísticas:
- Procesa todos los archivos .mp4 en el directorio
- Genera videos de salida en
resultados/ - Crea reportes individuales en
reportes/ - Muestra estadísticas de éxito/fallo
Script para configurar y probar streaming UDP a otros dispositivos.
./test_udp_network.shFuncionalidad:
- Detecta automáticamente la IP del servidor
- Solicita la IP del cliente
- Genera archivo SDP para el cliente
- Configura firewall si es necesario
- Proporciona instrucciones para el cliente
Opción 1 - VLC:
vlc rtp://@:5000Opción 2 - GStreamer:
gst-launch-1.0 udpsrc port=5000 ! \
application/x-rtp,encoding-name=H264,payload=96 ! \
rtph264depay ! h264parse ! avdec_h264 ! \
videoconvert ! autovideosinkOpción 3 - FFplay:
ffplay -fflags nobuffer -i rtp://@:5000El sistema puede monitorear el uso de recursos durante el procesamiento usando tegrastats:
# El script quick_test.sh captura automáticamente estadísticas
./test_videos.shLos logs se guardan en stats/ con formato {video}_stats.log.
Genera gráficos de uso de CPU, GPU, RAM y temperatura:
# Procesar todos los logs
python3 plot_stats.py
# Procesar un archivo específico
python3 plot_stats.py stats/video_stats.log
# Solo generar gráfico combinado
python3 plot_stats.py --allLos gráficos se generan en plots/ en formato PNG (300 DPI).
- Uso de CPU por core y promedio
- Uso de GPU (frecuencia y porcentaje)
- Consumo de RAM (MB y porcentaje)
- Temperatura del CPU (°C)
- Consumo de energía (Watts)
El sistema genera un reporte de texto con el siguiente formato:
ROI: left: 249 top: 139 width: 332 height: 185
Max time: 5s
Detected: 2 (1)
1:32 Car time 12s alert
1:32 Car time 3s
Donde:
- Primera línea: Coordenadas del ROI en píxeles
- Segunda línea: Tiempo máximo configurado
- Tercera línea: Total detectado (alertas generadas)
- Líneas siguientes: Timestamp, clase de vehículo, tiempo en ROI, estado de alerta
Verificar rutas de configuración de DeepStream:
ls /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/- Verificar conectividad de red
- Verificar firewall:
sudo ufw allow 5000/udp - Iniciar cliente antes que el servidor
- Verificar que el puerto no esté en uso
Este proyecto utiliza una licencia del MIT. Los detalles pueden encontrarse en LICENSE.
- Byron Arguedas: byronarglop@gmail.com
- Daniela Fonseca: daniela.fonsecazumbado@gmail.com
- Mariana Solís: solisfanny2021@gmail.com