Emfuvision es una aplicación de escritorio (PySide6) que captura video en vivo, ejecuta detección con modelos YOLOv11, genera visualizaciones interactivas (overlays, máscara dinámica tipo heatmap y métricas en vivo) y guarda cada paquete de información en SQLite para poder analizar tráfico de personas en entornos comerciales.
Estado actual: WIP/alpha – el código es funcional para pruebas locales con cámaras USB/videos pregrabados y continúa en evolución.
┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌───────────┐
│ Cámara │→→│ Captura │→→│ Inferencia│→→│ Merge/ │→→│ Base de │
│ / video │ │(Media) │ │(YOLO) │ │Heatmap │ │datos SQLite│
└─────────┘ └─────────┘ └──────────┘ └─────────┘ └───────────┘
↘ métricas UI y mascaras ↗
modules/Capabre la fuente, normaliza el frame y comparte la máscara dibujada.modules/MLejecuta seguimiento/detección conultralytics.YOLOy expone los paquetes de detecciones.modules/Mergcrea la visualización final (overlays + máscara dinámica que resalta zonas calientes) y alimenta los gráficos del dock de métricas.modules/DBpersiste cada frame y sus detecciones enemfuvision.sqlite3.
- Python 3.9 (probado en Windows 11 + WSL, debería funcionar en Linux/macOS con backend de cámara disponible).
- GPU opcional; por defecto usa CPU. Si quieres Coral TPU, instala
pycoralsiguiendo la guía oficial. - Dependencias principales:
PySide6,pyqtgraphopencv-python,numpyultralytics(modelos YOLOv11, en el repo ya se incluyenyolo11n.ptyyolo11s.pt)onnx,tensorflow-cpu,tf_keras,sng4onnx,onnx_graphsurgeon(para futuros experimentos/exportaciones)- SQLite3 viene incluido con Python.
Consulta requirements.txt para las versiones mínimas. PySide6 y pyqtgraph no aparecen allí porque suelen instalarse aparte (ver pasos de instalación).
- Clonar el repositorio
git clone https://github.com/<usuario>/Emfuvision.git cd Emfuvision
- Crear y activar entorno (Conda recomendado)
conda create -p .venv python=3.9 conda activate .venv
- Instalar dependencias base
pip install -r requirements.txt pip install PySide6 pyqtgraph
- (Opcional) Coral TPU
pip install --extra-index-url https://google-coral.github.io/py-repo/ "numpy<2" pycoral~=2.0 - Verificar pesos YOLO: deja
yolo11n.pt/yolo11s.pten la raíz o apuntaParams → Modeloal archivo que prefieras.
python main.py- Vista central: video original con cajas + máscara dinámica en paralelo.
- Dock de métricas (
MetricsDock): latencia por etapa (captura, inferencia, merge y total) + conteo de personas. - Dock de parámetros (
ParamsDock):- Selecciona cámara o archivo (combo
Fuente de videoo botón Buscar). - Ajusta modelo (
yolo11n.pt,yolo11s.pt, etc.), backend y tamaño de entrada. - Cambia thresholds (confianza y NMS) o activa/desactiva overlays.
- Selecciona cámara o archivo (combo
Para terminar, cierra la ventana. El MainWindow se encarga de detener los hilos (MediaWorker, InferWorker, MargeWorker, DBaseWorker).
- Se crea automáticamente
emfuvision.sqlite3con dos tablas:frames: id, timestamp, ancho/alto y número de detecciones.detections: bounding boxes + clase/confianza para cada frame.
- Puedes inspeccionarla con cualquier cliente SQLite (DB Browser, DBeaver, etc.).
- Si necesitas limpiar datos, elimina el archivo
.sqlite3y se regenerará al arrancar.
main.py # Arranca la app PySide6
modules/
Cap/ # Captura y preprocesamiento
ML/ # Modelos YOLO + lógica de inferencia
Merg/ # Overlays y máscara dinámica
DB/ # Persistencia en SQLite
UI/ # Widgets, docks y ventana principal
Admin/ # Tipos compartidos y estado global (máscara)
Resources/ # Videos/imágenes de prueba
enviroment.yml # Entorno alterno para Conda/Mamba
requirements.txt # Dependencias base para pip
MediaWorkerlee la fuente con OpenCV, recorta a formato cuadrado, convierte a RGB y añade la máscara compartida.InferWorkerrecibe cadaPacket, correYOLO.track(seguimiento persistente) y adjunta detecciones.MargeWorkercrea los frames con overlays, calcula la máscara dinámica tipo heatmap (dinamicMask) y alimenta los gráficos.DBaseWorkerguarda el resultado en SQLite para futuras estadísticas.
Cada etapa usa colas queue.Queue independientes y se ejecuta en su propio QThread, manteniendo la UI responsiva.
- Conectar dashboard web/PowerBI a la base de datos para visualizar largas sesiones.
- Añadir anonimización avanzada (blurring dinámico) antes de guardar frames.
- Integrar motor de reglas para alertas en vivo (ocupación máxima, zonas calientes).
- Soporte directo para Coral TPU (
modules/ML/utils/Inference_coral.py).
Si encuentras bugs o quieres proponer mejoras, abre un issue o envía un PR. ¡Gracias por probar Emfuvision!