From be4a3f2a925a0cf20029b2912b3adb3eaffb85bf Mon Sep 17 00:00:00 2001 From: ecuellar Date: Fri, 10 Apr 2026 15:33:40 -0600 Subject: [PATCH] =?UTF-8?q?Integraci=C3=B3n=20completa=20de=20Core,=20Conf?= =?UTF-8?q?iguraci=C3=B3n=20de=20Bocina=20e=20IA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 352 +-- README.md | 122 +- bus.jpg | Bin 0 -> 137419 bytes cache_nombres/nombre_Rosa Maria.mp3 | Bin 10512 -> 0 bytes comandos.txt | 26 + config/speaker_iot/settings.ini | 13 + configurar_bocina.py | 78 + core/speaker_iot/__init__.py | 21 + core/speaker_iot/bocina_core.py | 224 ++ core/speaker_iot/config.py | 108 + core/speaker_iot/ejemplo.py | 60 + .../speaker_iot/settings.ini | 0 core/speaker_iot/test_esp32.py | 409 +++ db_institucion/Diana Laura.jpg | Bin 4810 -> 0 bytes db_institucion/Ian Axel.jpg | Bin 3120 -> 0 bytes fusion.py | 7 +- generar_db_rostros.py | 218 +- prueba_video.py | 84 +- reconocimiento2.py | 938 +++--- requirements.txt | 192 +- runs/detect/predict2/bus.jpg | Bin 0 -> 365848 bytes vesiones_seguras.txt | 2516 ++++++++--------- 22 files changed, 3161 insertions(+), 2207 deletions(-) create mode 100644 bus.jpg delete mode 100644 cache_nombres/nombre_Rosa Maria.mp3 create mode 100644 comandos.txt create mode 100644 config/speaker_iot/settings.ini create mode 100644 configurar_bocina.py create mode 100644 core/speaker_iot/__init__.py create mode 100644 core/speaker_iot/bocina_core.py create mode 100644 core/speaker_iot/config.py create mode 100644 core/speaker_iot/ejemplo.py rename cache_nombres/nombre_Jose Maria.mp3 => core/speaker_iot/settings.ini (100%) create mode 100644 core/speaker_iot/test_esp32.py delete mode 100644 db_institucion/Diana Laura.jpg delete mode 100644 db_institucion/Ian Axel.jpg create mode 100644 runs/detect/predict2/bus.jpg diff --git a/.gitignore b/.gitignore index 232b864..0e2db4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,174 +1,178 @@ -# ---> Python -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - - -# ──────────────────────────────────────────────────────── -# ENTORNO VIRTUAL DEL PROYECTO -# ──────────────────────────────────────────────────────── -ia_env/ - -# ──────────────────────────────────────────────────────── -# MODELOS DE IA (Límite de GitHub: 100 MB) -# ──────────────────────────────────────────────────────── - -*.pt - *.onnx \ No newline at end of file +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +ven2/ +.venv/ +__pycache__/ +*.pkl + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + + +# ──────────────────────────────────────────────────────── +# ENTORNO VIRTUAL DEL PROYECTO +# ──────────────────────────────────────────────────────── +ia_env/ + +# ──────────────────────────────────────────────────────── +# MODELOS DE IA (Límite de GitHub: 100 MB) +# ──────────────────────────────────────────────────────── + +*.pt + *.onnx diff --git a/README.md b/README.md index d10df45..4c6456d 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,62 @@ -# Sistema de Identificación y Seguimiento Inteligente - -Este repositorio contiene la arquitectura modular para el seguimiento de personas en múltiples cámaras (Re-ID) y reconocimiento facial asíncrono. - -## Arquitectura del Proyecto -El sistema está dividido en tres módulos principales para garantizar la separación de responsabilidades: -* `seguimiento2.py`: Motor matemático de Tracking (Kalman + YOLO) y Re-Identificación (OSNet). -* `reconocimiento2.py`: Motor de biometría facial (YuNet + ArcFace) y síntesis de audio (Edge-TTS). -* `main_fusion.py`: Orquestador principal que fusiona ambos motores mediante procesamiento multihilo. - -## Requisitos Previos -1. **Python 3.8 - 3.11** instalado en el sistema. -2. **Reproductor MPV** instalado y agregado al PATH del sistema (requerido para el motor de audio sin bloqueos). - * *Windows:* Descargar de la página oficial o usar `scoop install mpv`. - * *Linux:* `sudo apt install mpv` - * *Mac:* `brew install mpv` - -## Guía de Instalación Rápida - -**1. Clonar el repositorio** -Abre tu terminal y clona este proyecto: -```bash -git clone -cd IdentificacionIA´´´ - -**2. Crear un Entorno Virtual (¡Importante!) -Para evitar conflictos de librerías, crea un entorno virtual limpio dentro de la carpeta del proyecto: - -python -m venv venv - - -3. Activar el Entorno Virtual - -En Windows: -.\venv\Scripts\activate - -En Mac/Linux: - -source venv/bin/activate -(Sabrás que está activo si ves un (venv) al inicio de tu línea de comandos). - -4. Instalar Dependencias -Con el entorno activado, instala todas las librerías necesarias: - -pip install -r requirements.txt - - -## Archivos y Carpetas Necesarias - -yolov8n.pt (Detector de personas) - -osnet_x0_25_msmt17.onnx (Extractor de características de ropa) - -face_detection_yunet_2023mar.onnx (Detector facial rápido) - -Además, debes tener la carpeta db_institucion con las fotografías de los rostros a reconocer. - - -## Ejecución -Para arrancar el sistema completo con interfaz gráfica y audio, ejecuta: - +# Sistema de Identificación y Seguimiento Inteligente + +Este repositorio contiene la arquitectura modular para el seguimiento de personas en múltiples cámaras (Re-ID) y reconocimiento facial asíncrono. + +## Arquitectura del Proyecto +El sistema está dividido en tres módulos principales para garantizar la separación de responsabilidades: +* `seguimiento2.py`: Motor matemático de Tracking (Kalman + YOLO) y Re-Identificación (OSNet). +* `reconocimiento2.py`: Motor de biometría facial (YuNet + ArcFace) y síntesis de audio (Edge-TTS). +* `main_fusion.py`: Orquestador principal que fusiona ambos motores mediante procesamiento multihilo. + +## Requisitos Previos +1. **Python 3.8 - 3.11** instalado en el sistema. +2. **Reproductor MPV** instalado y agregado al PATH del sistema (requerido para el motor de audio sin bloqueos). + * *Windows:* Descargar de la página oficial o usar `scoop install mpv`. + * *Linux:* `sudo apt install mpv` + * *Mac:* `brew install mpv` + +## Guía de Instalación Rápida + +**1. Clonar el repositorio** +Abre tu terminal y clona este proyecto: +```bash +git clone +cd IdentificacionIA´´´ + +**2. Crear un Entorno Virtual (¡Importante!) +Para evitar conflictos de librerías, crea un entorno virtual limpio dentro de la carpeta del proyecto: + +python -m venv venv + + +3. Activar el Entorno Virtual + +En Windows: +.\venv\Scripts\activate + +En Mac/Linux: + +source venv/bin/activate +(Sabrás que está activo si ves un (venv) al inicio de tu línea de comandos). + +4. Instalar Dependencias +Con el entorno activado, instala todas las librerías necesarias: + +pip install -r requirements.txt + + +## Archivos y Carpetas Necesarias + +yolov8n.pt (Detector de personas) + +osnet_x0_25_msmt17.onnx (Extractor de características de ropa) + +face_detection_yunet_2023mar.onnx (Detector facial rápido) + +Además, debes tener la carpeta db_institucion con las fotografías de los rostros a reconocer. + + +## Ejecución +Para arrancar el sistema completo con interfaz gráfica y audio, ejecuta: + python main_fusion.py \ No newline at end of file diff --git a/bus.jpg b/bus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40eaaf5c330d0c498fbe1dcacf9bb8bf566797fe GIT binary patch literal 137419 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 z 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 diff --git a/comandos.txt b/comandos.txt new file mode 100644 index 0000000..74153b6 --- /dev/null +++ b/comandos.txt @@ -0,0 +1,26 @@ +# Base estable +pip install numpy==1.26.4 + +# OpenCV compatible con numpy 1.x +pip install opencv-python==4.8.1.78 +pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118 +pip install ultralytics --no-deps +pip install opencv-python==4.8.1.78 matplotlib pyyaml scipy requests pillow + +pip install tensorflow==2.21 +pip install tf-keras +pip install deepface + +pip install onnxruntime +pip install edge-tts + +pip install numpy pandas + +sudo apt install libxcb-xinerama0 +sudo apt install fonts-dejavu +QT_DEBUG_PLUGINS=0 python fusion.py + + +pip cache purge +python -c "import torch; print(torch.cuda.is_available())" +python -c "import torch; print(torch.cuda.get_device_name(0))" \ No newline at end of file diff --git a/config/speaker_iot/settings.ini b/config/speaker_iot/settings.ini new file mode 100644 index 0000000..4196b2d --- /dev/null +++ b/config/speaker_iot/settings.ini @@ -0,0 +1,13 @@ +[ESP32] +ip = 192.168.15.128 +puerto = 81 + +[Audio] +duracion_ms = 2000 +tono_base = 440 +amplitud = 16000 + +[General] +timeout = 5 +reconectar = true + diff --git a/configurar_bocina.py b/configurar_bocina.py new file mode 100644 index 0000000..2c5842f --- /dev/null +++ b/configurar_bocina.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Script para configurar la bocina ESP32 +Permite cambiar IP, puerto, duración, etc. +""" + +import sys +import os + +# Agregar el proyecto al path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from core.speaker_iot import configurar_ip, mostrar_configuracion +from core.speaker_iot.config import config + +def main(): + print("\n" + "=" * 50) + print(" 🎵 CONFIGURACIÓN DE BOCINA IoT") + print("=" * 50) + + mostrar_configuracion() + + print("\n" + "-" * 50) + print("¿Qué deseas configurar?") + print(" 1. Cambiar IP") + print(" 2. Cambiar puerto") + print(" 3. Cambiar duración del audio") + print(" 4. Ver configuración actual") + print(" 5. Restaurar valores por defecto") + print(" 6. Salir") + + opcion = input("\n👉 Opción (1-6): ").strip() + + if opcion == "1": + nueva_ip = input("📡 Nueva IP: ").strip() + if nueva_ip: + config.actualizar_ip(nueva_ip) + print(f"✅ IP actualizada a: {nueva_ip}") + + elif opcion == "2": + nuevo_puerto = input("🔌 Nuevo puerto [81]: ").strip() + if nuevo_puerto: + config.config.set("ESP32", "puerto", nuevo_puerto) + with open(config.CONFIG_FILE, 'w') as f: + config.config.write(f) + print(f"✅ Puerto actualizado a: {nuevo_puerto}") + + elif opcion == "3": + nueva_duracion = input("⏱️ Nueva duración en ms [2000]: ").strip() + if nueva_duracion: + config.config.set("Audio", "duracion_ms", nueva_duracion) + with open(config.CONFIG_FILE, 'w') as f: + config.config.write(f) + print(f"✅ Duración actualizada a: {nueva_duracion}ms") + + elif opcion == "4": + mostrar_configuracion() + + elif opcion == "5": + confirmar = input("⚠️ ¿Restaurar configuración por defecto? (s/n): ").strip().lower() + if confirmar == 's': + config._crear_configuracion_default() + print("✅ Configuración restaurada") + mostrar_configuracion() + + elif opcion == "6": + print("\n👋 Hasta luego!") + return + + else: + print("❌ Opción inválida") + + print("\n✅ Configuración guardada!") + input("\nPresiona Enter para salir...") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/core/speaker_iot/__init__.py b/core/speaker_iot/__init__.py new file mode 100644 index 0000000..2fc1e11 --- /dev/null +++ b/core/speaker_iot/__init__.py @@ -0,0 +1,21 @@ +""" +Speaker IoT - Módulo para controlar bocina ESP32 +""" + +from .bocina_core import ( + BocinaCore, + saludar, + detener, + obtener_estado, + configurar_ip, + mostrar_configuracion +) + +__all__ = [ + 'BocinaCore', + 'saludar', + 'detener', + 'obtener_estado', + 'configurar_ip', + 'mostrar_configuracion' +] \ No newline at end of file diff --git a/core/speaker_iot/bocina_core.py b/core/speaker_iot/bocina_core.py new file mode 100644 index 0000000..a915dce --- /dev/null +++ b/core/speaker_iot/bocina_core.py @@ -0,0 +1,224 @@ +""" +BOCINA CORE - Módulo para controlar la bocina ESP32 +""" + +import asyncio +import websockets +import json +import struct +import math +from typing import Optional, Dict, Any + +from .config import config + +# ==================== CONSTANTES ==================== +CHUNK_SIZE = 1024 +SAMPLE_RATE = 16000 + + +# ==================== CLASE PRINCIPAL ==================== +class BocinaCore: + """Clase principal para controlar la bocina ESP32""" + + def __init__(self, ip: str = None, puerto: int = None): + """ + Inicializa el controlador de la bocina + + Args: + ip: IP del ESP32 (si es None, usa la del archivo de configuración) + puerto: Puerto WebSocket (si es None, usa el del archivo) + """ + self.ip = ip or config.obtener_ip() + self.puerto = puerto or config.obtener_puerto() + self.url = f"ws://{self.ip}:{self.puerto}" + self.duracion_ms = config.obtener_duracion() + self.tono_base = config.obtener_tono_base() + self.amplitud = config.obtener_amplitud() + self.timeout = config.obtener_timeout() + + self._websocket = None + self._conectado = False + + # ==================== MÉTODOS PÚBLICOS ==================== + + def saludar(self, nombre: str, duracion_ms: int = None, tono_personalizado: bool = True) -> bool: + """ + Envía un saludo a la bocina + + Args: + nombre: Nombre de la persona + duracion_ms: Duración del saludo (None = usa config) + tono_personalizado: Si True, varía el tono según el nombre + """ + duracion = duracion_ms or self.duracion_ms + return self._ejecutar_async(self._saludar_async(nombre, duracion, tono_personalizado)) + + def detener(self) -> bool: + """Detiene la reproducción actual""" + return self._ejecutar_async(self._detener_async()) + + def estado(self) -> Dict[str, Any]: + """Obtiene el estado actual de la bocina""" + return self._ejecutar_async(self._estado_async()) + + def ping(self) -> bool: + """Prueba la conexión con la bocina""" + return self._ejecutar_async(self._ping_async()) + + def conectar(self) -> bool: + """Establece conexión manual con la bocina""" + return self._ejecutar_async(self._conectar_async()) + + def desconectar(self) -> bool: + """Cierra la conexión con la bocina""" + return self._ejecutar_async(self._desconectar_async()) + + # ==================== MÉTODOS INTERNOS ==================== + + def _ejecutar_async(self, corutina): + """Ejecuta una función asíncrona desde código síncrono""" + try: + loop = asyncio.get_event_loop() + if loop.is_running(): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + resultado = loop.run_until_complete(corutina) + loop.close() + return resultado + else: + return loop.run_until_complete(corutina) + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + resultado = loop.run_until_complete(corutina) + loop.close() + return resultado + + async def _conectar_async(self) -> bool: + """Conexión asíncrona""" + try: + self._websocket = await websockets.connect(self.url, timeout=self.timeout) + await self._websocket.recv() + self._conectado = True + return True + except Exception: + self._conectado = False + return False + + async def _desconectar_async(self) -> bool: + """Desconexión asíncrona""" + if self._websocket: + await self._websocket.close() + self._websocket = None + self._conectado = False + return True + + async def _asegurar_conexion(self) -> bool: + """Asegura que haya una conexión activa""" + if not self._conectado or not self._websocket: + return await self._conectar_async() + return True + + async def _saludar_async(self, nombre: str, duracion_ms: int, tono_personalizado: bool) -> bool: + """Enviar saludo asíncrono""" + if not await self._asegurar_conexion(): + return False + + try: + audio = self._generar_audio(nombre, duracion_ms, tono_personalizado) + + for i in range(0, len(audio), CHUNK_SIZE): + chunk = audio[i:i + CHUNK_SIZE] + await self._websocket.send(chunk) + await asyncio.sleep(0.005) + + return True + except Exception: + return False + + async def _detener_async(self) -> bool: + """Detener reproducción asíncrono""" + if not await self._asegurar_conexion(): + return False + + try: + await self._websocket.send(json.dumps({"cmd": "STOP"})) + await asyncio.wait_for(self._websocket.recv(), timeout=self.timeout) + return True + except Exception: + return False + + async def _estado_async(self) -> Dict[str, Any]: + """Obtener estado asíncrono""" + if not await self._asegurar_conexion(): + return {} + + try: + await self._websocket.send(json.dumps({"cmd": "STATUS"})) + respuesta = await asyncio.wait_for(self._websocket.recv(), timeout=self.timeout) + return json.loads(respuesta) + except Exception: + return {} + + async def _ping_async(self) -> bool: + """Ping asíncrono""" + if not await self._asegurar_conexion(): + return False + + try: + await self._websocket.send(json.dumps({"cmd": "PING"})) + respuesta = await asyncio.wait_for(self._websocket.recv(), timeout=self.timeout) + data = json.loads(respuesta) + return data.get("status") == "ok" + except Exception: + return False + + def _generar_audio(self, nombre: str, duracion_ms: int, tono_personalizado: bool) -> bytes: + """Genera audio PCM para el saludo""" + num_muestras = int(SAMPLE_RATE * duracion_ms / 1000) + + if tono_personalizado: + frecuencia = self.tono_base + (len(nombre) * 10) + if frecuencia > 800: + frecuencia = 800 + else: + frecuencia = self.tono_base + + audio = bytearray() + for i in range(num_muestras): + valor = int(self.amplitud * math.sin(2 * math.pi * frecuencia * i / SAMPLE_RATE)) + audio.extend(struct.pack(' bool: + """Función rápida para saludar a una persona""" + bocina = BocinaCore(ip) + return bocina.saludar(nombre) + + +def detener(ip: str = None) -> bool: + """Detiene la reproducción""" + bocina = BocinaCore(ip) + return bocina.detener() + + +def obtener_estado(ip: str = None) -> dict: + """Obtiene el estado de la bocina""" + bocina = BocinaCore(ip) + return bocina.estado() + + +def configurar_ip(nueva_ip: str): + """Actualiza la IP en el archivo de configuración""" + from .config import config + config.actualizar_ip(nueva_ip) + + +def mostrar_configuracion(): + """Muestra la configuración actual""" + from .config import config + config.mostrar_configuracion() \ No newline at end of file diff --git a/core/speaker_iot/config.py b/core/speaker_iot/config.py new file mode 100644 index 0000000..569cee7 --- /dev/null +++ b/core/speaker_iot/config.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Módulo de configuración para la bocina ESP32 +""" + +import os +import configparser +from pathlib import Path + +# ==================== RUTAS ==================== +BASE_DIR = Path(__file__).resolve().parent.parent.parent +CONFIG_DIR = BASE_DIR / "config" / "speaker_iot" +CONFIG_FILE = CONFIG_DIR / "settings.ini" + +# ==================== CONFIGURACIÓN POR DEFECTO ==================== +DEFAULT_CONFIG = { + "ESP32": { + "ip": "192.168.15.128", + "puerto": "81" + }, + "Audio": { + "duracion_ms": "2000", + "tono_base": "440", + "amplitud": "16000" + }, + "General": { + "timeout": "5", + "reconectar": "true" + } +} + + +class ConfiguracionBocina: + """Gestor de configuración para la bocina""" + + def __init__(self): + self.config = configparser.ConfigParser() + self._cargar_configuracion() + + def _cargar_configuracion(self): + """Carga la configuración desde el archivo o crea uno por defecto""" + if CONFIG_FILE.exists(): + self.config.read(CONFIG_FILE, encoding='utf-8') + else: + self._crear_configuracion_default() + + def _crear_configuracion_default(self): + """Crea archivo de configuración por defecto""" + # Crear directorio si no existe + CONFIG_DIR.mkdir(parents=True, exist_ok=True) + + # Cargar valores por defecto + for seccion, valores in DEFAULT_CONFIG.items(): + self.config[seccion] = valores + + # Guardar archivo + with open(CONFIG_FILE, 'w', encoding='utf-8') as f: + self.config.write(f) + + print(f"📝 Configuración creada en: {CONFIG_FILE}") + + def obtener_ip(self) -> str: + """Obtiene la IP de la bocina""" + return self.config.get("ESP32", "ip", fallback="192.168.15.128") + + def obtener_puerto(self) -> int: + """Obtiene el puerto de la bocina""" + return self.config.getint("ESP32", "puerto", fallback=81) + + def obtener_duracion(self) -> int: + """Obtiene duración del audio en ms""" + return self.config.getint("Audio", "duracion_ms", fallback=2000) + + def obtener_tono_base(self) -> int: + """Obtiene frecuencia base del tono""" + return self.config.getint("Audio", "tono_base", fallback=440) + + def obtener_amplitud(self) -> int: + """Obtiene amplitud del audio""" + return self.config.getint("Audio", "amplitud", fallback=16000) + + def obtener_timeout(self) -> int: + """Obtiene timeout en segundos""" + return self.config.getint("General", "timeout", fallback=5) + + def reconectar_auto(self) -> bool: + """Obtiene si debe reconectar automáticamente""" + return self.config.getboolean("General", "reconectar", fallback=True) + + def actualizar_ip(self, nueva_ip: str): + """Actualiza la IP de la bocina""" + self.config.set("ESP32", "ip", nueva_ip) + with open(CONFIG_FILE, 'w', encoding='utf-8') as f: + self.config.write(f) + print(f"✅ IP actualizada a: {nueva_ip}") + + def mostrar_configuracion(self): + """Muestra la configuración actual""" + print("\n📡 Configuración actual:") + print(f" IP: {self.obtener_ip()}:{self.obtener_puerto()}") + print(f" Duración: {self.obtener_duracion()}ms") + print(f" Tono base: {self.obtener_tono_base()}Hz") + print(f" Timeout: {self.obtener_timeout()}s") + + +# Instancia global +config = ConfiguracionBocina() \ No newline at end of file diff --git a/core/speaker_iot/ejemplo.py b/core/speaker_iot/ejemplo.py new file mode 100644 index 0000000..258ae36 --- /dev/null +++ b/core/speaker_iot/ejemplo.py @@ -0,0 +1,60 @@ + +# Solo importas lo que necesitas +from core.speaker_iot import saludar, detener, obtener_estado + +# ===== EJEMPLO 1: Cuando detectas una persona ===== +def mi_detector(): + nombre = "Ana" # Tu IA obtiene el nombre + + # Enviar saludo (¡una sola línea!) + saludar(nombre) + + # También puedes verificar si funcionó + if saludar(nombre): + print(f"✅ Saludo enviado a {nombre}") + else: + print(f"❌ Error al enviar saludo a {nombre}") + +# ===== EJEMPLO 2: Dentro de tu loop principal ===== +while True: + persona = detectar_persona() # Tu función de detección + + if persona: + nombre = obtener_nombre(persona) # Tu base de datos + saludar(nombre) # Envía el saludo + +# ===== EJEMPLO 3: Clase completa ===== +class MiSistemaIA: + def __init__(self): + self.bocina_ip = "192.168.15.128" # O usa la del config + + def on_persona_detectada(self, persona): + nombre = self.obtener_nombre(persona) + if nombre: + print(f"🎉 Detectada: {nombre}") + saludar(nombre) # ¡Así de simple! + + def obtener_nombre(self, persona): + # Tu lógica para obtener nombre + return persona.get("nombre", "Visitante") + +# ===== Ejemplo completo de integración ===== + +class SistemaSeguridad: + def __init__(self): + self.personas_conocidas = ["Ana", "Carlos", "Maria"] + print("✅ Sistema iniciado - Bocina lista") + + def detectar(self, nombre): + if nombre in self.personas_conocidas: + print(f"🔔 ¡Bienvenido {nombre}!") + saludar(nombre) # Envía saludo + return True + else: + print(f"⚠️ Persona no registrada: {nombre}") + return False + +# Uso +sistema = SistemaSeguridad() +sistema.detectar("Ana") # Reproduce sonido +sistema.detectar("Luis") # No reproduce \ No newline at end of file diff --git a/cache_nombres/nombre_Jose Maria.mp3 b/core/speaker_iot/settings.ini similarity index 100% rename from cache_nombres/nombre_Jose Maria.mp3 rename to core/speaker_iot/settings.ini diff --git a/core/speaker_iot/test_esp32.py b/core/speaker_iot/test_esp32.py new file mode 100644 index 0000000..3f73b7b --- /dev/null +++ b/core/speaker_iot/test_esp32.py @@ -0,0 +1,409 @@ + +""" +BOCINA INTELIGENTE - CLIENTE PYTHON +==================================== +Cliente para enviar audio y comandos a la bocina ESP32 via WebSocket + +Uso: + python bocina_client.py + (Luego ingresa la IP y el nombre cuando se solicite) +""" + +import asyncio +import websockets +import json +import struct +import math +import sys +import time +import os +from typing import Optional + +# ==================== LIMPIAR PANTALLA ==================== +def limpiar_pantalla(): + """Limpia la consola según el sistema operativo""" + os.system('cls' if os.name == 'nt' else 'clear') + +# ==================== CLASE BOCINA ==================== +class BocinaInteligente: + """Cliente para controlar la bocina inteligente ESP32""" + + def __init__(self, ip: str, puerto: int = 81): + self.ip = ip + self.puerto = puerto + self.url = f"ws://{ip}:{puerto}" + self.websocket: Optional[websockets.WebSocketClientProtocol] = None + self.chunk_size = 1024 + self.timeout = 5 + self.conectado = False + + async def conectar(self) -> bool: + """Conectar al ESP32""" + try: + print(f"🔌 Conectando a {self.url}...") + self.websocket = await websockets.connect(self.url) + + # Esperar mensaje de bienvenida + response = await asyncio.wait_for(self.websocket.recv(), timeout=self.timeout) + data = json.loads(response) + + if data.get("status") == "ok": + print(f" ✅ {data.get('msg')}") + self.conectado = True + return True + + except Exception as e: + print(f" ❌ Error: {e}") + return False + + return False + + async def desconectar(self): + """Cerrar conexión""" + if self.websocket: + await self.websocket.close() + self.conectado = False + print("🔌 Conexión cerrada") + + async def ping(self) -> bool: + """Probar conexión con el ESP32""" + if not self.websocket: + return False + + try: + await self.websocket.send(json.dumps({"cmd": "PING"})) + response = await asyncio.wait_for(self.websocket.recv(), timeout=self.timeout) + data = json.loads(response) + return data.get("status") == "ok" + except: + return False + + async def obtener_estado(self) -> dict: + """Obtener estadísticas del ESP32""" + if not self.websocket: + return {} + + try: + await self.websocket.send(json.dumps({"cmd": "STATUS"})) + response = await asyncio.wait_for(self.websocket.recv(), timeout=self.timeout) + return json.loads(response) + except: + return {} + + async def detener(self) -> bool: + """Detener reproducción""" + if not self.websocket: + return False + + try: + await self.websocket.send(json.dumps({"cmd": "STOP"})) + response = await asyncio.wait_for(self.websocket.recv(), timeout=self.timeout) + data = json.loads(response) + return data.get("status") == "ok" + except: + return False + + async def enviar_audio(self, audio_data: bytes, nombre: str = "audio") -> bool: + """ + Enviar audio al ESP32 + + Args: + audio_data: Datos de audio en formato PCM (16kHz, 16bits, mono) + nombre: Nombre identificador (para logs) + """ + if not self.websocket: + print("❌ No hay conexión") + return False + + total_chunks = (len(audio_data) + self.chunk_size - 1) // self.chunk_size + print(f"📤 Enviando {total_chunks} chunks ({len(audio_data)} bytes) para '{nombre}'") + + inicio = time.time() + + for i, chunk_start in enumerate(range(0, len(audio_data), self.chunk_size)): + chunk = audio_data[chunk_start:chunk_start + self.chunk_size] + await self.websocket.send(chunk) + + # Mostrar progreso cada 10 chunks o al final + if (i + 1) % 10 == 0 or i == total_chunks - 1: + porcentaje = ((i + 1) * 100) // total_chunks + print(f" 📊 Progreso: {porcentaje}% ({i+1}/{total_chunks} chunks)") + + # Pequeña pausa para no saturar + await asyncio.sleep(0.005) + + elapsed = time.time() - inicio + print(f"✅ Audio enviado en {elapsed:.2f} segundos") + return True + + +# ==================== GENERADORES DE AUDIO ==================== +def generar_tono(frecuencia: int = 440, duracion_ms: int = 2000, + sample_rate: int = 16000, amplitud: int = 16000) -> bytes: + """ + Generar un tono seno en formato PCM + + Args: + frecuencia: Frecuencia del tono en Hz + duracion_ms: Duración en milisegundos + sample_rate: Frecuencia de muestreo + amplitud: Amplitud máxima (0-32767) + """ + num_muestras = int(sample_rate * duracion_ms / 1000) + audio = bytearray() + + for i in range(num_muestras): + valor = int(amplitud * math.sin(2 * math.pi * frecuencia * i / sample_rate)) + audio.extend(struct.pack(' bytes: + """Generar melodía de bienvenida (Do-Re-Mi-Fa-Sol)""" + sample_rate = 16000 + duracion_nota = 500 # ms por nota + notas = [261, 293, 329, 349, 392, 440] # Do, Re, Mi, Fa, Sol, La + audio = bytearray() + + for nota in notas: + nota_audio = generar_tono(nota, duracion_nota, sample_rate, amplitud=12000) + audio.extend(nota_audio) + + return bytes(audio) + + +def generar_saludo_personalizado(nombre: str) -> bytes: + """ + Generar un saludo personalizado (versión simple) + En un caso real, aquí usarías un servicio TTS + """ + # Usar frecuencia diferente según la longitud del nombre + frecuencia_base = 440 + frecuencia = frecuencia_base + (len(nombre) * 10) + # Limitar frecuencia máxima + if frecuencia > 800: + frecuencia = 800 + return generar_tono(frecuencia, duracion_ms=2000) + + +# ==================== MENÚ PRINCIPAL ==================== +def mostrar_menu(): + """Muestra el menú principal""" + print("\n" + "=" * 50) + print(" 🎵 BOCINA INTELIGENTE - CONTROL") + print("=" * 50) + print("\n📋 Opciones disponibles:") + print(" 1. 🔊 Enviar tono de prueba (440Hz)") + print(" 2. 🎵 Enviar melodía de bienvenida") + print(" 3. 💬 Enviar saludo personalizado") + print(" 4. 📊 Ver estado del ESP32") + print(" 5. 🏓 Probar ping") + print(" 6. 🔇 Detener reproducción") + print(" 7. 🔄 Reconectar") + print(" 8. 🚪 Salir") + print("-" * 50) + + +# ==================== MODO INTERACTIVO ==================== +async def modo_interactivo(): + """Modo interactivo con entrada de IP y nombre""" + + # Limpiar pantalla + limpiar_pantalla() + + print("\n" + "=" * 50) + print(" 🎵 BOCINA INTELIGENTE") + print("=" * 50) + + # Solicitar IP + print("\n📡 Configuración de conexión:") + ip_default = "192.168.15.128" + ip = input(f" IP del ESP32 [{ip_default}]: ").strip() + if not ip: + ip = ip_default + + # Solicitar nombre por defecto para saludos + nombre_default = "Visitante" + nombre = input(f" Nombre por defecto [{nombre_default}]: ").strip() + if not nombre: + nombre = nombre_default + + # Crear instancia + bocina = BocinaInteligente(ip) + + # Conectar + print("\n🔄 Conectando...") + if not await bocina.conectar(): + print("\n❌ No se pudo conectar al ESP32") + print(" Verifica que:") + print(f" 1. La IP {ip} sea correcta") + print(" 2. El ESP32 esté encendido") + print(" 3. Estés en la misma red WiFi") + input("\n Presiona Enter para salir...") + return + + print("\n✅ ¡Conectado exitosamente!") + print(f" 📡 IP: {ip}") + print(f" 👤 Nombre: {nombre}") + + # Bucle principal + while True: + mostrar_menu() + + opcion = input("\n👉 Selecciona una opción (1-8): ").strip() + + if opcion == "1": + print("\n🔊 Enviando tono de prueba (440Hz)...") + audio = generar_tono(440, 2000) + await bocina.enviar_audio(audio, "Tono 440Hz") + + elif opcion == "2": + print("\n🎵 Enviando melodía de bienvenida...") + audio = generar_melodia_bienvenida() + await bocina.enviar_audio(audio, "Melodía") + + elif opcion == "3": + # Pedir nombre específico para este saludo + nombre_saludo = input(f" 👤 Nombre (Enter para usar '{nombre}'): ").strip() + if not nombre_saludo: + nombre_saludo = nombre + + print(f"\n🔊 Generando saludo para '{nombre_saludo}'...") + audio = generar_saludo_personalizado(nombre_saludo) + await bocina.enviar_audio(audio, nombre_saludo) + + elif opcion == "4": + print("\n📊 Obteniendo estado del ESP32...") + estado = await bocina.obtener_estado() + if estado: + print("\n 📡 Estado del sistema:") + print(f" Status: {estado.get('status', 'desconocido')}") + print(f" 📦 Bytes recibidos: {estado.get('bytes_recibidos', 0)}") + print(f" 🔢 Chunks recibidos: {estado.get('chunks_recibidos', 0)}") + print(f" 🎵 Audio activo: {'✅ Sí' if estado.get('audio_activo') else '❌ No'}") + print(f" 📶 WiFi RSSI: {estado.get('wifi_rssi', 0)} dBm") + else: + print(" ❌ No se pudo obtener estado") + + elif opcion == "5": + print("\n🏓 Probando ping...") + inicio = time.time() + if await bocina.ping(): + latencia = (time.time() - inicio) * 1000 + print(f" ✅ PONG recibido (latencia: {latencia:.0f}ms)") + else: + print(" ❌ Sin respuesta - verifica la conexión") + + elif opcion == "6": + print("\n🔇 Deteniendo reproducción...") + if await bocina.detener(): + print(" ✅ Reproducción detenida") + else: + print(" ⚠️ No se pudo detener o ya estaba detenido") + + elif opcion == "7": + print("\n🔄 Reconectando...") + await bocina.desconectar() + await asyncio.sleep(1) + if await bocina.conectar(): + print(" ✅ Reconectado exitosamente") + else: + print(" ❌ Error al reconectar") + + elif opcion == "8": + print("\n👋 Saliendo...") + break + + else: + print("❌ Opción inválida") + + # Pequeña pausa antes de volver al menú + await asyncio.sleep(0.5) + + # Cerrar conexión + await bocina.desconectar() + print("\n✅ Programa finalizado") + + +# ==================== MODO RÁPIDO ==================== +async def modo_rapido(): + """Modo rápido: pide IP y nombre y envía saludo inmediato""" + + limpiar_pantalla() + + print("\n" + "=" * 50) + print(" 🎵 BOCINA INTELIGENTE - MODO RÁPIDO") + print("=" * 50) + + # Solicitar IP + print("\n📡 Configuración:") + ip_default = "192.168.15.128" + ip = input(f" IP del ESP32 [{ip_default}]: ").strip() + if not ip: + ip = ip_default + + # Solicitar nombre + nombre = input(" 👤 Nombre de la persona: ").strip() + if not nombre: + nombre = "Visitante" + + # Conectar y enviar + bocina = BocinaInteligente(ip) + + print("\n🔄 Conectando...") + if not await bocina.conectar(): + print("❌ No se pudo conectar") + input("\nPresiona Enter para salir...") + return + + print(f"\n🔊 Enviando saludo para '{nombre}'...") + audio = generar_saludo_personalizado(nombre) + await bocina.enviar_audio(audio, nombre) + + # Mostrar estado + await asyncio.sleep(1) + estado = await bocina.obtener_estado() + if estado: + print(f"\n📊 Enviados: {estado.get('bytes_recibidos', 0)} bytes") + + await bocina.desconectar() + + print("\n✅ Saludo enviado!") + input("\nPresiona Enter para salir...") + + +# ==================== MAIN ==================== +async def main(): + """Función principal""" + + limpiar_pantalla() + + print("\n" + "=" * 50) + print(" 🎵 BOCINA INTELIGENTE v1.0") + print("=" * 50) + + print("\nSelecciona modo de operación:") + print(" 1. 🎮 Modo interactivo (menú completo)") + print(" 2. ⚡ Modo rápido (solo enviar saludo)") + print(" 3. 🚪 Salir") + + modo = input("\n👉 Opción (1-3): ").strip() + + if modo == "1": + await modo_interactivo() + elif modo == "2": + await modo_rapido() + else: + print("\n👋 Hasta luego!") + return + + +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + print("\n\n👋 Programa interrumpido") + except Exception as e: + print(f"\n❌ Error: {e}") + input("\nPresiona Enter para salir...") \ No newline at end of file diff --git a/db_institucion/Diana Laura.jpg b/db_institucion/Diana Laura.jpg deleted file mode 100644 index 479b9fde94b33be0c51e9a429a7d38ac43c16bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4810 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 diff --git a/db_institucion/Ian Axel.jpg b/db_institucion/Ian Axel.jpg deleted file mode 100644 index e672d388fb0ac6064fafdbb0687864932709cf5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3120 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 E15Pcg?f?J) diff --git a/fusion.py b/fusion.py index 9878f7c..cd038d8 100644 --- a/fusion.py +++ b/fusion.py @@ -10,6 +10,9 @@ from queue import Queue from deepface import DeepFace from ultralytics import YOLO import warnings +import torch +device = "cuda" if torch.cuda.is_available() else "cpu" +print(f"Usando dispositivo: {device}") warnings.filterwarnings("ignore") @@ -295,7 +298,7 @@ def dibujar_track_fusion(frame_show, trk, global_mem): def main(): print("\nIniciando Sistema") - model = YOLO("yolov8n.pt") + model = YOLO("yolov8n.pt").to("cuda") global_mem = GlobalMemory() managers = {str(c): CamManager(c, global_mem) for c in SECUENCIA} cams = [CamStream(u) for u in URLS] @@ -303,7 +306,7 @@ def main(): for _ in range(2): threading.Thread(target=worker_rostros, args=(global_mem,), daemon=True).start() - cv2.namedWindow("SmartSoft", cv2.WINDOW_AUTOSIZE) + cv2.namedWindow("SmartSoft", cv2.WINDOW_NORMAL) idx = 0 while True: diff --git a/generar_db_rostros.py b/generar_db_rostros.py index b0412a5..6429e5a 100644 --- a/generar_db_rostros.py +++ b/generar_db_rostros.py @@ -1,110 +1,110 @@ -import cv2 -import os -import json -import numpy as np - -# ⚡ Importamos tus motores exactos para no romper la simetría -from reconocimiento2 import detectar_rostros_yunet, gestionar_vectores - -def registrar_desde_webcam(): - print("\n" + "="*50) - print("📸 MÓDULO DE REGISTRO LIMPIO (WEBCAM LOCAL)") - print("Alinea tu rostro, mira a la cámara con buena luz.") - print("Presiona [R] para capturar | [Q] para salir") - print("="*50 + "\n") - - DB_PATH = "db_institucion" - CACHE_PATH = "cache_nombres" - os.makedirs(DB_PATH, exist_ok=True) - os.makedirs(CACHE_PATH, exist_ok=True) - - # 0 es la cámara por defecto de tu laptop - cap = cv2.VideoCapture(0) - if not cap.isOpened(): - print("[!] Error: No se pudo abrir la webcam local.") - return - - while True: - ret, frame = cap.read() - if not ret: continue - - # Espejamos la imagen para que actúe como un espejo natural - frame = cv2.flip(frame, 1) - display_frame = frame.copy() - - # Usamos YuNet para garantizar que estamos capturando una cara válida - faces = detectar_rostros_yunet(frame) - mejor_rostro = None - max_area = 0 - - for (fx, fy, fw, fh, score) in faces: - area = fw * fh - cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 2) - - if area > max_area: - max_area = area - h_frame, w_frame = frame.shape[:2] - - # Mismo margen del 30% que requiere MTCNN para alinear correctamente - m_x, m_y = int(fw * 0.30), int(fh * 0.30) - y1 = max(0, fy - m_y) - y2 = min(h_frame, fy + fh + m_y) - x1 = max(0, fx - m_x) - x2 = min(w_frame, fx + fw + m_x) - - mejor_rostro = frame[y1:y2, x1:x2] - - cv2.putText(display_frame, "Alineate y presiona [R]", (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2) - cv2.imshow("Registro Webcam Local", display_frame) - - key = cv2.waitKey(1) & 0xFF - if key == ord('q'): - break - elif key == ord('r'): - if mejor_rostro is not None and mejor_rostro.size > 0: - cv2.imshow("Captura Congelada", mejor_rostro) - cv2.waitKey(1) - - print("\n--- NUEVO REGISTRO ---") - nom = input("Escribe el nombre exacto de la persona: ").strip() - - if nom: - gen_input = input("¿Es Hombre (h) o Mujer (m)?: ").strip().lower() - genero_guardado = "Woman" if gen_input == 'm' else "Man" - - # 1. Guardamos la foto pura - foto_path = os.path.join(DB_PATH, f"{nom}.jpg") - cv2.imwrite(foto_path, mejor_rostro) - - # 2. Actualizamos el caché de géneros sin usar IA - ruta_generos = os.path.join(CACHE_PATH, "generos.json") - dic_generos = {} - if os.path.exists(ruta_generos): - try: - with open(ruta_generos, 'r') as f: - dic_generos = json.load(f) - except Exception: pass - - dic_generos[nom] = genero_guardado - with open(ruta_generos, 'w') as f: - json.dump(dic_generos, f) - - print(f"\n[OK] Foto guardada. Generando punto de gravedad matemático...") - - # 3. Forzamos la creación del vector en la base de datos - gestionar_vectores(actualizar=True) - print(" Registro inyectado exitosamente en el sistema principal.") - - else: - print("[!] Registro cancelado por nombre vacío.") - - cv2.destroyWindow("Captura Congelada") - else: - print("[!] No se detectó ningún rostro claro. Acércate más a la luz.") - - cap.release() - cv2.destroyAllWindows() - -if __name__ == "__main__": +import cv2 +import os +import json +import numpy as np + +# ⚡ Importamos tus motores exactos para no romper la simetría +from reconocimiento2 import detectar_rostros_yunet, gestionar_vectores + +def registrar_desde_webcam(): + print("\n" + "="*50) + print("📸 MÓDULO DE REGISTRO LIMPIO (WEBCAM LOCAL)") + print("Alinea tu rostro, mira a la cámara con buena luz.") + print("Presiona [R] para capturar | [Q] para salir") + print("="*50 + "\n") + + DB_PATH = "db_institucion" + CACHE_PATH = "cache_nombres" + os.makedirs(DB_PATH, exist_ok=True) + os.makedirs(CACHE_PATH, exist_ok=True) + + # 0 es la cámara por defecto de tu laptop + cap = cv2.VideoCapture(0) + if not cap.isOpened(): + print("[!] Error: No se pudo abrir la webcam local.") + return + + while True: + ret, frame = cap.read() + if not ret: continue + + # Espejamos la imagen para que actúe como un espejo natural + frame = cv2.flip(frame, 1) + display_frame = frame.copy() + + # Usamos YuNet para garantizar que estamos capturando una cara válida + faces = detectar_rostros_yunet(frame) + mejor_rostro = None + max_area = 0 + + for (fx, fy, fw, fh, score) in faces: + area = fw * fh + cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 2) + + if area > max_area: + max_area = area + h_frame, w_frame = frame.shape[:2] + + # Mismo margen del 30% que requiere MTCNN para alinear correctamente + m_x, m_y = int(fw * 0.30), int(fh * 0.30) + y1 = max(0, fy - m_y) + y2 = min(h_frame, fy + fh + m_y) + x1 = max(0, fx - m_x) + x2 = min(w_frame, fx + fw + m_x) + + mejor_rostro = frame[y1:y2, x1:x2] + + cv2.putText(display_frame, "Alineate y presiona [R]", (10, 30), + cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2) + cv2.imshow("Registro Webcam Local", display_frame) + + key = cv2.waitKey(1) & 0xFF + if key == ord('q'): + break + elif key == ord('r'): + if mejor_rostro is not None and mejor_rostro.size > 0: + cv2.imshow("Captura Congelada", mejor_rostro) + cv2.waitKey(1) + + print("\n--- NUEVO REGISTRO ---") + nom = input("Escribe el nombre exacto de la persona: ").strip() + + if nom: + gen_input = input("¿Es Hombre (h) o Mujer (m)?: ").strip().lower() + genero_guardado = "Woman" if gen_input == 'm' else "Man" + + # 1. Guardamos la foto pura + foto_path = os.path.join(DB_PATH, f"{nom}.jpg") + cv2.imwrite(foto_path, mejor_rostro) + + # 2. Actualizamos el caché de géneros sin usar IA + ruta_generos = os.path.join(CACHE_PATH, "generos.json") + dic_generos = {} + if os.path.exists(ruta_generos): + try: + with open(ruta_generos, 'r') as f: + dic_generos = json.load(f) + except Exception: pass + + dic_generos[nom] = genero_guardado + with open(ruta_generos, 'w') as f: + json.dump(dic_generos, f) + + print(f"\n[OK] Foto guardada. Generando punto de gravedad matemático...") + + # 3. Forzamos la creación del vector en la base de datos + gestionar_vectores(actualizar=True) + print(" Registro inyectado exitosamente en el sistema principal.") + + else: + print("[!] Registro cancelado por nombre vacío.") + + cv2.destroyWindow("Captura Congelada") + else: + print("[!] No se detectó ningún rostro claro. Acércate más a la luz.") + + cap.release() + cv2.destroyAllWindows() + +if __name__ == "__main__": registrar_desde_webcam() \ No newline at end of file diff --git a/prueba_video.py b/prueba_video.py index d72ea2f..c9ec0c9 100644 --- a/prueba_video.py +++ b/prueba_video.py @@ -1,43 +1,43 @@ -import cv2 -import time -from ultralytics import YOLO -from seguimiento2 import GlobalMemory, CamManager, dibujar_track - -def test_video(video_path): - print(f"Iniciando Benchmark de Video: {video_path}") - model = YOLO("yolov8n.pt") - global_mem = GlobalMemory() - manager = CamManager("TEST_CAM", global_mem) - - cap = cv2.VideoCapture(video_path) - cv2.namedWindow("Benchmark TT", cv2.WINDOW_AUTOSIZE) - - while cap.isOpened(): - ret, frame = cap.read() - if not ret: break - - now = time.time() - frame_show = cv2.resize(frame, (480, 270)) - - # Inferencia frame por frame sin hilos (sincrónico) - res = model.predict(frame_show, conf=0.40, iou=0.50, classes=[0], verbose=False, imgsz=480, device='cpu') - boxes = res[0].boxes.xyxy.cpu().numpy().tolist() if res[0].boxes else [] - - tracks = manager.update(boxes, frame_show, now, turno_activo=True) - - for trk in tracks: - if trk.time_since_update == 0: - dibujar_track(frame_show, trk) - - cv2.imshow("Benchmark TT", frame_show) - - # Si presionas espacio se pausa, con 'q' sales - key = cv2.waitKey(30) & 0xFF - if key == ord('q'): break - elif key == ord(' '): cv2.waitKey(-1) - - cap.release() - cv2.destroyAllWindows() - -if __name__ == "__main__": +import cv2 +import time +from ultralytics import YOLO +from seguimiento2 import GlobalMemory, CamManager, dibujar_track + +def test_video(video_path): + print(f"Iniciando Benchmark de Video: {video_path}") + model = YOLO("yolov8n.pt") + global_mem = GlobalMemory() + manager = CamManager("TEST_CAM", global_mem) + + cap = cv2.VideoCapture(video_path) + cv2.namedWindow("Benchmark TT", cv2.WINDOW_AUTOSIZE) + + while cap.isOpened(): + ret, frame = cap.read() + if not ret: break + + now = time.time() + frame_show = cv2.resize(frame, (480, 270)) + + # Inferencia frame por frame sin hilos (sincrónico) + res = model.predict(frame_show, conf=0.40, iou=0.50, classes=[0], verbose=False, imgsz=480, device='cpu') + boxes = res[0].boxes.xyxy.cpu().numpy().tolist() if res[0].boxes else [] + + tracks = manager.update(boxes, frame_show, now, turno_activo=True) + + for trk in tracks: + if trk.time_since_update == 0: + dibujar_track(frame_show, trk) + + cv2.imshow("Benchmark TT", frame_show) + + # Si presionas espacio se pausa, con 'q' sales + key = cv2.waitKey(30) & 0xFF + if key == ord('q'): break + elif key == ord(' '): cv2.waitKey(-1) + + cap.release() + cv2.destroyAllWindows() + +if __name__ == "__main__": test_video("video.mp4") # Pon aquí el nombre de tu video \ No newline at end of file diff --git a/reconocimiento2.py b/reconocimiento2.py index b17378c..6295792 100644 --- a/reconocimiento2.py +++ b/reconocimiento2.py @@ -1,465 +1,473 @@ -import os -os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' -os.environ['CUDA_VISIBLE_DEVICES'] = '-1' - -import cv2 -import numpy as np -from deepface import DeepFace -import pickle -import time -import threading -import asyncio -import edge_tts -import subprocess -from datetime import datetime -import warnings -import urllib.request - -warnings.filterwarnings("ignore") - -# ────────────────────────────────────────────────────────────────────────────── -# CONFIGURACIÓN -# ────────────────────────────────────────────────────────────────────────────── -DB_PATH = "db_institucion" -CACHE_PATH = "cache_nombres" -VECTORS_FILE = "base_datos_rostros.pkl" -TIMESTAMPS_FILE = "representaciones_timestamps.pkl" -UMBRAL_SIM = 0.42 # Por encima → identificado. Por debajo → desconocido. -COOLDOWN_TIME = 15 # Segundos entre saludos - -USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.244" -RTSP_URL = f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/702" - -for path in [DB_PATH, CACHE_PATH]: - os.makedirs(path, exist_ok=True) - -# ────────────────────────────────────────────────────────────────────────────── -# YUNET — Detector facial rápido en CPU -# ────────────────────────────────────────────────────────────────────────────── -YUNET_MODEL_PATH = "face_detection_yunet_2023mar.onnx" - -if not os.path.exists(YUNET_MODEL_PATH): - print(f"Descargando YuNet ({YUNET_MODEL_PATH})...") - url = ("https://github.com/opencv/opencv_zoo/raw/main/models/" - "face_detection_yunet/face_detection_yunet_2023mar.onnx") - urllib.request.urlretrieve(url, YUNET_MODEL_PATH) - print("YuNet descargado.") - -# Detector estricto para ROIs grandes (persona cerca) -detector_yunet = cv2.FaceDetectorYN.create( - model=YUNET_MODEL_PATH, config="", - input_size=(320, 320), - score_threshold=0.70, - nms_threshold=0.3, - top_k=5000 -) - -# Detector permisivo para ROIs pequeños (persona lejos) -detector_yunet_lejano = cv2.FaceDetectorYN.create( - model=YUNET_MODEL_PATH, config="", - input_size=(320, 320), - score_threshold=0.45, - nms_threshold=0.3, - top_k=5000 -) - -def detectar_rostros_yunet(roi, lock=None): - """ - Elige automáticamente el detector según el tamaño del ROI. - """ - h_roi, w_roi = roi.shape[:2] - area = w_roi * h_roi - det = detector_yunet if area > 8000 else detector_yunet_lejano - - try: - if lock: - with lock: - det.setInputSize((w_roi, h_roi)) - _, faces = det.detect(roi) - else: - det.setInputSize((w_roi, h_roi)) - _, faces = det.detect(roi) - except Exception: - return [] - - if faces is None: - return [] - - resultado = [] - for face in faces: - try: - fx, fy, fw, fh = map(int, face[:4]) - score = float(face[14]) if len(face) > 14 else 1.0 - resultado.append((fx, fy, fw, fh, score)) - except (ValueError, OverflowError, TypeError): - continue - return resultado - - -# ────────────────────────────────────────────────────────────────────────────── -# SISTEMA DE AUDIO -# ────────────────────────────────────────────────────────────────────────────── -def obtener_audios_humanos(genero): - hora = datetime.now().hour - es_mujer = genero.lower() == 'woman' - suffix = "_m.mp3" if es_mujer else "_h.mp3" - if 5 <= hora < 12: - intro = "dias.mp3" - elif 12 <= hora < 19: - intro = "tarde.mp3" - else: - intro = "noches.mp3" - cierre = ("fin_noche" if (hora >= 19 or hora < 5) else "fin_dia") + suffix - return intro, cierre - - -async def sintetizar_nombre(nombre, ruta): - nombre_limpio = nombre.replace('_', ' ') - try: - comunicador = edge_tts.Communicate(nombre_limpio, "es-MX-DaliaNeural", rate="+10%") - await comunicador.save(ruta) - except Exception: - pass - - -def reproducir(archivo): - if os.path.exists(archivo): - subprocess.Popen( - ["mpv", "--no-video", "--volume=100", archivo], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - - -def hilo_bienvenida(nombre, genero): - archivo_nombre = os.path.join(CACHE_PATH, f"nombre_{nombre}.mp3") - - if not os.path.exists(archivo_nombre): - try: - asyncio.run(sintetizar_nombre(nombre, archivo_nombre)) - except Exception: - pass - - intro, cierre = obtener_audios_humanos(genero) - - archivos = [f for f in [intro, archivo_nombre, cierre] if os.path.exists(f)] - if archivos: - subprocess.Popen( - ["mpv", "--no-video", "--volume=100"] + archivos, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - - -# ────────────────────────────────────────────────────────────────────────────── -# GESTIÓN DE BASE DE DATOS (AHORA CON RETINAFACE Y ALINEACIÓN) -# ────────────────────────────────────────────────────────────────────────────── -def gestionar_vectores(actualizar=False): - import json # ⚡ Asegúrate de tener importado json - - vectores_actuales = {} - if os.path.exists(VECTORS_FILE): - try: - with open(VECTORS_FILE, 'rb') as f: - vectores_actuales = pickle.load(f) - except Exception: - vectores_actuales = {} - - if not actualizar: - return vectores_actuales - - timestamps = {} - if os.path.exists(TIMESTAMPS_FILE): - try: - with open(TIMESTAMPS_FILE, 'rb') as f: - timestamps = pickle.load(f) - except Exception: - timestamps = {} - - # ────────────────────────────────────────────────────────── - # CARGA DEL CACHÉ DE GÉNEROS - # ────────────────────────────────────────────────────────── - ruta_generos = os.path.join(CACHE_PATH, "generos.json") - dic_generos = {} - if os.path.exists(ruta_generos): - try: - with open(ruta_generos, 'r') as f: - dic_generos = json.load(f) - except Exception: - pass - - print("\nACTUALIZANDO BASE DE DATOS (Alineación y Caché de Géneros)...") - imagenes = [f for f in os.listdir(DB_PATH) if f.lower().endswith(('.jpg', '.png'))] - nombres_en_disco = set() - hubo_cambios = False - cambio_generos = False # Bandera para saber si actualizamos el JSON - - for archivo in imagenes: - nombre_archivo = os.path.splitext(archivo)[0] - ruta_img = os.path.join(DB_PATH, archivo) - nombres_en_disco.add(nombre_archivo) - - ts_actual = os.path.getmtime(ruta_img) - ts_guardado = timestamps.get(nombre_archivo, 0) - - # Si ya tenemos el vector pero NO tenemos su género en el JSON, forzamos el procesamiento - falta_genero = nombre_archivo not in dic_generos - - if nombre_archivo in vectores_actuales and ts_actual == ts_guardado and not falta_genero: - continue - - try: - img_db = cv2.imread(ruta_img) - lab = cv2.cvtColor(img_db, cv2.COLOR_BGR2LAB) - l, a, b = cv2.split(lab) - clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) - l = clahe.apply(l) - img_mejorada = cv2.cvtColor(cv2.merge((l, a, b)), cv2.COLOR_LAB2BGR) - - # IA DE GÉNERO (Solo se ejecuta 1 vez por persona en toda la vida del sistema) - if falta_genero: - try: - analisis = DeepFace.analyze(img_mejorada, actions=['gender'], enforce_detection=False)[0] - dic_generos[nombre_archivo] = analisis.get('dominant_gender', 'Man') - except Exception: - dic_generos[nombre_archivo] = "Man" # Respaldo - cambio_generos = True - - # Extraemos el vector - res = DeepFace.represent( - img_path=img_mejorada, - model_name="ArcFace", - detector_backend="mtcnn", - align=True, - enforce_detection=True - ) - emb = np.array(res[0]["embedding"], dtype=np.float32) - - norma = np.linalg.norm(emb) - if norma > 0: - emb = emb / norma - - vectores_actuales[nombre_archivo] = emb - timestamps[nombre_archivo] = ts_actual - hubo_cambios = True - print(f" Procesado y alineado: {nombre_archivo} | Género: {dic_generos.get(nombre_archivo)}") - - except Exception as e: - print(f" Rostro no válido en '{archivo}', omitido. Error: {e}") - - # Limpieza de eliminados - for nombre in list(vectores_actuales.keys()): - if nombre not in nombres_en_disco: - del vectores_actuales[nombre] - timestamps.pop(nombre, None) - if nombre in dic_generos: - del dic_generos[nombre] - cambio_generos = True - hubo_cambios = True - print(f" Eliminado (sin foto): {nombre}") - - # Guardado de la memoria - if hubo_cambios: - with open(VECTORS_FILE, 'wb') as f: - pickle.dump(vectores_actuales, f) - with open(TIMESTAMPS_FILE, 'wb') as f: - pickle.dump(timestamps, f) - - # Guardado del JSON de géneros si hubo descubrimientos nuevos - if cambio_generos: - with open(ruta_generos, 'w') as f: - json.dump(dic_generos, f) - - if hubo_cambios or cambio_generos: - print(" Sincronización terminada.\n") - else: - print(" Sin cambios. Base de datos al día.\n") - - return vectores_actuales - -# ────────────────────────────────────────────────────────────────────────────── -# BÚSQUEDA BLINDADA (Similitud Coseno estricta) -# ────────────────────────────────────────────────────────────────────────────── -def buscar_mejor_match(emb_consulta, base_datos): - # ⚡ MAGIA 3: Normalización L2 del vector entrante - norma = np.linalg.norm(emb_consulta) - if norma > 0: - emb_consulta = emb_consulta / norma - - mejor_match, max_sim = None, -1.0 - for nombre, vec in base_datos.items(): - # Como ambos están normalizados, esto es Similitud Coseno pura (-1.0 a 1.0) - sim = float(np.dot(emb_consulta, vec)) - if sim > max_sim: - max_sim = sim - mejor_match = nombre - - return mejor_match, max_sim - -# ────────────────────────────────────────────────────────────────────────────── -# LOOP DE PRUEBA Y REGISTRO (CON SIMETRÍA ESTRICTA) -# ────────────────────────────────────────────────────────────────────────────── -def sistema_interactivo(): - base_datos = gestionar_vectores(actualizar=False) - cap = cv2.VideoCapture(RTSP_URL) - ultimo_saludo = 0 - persona_actual = None - confirmaciones = 0 - - print("\n" + "=" * 50) - print(" MÓDULO DE REGISTRO Y DEPURACIÓN ESTRICTO") - print(" [R] Registrar nuevo rostro | [Q] Salir") - print("=" * 50 + "\n") - - faces_ultimo_frame = [] - - while True: - ret, frame = cap.read() - if not ret: - time.sleep(2) - cap.open(RTSP_URL) - continue - - h, w = frame.shape[:2] - display_frame = frame.copy() - tiempo_actual = time.time() - - faces_raw = detectar_rostros_yunet(frame) - faces_ultimo_frame = faces_raw - - for (fx, fy, fw, fh, score_yunet) in faces_raw: - fx = max(0, fx); fy = max(0, fy) - fw = min(w - fx, fw); fh = min(h - fy, fh) - if fw <= 0 or fh <= 0: - continue - - cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (255, 200, 0), 2) - cv2.putText(display_frame, f"YN:{score_yunet:.2f}", - (fx, fy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 200, 0), 1) - - if (tiempo_actual - ultimo_saludo) <= COOLDOWN_TIME: - continue - - m = int(fw * 0.15) - roi = frame[max(0, fy-m): min(h, fy+fh+m), - max(0, fx-m): min(w, fx+fw+m)] - - # 🛡️ FILTRO DE TAMAÑO FÍSICO - if roi.size == 0 or roi.shape[0] < 40 or roi.shape[1] < 40: - cv2.putText(display_frame, "muy pequeno", - (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 100, 255), 1) - continue - - # 🛡️ FILTRO DE NITIDEZ - gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) - nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() - if nitidez < 50.0: - cv2.putText(display_frame, f"blur({nitidez:.0f})", - (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 165, 255), 1) - continue - - # 🌙 SIMETRÍA 1: VISIÓN NOCTURNA (CLAHE) AL VIDEO EN VIVO - try: - lab = cv2.cvtColor(roi, cv2.COLOR_BGR2LAB) - l, a, b = cv2.split(lab) - clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) - l = clahe.apply(l) - roi_mejorado = cv2.cvtColor(cv2.merge((l, a, b)), cv2.COLOR_LAB2BGR) - except Exception: - roi_mejorado = roi # Respaldo de seguridad - - # 🧠 SIMETRÍA 2: MOTOR MTCNN Y ALINEACIÓN (Igual que la Base de Datos) - try: - res = DeepFace.represent( - img_path=roi_mejorado, - model_name="ArcFace", - detector_backend="mtcnn", # El mismo que en gestionar_vectores - align=True, # Enderezamos la cara - enforce_detection=True # Si MTCNN no ve cara clara, aborta - ) - emb = np.array(res[0]["embedding"], dtype=np.float32) - mejor_match, max_sim = buscar_mejor_match(emb, base_datos) - - except Exception: - # MTCNN abortó porque la cara estaba de perfil, tapada o no era una cara - cv2.putText(display_frame, "MTCNN Ignorado", - (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) - continue - - estado = " IDENTIFICADO" if max_sim > UMBRAL_SIM else "DESCONOCIDO" - nombre_d = mejor_match.split('_')[0] if mejor_match else "nadie" - n_bloques = int(max_sim * 20) - barra = "█" * n_bloques + "░" * (20 - n_bloques) - print(f"[REGISTRO] {estado} | {nombre_d:<14} | {barra} | " - f"{max_sim*100:.1f}% (umbral: {UMBRAL_SIM*100:.0f}%)") - - if max_sim > UMBRAL_SIM and mejor_match: - color = (0, 255, 0) - texto = f"{mejor_match.split('_')[0]} ({max_sim:.2f})" - - if mejor_match == persona_actual: - confirmaciones += 1 - else: - persona_actual, confirmaciones = mejor_match, 1 - - if confirmaciones >= 1: - cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 3) - try: - analisis = DeepFace.analyze( - roi_mejorado, actions=['gender'], enforce_detection=False - )[0] - genero = analisis['dominant_gender'] - except Exception: - genero = "Man" - - threading.Thread( - target=hilo_bienvenida, - args=(mejor_match, genero), - daemon=True - ).start() - ultimo_saludo = tiempo_actual - confirmaciones = 0 - - else: - color = (0, 0, 255) - texto = f"? ({max_sim:.2f})" - confirmaciones = max(0, confirmaciones - 1) - - cv2.putText(display_frame, texto, - (fx, fy - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) - - cv2.imshow("Módulo de Registro", display_frame) - key = cv2.waitKey(1) & 0xFF - - if key == ord('q'): - break - - elif key == ord('r'): - if faces_ultimo_frame: - areas = [fw * fh for (fx, fy, fw, fh, _) in faces_ultimo_frame] - fx, fy, fw, fh, _ = faces_ultimo_frame[np.argmax(areas)] - - m_x = int(fw * 0.30) - m_y = int(fh * 0.30) - face_roi = frame[max(0, fy-m_y): min(h, fy+fh+m_y), - max(0, fx-m_x): min(w, fx+fw+m_x)] - - if face_roi.size > 0: - nom = input("\nNombre de la persona: ").strip() - if nom: - foto_path = os.path.join(DB_PATH, f"{nom}.jpg") - cv2.imwrite(foto_path, face_roi) - print(f"[OK] Rostro de '{nom}' guardado. Sincronizando...") - base_datos = gestionar_vectores(actualizar=True) - else: - print("[!] Registro cancelado.") - else: - print("[!] Recorte vacío. Intenta de nuevo.") - else: - print("\n[!] No se detectó rostro. Acércate más o mira a la lente.") - - cap.release() - cv2.destroyAllWindows() - -if __name__ == "__main__": - sistema_interactivo() +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' +os.environ['CUDA_VISIBLE_DEVICES'] = '-1' + +import cv2 +import numpy as np +from deepface import DeepFace +import pickle +import time +import threading +import asyncio +import edge_tts +import subprocess +from datetime import datetime +import warnings +import urllib.request +import torch + +if torch.cuda.is_available(): + device = "cuda" + print("GPU detectada → usando GPU 🚀") +else: + device = "cpu" + print("GPU no disponible → usando CPU ⚠️") + +warnings.filterwarnings("ignore") + +# ────────────────────────────────────────────────────────────────────────────── +# CONFIGURACIÓN +# ────────────────────────────────────────────────────────────────────────────── +DB_PATH = "db_institucion" +CACHE_PATH = "cache_nombres" +VECTORS_FILE = "base_datos_rostros.pkl" +TIMESTAMPS_FILE = "representaciones_timestamps.pkl" +UMBRAL_SIM = 0.42 # Por encima → identificado. Por debajo → desconocido. +COOLDOWN_TIME = 15 # Segundos entre saludos + +USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.244" +RTSP_URL = f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/702" + +for path in [DB_PATH, CACHE_PATH]: + os.makedirs(path, exist_ok=True) + +# ────────────────────────────────────────────────────────────────────────────── +# YUNET — Detector facial rápido en CPU +# ────────────────────────────────────────────────────────────────────────────── +YUNET_MODEL_PATH = "face_detection_yunet_2023mar.onnx" + +if not os.path.exists(YUNET_MODEL_PATH): + print(f"Descargando YuNet ({YUNET_MODEL_PATH})...") + url = ("https://github.com/opencv/opencv_zoo/raw/main/models/" + "face_detection_yunet/face_detection_yunet_2023mar.onnx") + urllib.request.urlretrieve(url, YUNET_MODEL_PATH) + print("YuNet descargado.") + +# Detector estricto para ROIs grandes (persona cerca) +detector_yunet = cv2.FaceDetectorYN.create( + model=YUNET_MODEL_PATH, config="", + input_size=(320, 320), + score_threshold=0.70, + nms_threshold=0.3, + top_k=5000 +) + +# Detector permisivo para ROIs pequeños (persona lejos) +detector_yunet_lejano = cv2.FaceDetectorYN.create( + model=YUNET_MODEL_PATH, config="", + input_size=(320, 320), + score_threshold=0.45, + nms_threshold=0.3, + top_k=5000 +) + +def detectar_rostros_yunet(roi, lock=None): + """ + Elige automáticamente el detector según el tamaño del ROI. + """ + h_roi, w_roi = roi.shape[:2] + area = w_roi * h_roi + det = detector_yunet if area > 8000 else detector_yunet_lejano + + try: + if lock: + with lock: + det.setInputSize((w_roi, h_roi)) + _, faces = det.detect(roi) + else: + det.setInputSize((w_roi, h_roi)) + _, faces = det.detect(roi) + except Exception: + return [] + + if faces is None: + return [] + + resultado = [] + for face in faces: + try: + fx, fy, fw, fh = map(int, face[:4]) + score = float(face[14]) if len(face) > 14 else 1.0 + resultado.append((fx, fy, fw, fh, score)) + except (ValueError, OverflowError, TypeError): + continue + return resultado + + +# ────────────────────────────────────────────────────────────────────────────── +# SISTEMA DE AUDIO +# ────────────────────────────────────────────────────────────────────────────── +def obtener_audios_humanos(genero): + hora = datetime.now().hour + es_mujer = genero.lower() == 'woman' + suffix = "_m.mp3" if es_mujer else "_h.mp3" + if 5 <= hora < 12: + intro = "dias.mp3" + elif 12 <= hora < 19: + intro = "tarde.mp3" + else: + intro = "noches.mp3" + cierre = ("fin_noche" if (hora >= 19 or hora < 5) else "fin_dia") + suffix + return intro, cierre + + +async def sintetizar_nombre(nombre, ruta): + nombre_limpio = nombre.replace('_', ' ') + try: + comunicador = edge_tts.Communicate(nombre_limpio, "es-MX-DaliaNeural", rate="+10%") + await comunicador.save(ruta) + except Exception: + pass + + +def reproducir(archivo): + if os.path.exists(archivo): + subprocess.Popen( + ["mpv", "--no-video", "--volume=100", archivo], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + +def hilo_bienvenida(nombre, genero): + archivo_nombre = os.path.join(CACHE_PATH, f"nombre_{nombre}.mp3") + + if not os.path.exists(archivo_nombre): + try: + asyncio.run(sintetizar_nombre(nombre, archivo_nombre)) + except Exception: + pass + + intro, cierre = obtener_audios_humanos(genero) + + archivos = [f for f in [intro, archivo_nombre, cierre] if os.path.exists(f)] + if archivos: + subprocess.Popen( + ["mpv", "--no-video", "--volume=100"] + archivos, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + +# ────────────────────────────────────────────────────────────────────────────── +# GESTIÓN DE BASE DE DATOS (AHORA CON RETINAFACE Y ALINEACIÓN) +# ────────────────────────────────────────────────────────────────────────────── +def gestionar_vectores(actualizar=False): + import json # ⚡ Asegúrate de tener importado json + + vectores_actuales = {} + if os.path.exists(VECTORS_FILE): + try: + with open(VECTORS_FILE, 'rb') as f: + vectores_actuales = pickle.load(f) + except Exception: + vectores_actuales = {} + + if not actualizar: + return vectores_actuales + + timestamps = {} + if os.path.exists(TIMESTAMPS_FILE): + try: + with open(TIMESTAMPS_FILE, 'rb') as f: + timestamps = pickle.load(f) + except Exception: + timestamps = {} + + # ────────────────────────────────────────────────────────── + # CARGA DEL CACHÉ DE GÉNEROS + # ────────────────────────────────────────────────────────── + ruta_generos = os.path.join(CACHE_PATH, "generos.json") + dic_generos = {} + if os.path.exists(ruta_generos): + try: + with open(ruta_generos, 'r') as f: + dic_generos = json.load(f) + except Exception: + pass + + print("\nACTUALIZANDO BASE DE DATOS (Alineación y Caché de Géneros)...") + imagenes = [f for f in os.listdir(DB_PATH) if f.lower().endswith(('.jpg', '.png'))] + nombres_en_disco = set() + hubo_cambios = False + cambio_generos = False # Bandera para saber si actualizamos el JSON + + for archivo in imagenes: + nombre_archivo = os.path.splitext(archivo)[0] + ruta_img = os.path.join(DB_PATH, archivo) + nombres_en_disco.add(nombre_archivo) + + ts_actual = os.path.getmtime(ruta_img) + ts_guardado = timestamps.get(nombre_archivo, 0) + + # Si ya tenemos el vector pero NO tenemos su género en el JSON, forzamos el procesamiento + falta_genero = nombre_archivo not in dic_generos + + if nombre_archivo in vectores_actuales and ts_actual == ts_guardado and not falta_genero: + continue + + try: + img_db = cv2.imread(ruta_img) + lab = cv2.cvtColor(img_db, cv2.COLOR_BGR2LAB) + l, a, b = cv2.split(lab) + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) + l = clahe.apply(l) + img_mejorada = cv2.cvtColor(cv2.merge((l, a, b)), cv2.COLOR_LAB2BGR) + + # IA DE GÉNERO (Solo se ejecuta 1 vez por persona en toda la vida del sistema) + if falta_genero: + try: + analisis = DeepFace.analyze(img_mejorada, actions=['gender'], enforce_detection=False)[0] + dic_generos[nombre_archivo] = analisis.get('dominant_gender', 'Man') + except Exception: + dic_generos[nombre_archivo] = "Man" # Respaldo + cambio_generos = True + + # Extraemos el vector + res = DeepFace.represent( + img_path=img_mejorada, + model_name="ArcFace", + detector_backend="opencv", + align=False, + enforce_detection=True + ) + emb = np.array(res[0]["embedding"], dtype=np.float32) + + norma = np.linalg.norm(emb) + if norma > 0: + emb = emb / norma + + vectores_actuales[nombre_archivo] = emb + timestamps[nombre_archivo] = ts_actual + hubo_cambios = True + print(f" Procesado y alineado: {nombre_archivo} | Género: {dic_generos.get(nombre_archivo)}") + + except Exception as e: + print(f" Rostro no válido en '{archivo}', omitido. Error: {e}") + + # Limpieza de eliminados + for nombre in list(vectores_actuales.keys()): + if nombre not in nombres_en_disco: + del vectores_actuales[nombre] + timestamps.pop(nombre, None) + if nombre in dic_generos: + del dic_generos[nombre] + cambio_generos = True + hubo_cambios = True + print(f" Eliminado (sin foto): {nombre}") + + # Guardado de la memoria + if hubo_cambios: + with open(VECTORS_FILE, 'wb') as f: + pickle.dump(vectores_actuales, f) + with open(TIMESTAMPS_FILE, 'wb') as f: + pickle.dump(timestamps, f) + + # Guardado del JSON de géneros si hubo descubrimientos nuevos + if cambio_generos: + with open(ruta_generos, 'w') as f: + json.dump(dic_generos, f) + + if hubo_cambios or cambio_generos: + print(" Sincronización terminada.\n") + else: + print(" Sin cambios. Base de datos al día.\n") + + return vectores_actuales + +# ────────────────────────────────────────────────────────────────────────────── +# BÚSQUEDA BLINDADA (Similitud Coseno estricta) +# ────────────────────────────────────────────────────────────────────────────── +def buscar_mejor_match(emb_consulta, base_datos): + # ⚡ MAGIA 3: Normalización L2 del vector entrante + norma = np.linalg.norm(emb_consulta) + if norma > 0: + emb_consulta = emb_consulta / norma + + mejor_match, max_sim = None, -1.0 + for nombre, vec in base_datos.items(): + # Como ambos están normalizados, esto es Similitud Coseno pura (-1.0 a 1.0) + sim = float(np.dot(emb_consulta, vec)) + if sim > max_sim: + max_sim = sim + mejor_match = nombre + + return mejor_match, max_sim + +# ────────────────────────────────────────────────────────────────────────────── +# LOOP DE PRUEBA Y REGISTRO (CON SIMETRÍA ESTRICTA) +# ────────────────────────────────────────────────────────────────────────────── +def sistema_interactivo(): + base_datos = gestionar_vectores(actualizar=False) + cap = cv2.VideoCapture(RTSP_URL) + ultimo_saludo = 0 + persona_actual = None + confirmaciones = 0 + + print("\n" + "=" * 50) + print(" MÓDULO DE REGISTRO Y DEPURACIÓN ESTRICTO") + print(" [R] Registrar nuevo rostro | [Q] Salir") + print("=" * 50 + "\n") + + faces_ultimo_frame = [] + + while True: + ret, frame = cap.read() + if not ret: + time.sleep(2) + cap.open(RTSP_URL) + continue + + h, w = frame.shape[:2] + display_frame = frame.copy() + tiempo_actual = time.time() + + faces_raw = detectar_rostros_yunet(frame) + faces_ultimo_frame = faces_raw + + for (fx, fy, fw, fh, score_yunet) in faces_raw: + fx = max(0, fx); fy = max(0, fy) + fw = min(w - fx, fw); fh = min(h - fy, fh) + if fw <= 0 or fh <= 0: + continue + + cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (255, 200, 0), 2) + cv2.putText(display_frame, f"YN:{score_yunet:.2f}", + (fx, fy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 200, 0), 1) + + if (tiempo_actual - ultimo_saludo) <= COOLDOWN_TIME: + continue + + m = int(fw * 0.15) + roi = frame[max(0, fy-m): min(h, fy+fh+m), + max(0, fx-m): min(w, fx+fw+m)] + + # 🛡️ FILTRO DE TAMAÑO FÍSICO + if roi.size == 0 or roi.shape[0] < 40 or roi.shape[1] < 40: + cv2.putText(display_frame, "muy pequeno", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 100, 255), 1) + continue + + # 🛡️ FILTRO DE NITIDEZ + gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) + nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() + if nitidez < 50.0: + cv2.putText(display_frame, f"blur({nitidez:.0f})", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 165, 255), 1) + continue + + # 🌙 SIMETRÍA 1: VISIÓN NOCTURNA (CLAHE) AL VIDEO EN VIVO + try: + lab = cv2.cvtColor(roi, cv2.COLOR_BGR2LAB) + l, a, b = cv2.split(lab) + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) + l = clahe.apply(l) + roi_mejorado = cv2.cvtColor(cv2.merge((l, a, b)), cv2.COLOR_LAB2BGR) + except Exception: + roi_mejorado = roi # Respaldo de seguridad + + # 🧠 SIMETRÍA 2: MOTOR MTCNN Y ALINEACIÓN (Igual que la Base de Datos) + try: + res = DeepFace.represent( + img_path=roi_mejorado, + model_name="ArcFace", + detector_backend="mtcnn", # El mismo que en gestionar_vectores + align=True, # Enderezamos la cara + enforce_detection=True # Si MTCNN no ve cara clara, aborta + ) + emb = np.array(res[0]["embedding"], dtype=np.float32) + mejor_match, max_sim = buscar_mejor_match(emb, base_datos) + + except Exception: + # MTCNN abortó porque la cara estaba de perfil, tapada o no era una cara + cv2.putText(display_frame, "MTCNN Ignorado", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) + continue + + estado = " IDENTIFICADO" if max_sim > UMBRAL_SIM else "DESCONOCIDO" + nombre_d = mejor_match.split('_')[0] if mejor_match else "nadie" + n_bloques = int(max_sim * 20) + barra = "█" * n_bloques + "░" * (20 - n_bloques) + print(f"[REGISTRO] {estado} | {nombre_d:<14} | {barra} | " + f"{max_sim*100:.1f}% (umbral: {UMBRAL_SIM*100:.0f}%)") + + if max_sim > UMBRAL_SIM and mejor_match: + color = (0, 255, 0) + texto = f"{mejor_match.split('_')[0]} ({max_sim:.2f})" + + if mejor_match == persona_actual: + confirmaciones += 1 + else: + persona_actual, confirmaciones = mejor_match, 1 + + if confirmaciones >= 1: + cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 3) + try: + analisis = DeepFace.analyze( + roi_mejorado, actions=['gender'], enforce_detection=False + )[0] + genero = analisis['dominant_gender'] + except Exception: + genero = "Man" + + threading.Thread( + target=hilo_bienvenida, + args=(mejor_match, genero), + daemon=True + ).start() + ultimo_saludo = tiempo_actual + confirmaciones = 0 + + else: + color = (0, 0, 255) + texto = f"? ({max_sim:.2f})" + confirmaciones = max(0, confirmaciones - 1) + + cv2.putText(display_frame, texto, + (fx, fy - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) + + cv2.imshow("Módulo de Registro", display_frame) + key = cv2.waitKey(1) & 0xFF + + if key == ord('q'): + break + + elif key == ord('r'): + if faces_ultimo_frame: + areas = [fw * fh for (fx, fy, fw, fh, _) in faces_ultimo_frame] + fx, fy, fw, fh, _ = faces_ultimo_frame[np.argmax(areas)] + + m_x = int(fw * 0.30) + m_y = int(fh * 0.30) + face_roi = frame[max(0, fy-m_y): min(h, fy+fh+m_y), + max(0, fx-m_x): min(w, fx+fw+m_x)] + + if face_roi.size > 0: + nom = input("\nNombre de la persona: ").strip() + if nom: + foto_path = os.path.join(DB_PATH, f"{nom}.jpg") + cv2.imwrite(foto_path, face_roi) + print(f"[OK] Rostro de '{nom}' guardado. Sincronizando...") + base_datos = gestionar_vectores(actualizar=True) + else: + print("[!] Registro cancelado.") + else: + print("[!] Recorte vacío. Intenta de nuevo.") + else: + print("\n[!] No se detectó rostro. Acércate más o mira a la lente.") + + cap.release() + cv2.destroyAllWindows() + +if __name__ == "__main__": + sistema_interactivo() diff --git a/requirements.txt b/requirements.txt index 1096595..e008e7c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,96 +1,96 @@ -absl-py==2.4.0 -aiohappyeyeballs==2.6.1 -aiohttp==3.13.3 -aiosignal==1.4.0 -astunparse==1.6.3 -attrs==25.4.0 -beautifulsoup4==4.14.3 -blinker==1.9.0 -certifi==2026.1.4 -charset-normalizer==3.4.4 -click==8.3.1 -contourpy==1.3.3 -cycler==0.12.1 -deepface==0.0.98 -edge-tts==7.2.7 -filelock==3.20.0 -fire==0.7.1 -Flask==3.1.2 -flask-cors==6.0.2 -flatbuffers==25.12.19 -fonttools==4.61.1 -frozenlist==1.8.0 -fsspec==2025.12.0 -gast==0.7.0 -gdown==5.2.1 -google-pasta==0.2.0 -grpcio==1.78.0 -gunicorn==25.0.3 -h5py==3.15.1 -idna==3.11 -itsdangerous==2.2.0 -Jinja2==3.1.6 -joblib==1.5.3 -keras==3.13.2 -kiwisolver==1.4.9 -lap==0.5.12 -libclang==18.1.1 -lightdsa==0.0.3 -lightecc==0.0.4 -lightphe==0.0.20 -lz4==4.4.5 -Markdown==3.10.2 -markdown-it-py==4.0.0 -MarkupSafe==2.1.5 -matplotlib==3.10.8 -mdurl==0.1.2 -ml_dtypes==0.5.4 -mpmath==1.3.0 -mtcnn==1.0.0 -multidict==6.7.1 -namex==0.1.0 -networkx==3.6.1 -numpy==1.26.4 -onnxruntime==1.24.2 -opencv-python==4.11.0.86 -opt_einsum==3.4.0 -optree==0.18.0 -packaging==26.0 -pandas==3.0.0 -pillow==12.0.0 -polars==1.38.1 -polars-runtime-32==1.38.1 -propcache==0.4.1 -protobuf==6.33.5 -psutil==7.2.2 -Pygments==2.19.2 -pyparsing==3.3.2 -PySocks==1.7.1 -python-dateutil==2.9.0.post0 -python-dotenv==1.2.1 -PyYAML==6.0.3 -requests==2.32.5 -retina-face==0.0.17 -rich==14.3.2 -scipy==1.17.0 -six==1.17.0 -soupsieve==2.8.3 -sympy==1.14.0 -tabulate==0.9.0 -tensorboard==2.20.0 -tensorboard-data-server==0.7.2 -tensorflow==2.20.0 -tensorflow-io-gcs-filesystem==0.37.1 -termcolor==3.3.0 -tf_keras==2.20.1 -torch==2.10.0+cpu -torchreid==0.2.5 -torchvision==0.25.0+cpu -tqdm==4.67.3 -typing_extensions==4.15.0 -ultralytics==8.4.14 -ultralytics-thop==2.0.18 -urllib3==2.6.3 -Werkzeug==3.1.5 -wrapt==2.1.1 -yarl==1.22.0 +absl-py==2.4.0 +aiohappyeyeballs==2.6.1 +aiohttp==3.13.3 +aiosignal==1.4.0 +astunparse==1.6.3 +attrs==25.4.0 +beautifulsoup4==4.14.3 +blinker==1.9.0 +certifi==2026.1.4 +charset-normalizer==3.4.4 +click==8.3.1 +contourpy==1.3.3 +cycler==0.12.1 +deepface==0.0.98 +edge-tts==7.2.7 +filelock==3.20.0 +fire==0.7.1 +Flask==3.1.2 +flask-cors==6.0.2 +flatbuffers==25.12.19 +fonttools==4.61.1 +frozenlist==1.8.0 +fsspec==2025.12.0 +gast==0.7.0 +gdown==5.2.1 +google-pasta==0.2.0 +grpcio==1.78.0 +gunicorn==25.0.3 +h5py==3.15.1 +idna==3.11 +itsdangerous==2.2.0 +Jinja2==3.1.6 +joblib==1.5.3 +keras==3.13.2 +kiwisolver==1.4.9 +lap==0.5.12 +libclang==18.1.1 +lightdsa==0.0.3 +lightecc==0.0.4 +lightphe==0.0.20 +lz4==4.4.5 +Markdown==3.10.2 +markdown-it-py==4.0.0 +MarkupSafe==2.1.5 +matplotlib==3.10.8 +mdurl==0.1.2 +ml_dtypes==0.5.4 +mpmath==1.3.0 +mtcnn==1.0.0 +multidict==6.7.1 +namex==0.1.0 +networkx==3.6.1 +numpy==1.26.4 +onnxruntime==1.24.2 +opencv-python==4.11.0.86 +opt_einsum==3.4.0 +optree==0.18.0 +packaging==26.0 +pandas==3.0.0 +pillow==12.0.0 +polars==1.38.1 +polars-runtime-32==1.38.1 +propcache==0.4.1 +protobuf==6.33.5 +psutil==7.2.2 +Pygments==2.19.2 +pyparsing==3.3.2 +PySocks==1.7.1 +python-dateutil==2.9.0.post0 +python-dotenv==1.2.1 +PyYAML==6.0.3 +requests==2.32.5 +retina-face==0.0.17 +rich==14.3.2 +scipy==1.17.0 +six==1.17.0 +soupsieve==2.8.3 +sympy==1.14.0 +tabulate==0.9.0 +tensorboard==2.20.0 +tensorboard-data-server==0.7.2 +tensorflow==2.20.0 +tensorflow-io-gcs-filesystem==0.37.1 +termcolor==3.3.0 +tf_keras==2.20.1 +torch==2.10.0+cpu +torchreid==0.2.5 +torchvision==0.25.0+cpu +tqdm==4.67.3 +typing_extensions==4.15.0 +ultralytics==8.4.14 +ultralytics-thop==2.0.18 +urllib3==2.6.3 +Werkzeug==3.1.5 +wrapt==2.1.1 +yarl==1.22.0 diff --git a/runs/detect/predict2/bus.jpg b/runs/detect/predict2/bus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f299e60e723d990ff31297927e252a522041b282 GIT binary patch literal 365848 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≪!EZ1jV+Nb^x#gN$Z&cDf%y*i6T#chA^205_6Eb_ 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%0DLzd-dx4wQc68uc)E_1o0 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 Q+Lyx?`Y#9EVo)Rh4^at7%>V!Z literal 0 HcmV?d00001 diff --git a/vesiones_seguras.txt b/vesiones_seguras.txt index 0653fd8..0db3b2c 100644 --- a/vesiones_seguras.txt +++ b/vesiones_seguras.txt @@ -1,1258 +1,1258 @@ -############################################################ seguimiento2.py -import cv2 -import numpy as np -import time -import threading -from scipy.optimize import linear_sum_assignment -from scipy.spatial.distance import cosine -from ultralytics import YOLO -import onnxruntime as ort -import os - -# ────────────────────────────────────────────────────────────────────────────── -# CONFIGURACIÓN DEL SISTEMA -# ────────────────────────────────────────────────────────────────────────────── -USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.65" -SECUENCIA = [1, 7, 5, 8, 3, 6] -# 🛡️ RED ESTABILIZADA (Timeout de 3s para evitar congelamientos de FFmpeg) -os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp|stimeout;3000000" -URLS = [f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/{i}02" for i in SECUENCIA] -ONNX_MODEL_PATH = "osnet_x0_25_msmt17.onnx" - -VECINOS = { - "1": ["7"], "7": ["1", "5"], "5": ["7", "8"], - "8": ["5", "3"], "3": ["8", "6"], "6": ["3"] -} - -ASPECT_RATIO_MIN = 0.5 -ASPECT_RATIO_MAX = 4.0 -AREA_MIN_CALIDAD = 1200 -FRAMES_CALIDAD = 2 -TIEMPO_MAX_AUSENCIA = 800.0 - -# ⚡ UMBRALES MAESTROS: Tolerancia altísima entre cámaras vecinas para ignorar cambios de luz -UMBRAL_REID_MISMA_CAM = 0.62 -UMBRAL_REID_VECINO = 0.53 -UMBRAL_REID_NO_VECINO = 0.72 -MAX_FIRMAS_MEMORIA = 15 - -C_CANDIDATO = (150, 150, 150) -C_LOCAL = (0, 255, 0) -C_GLOBAL = (0, 165, 255) -C_GRUPO = (0, 0, 255) -C_APRENDIZAJE = (255, 255, 0) -FUENTE = cv2.FONT_HERSHEY_SIMPLEX - -# ────────────────────────────────────────────────────────────────────────────── -# INICIALIZACIÓN OSNET -# ────────────────────────────────────────────────────────────────────────────── -print("Cargando cerebro de Re-Identificación (OSNet)...") -try: - ort_session = ort.InferenceSession(ONNX_MODEL_PATH, providers=['CPUExecutionProvider']) - input_name = ort_session.get_inputs()[0].name - print("Modelo OSNet cargado exitosamente.") -except Exception as e: - print(f"ERROR FATAL: No se pudo cargar {ONNX_MODEL_PATH}.") - exit() - -MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32).reshape(1, 3, 1, 1) -STD = np.array([0.229, 0.224, 0.225], dtype=np.float32).reshape(1, 3, 1, 1) - -# ────────────────────────────────────────────────────────────────────────────── -# 1. EXTRACCIÓN DE FIRMAS (Deep + Color + Textura) -# ────────────────────────────────────────────────────────────────────────────── -def analizar_calidad(box): - x1, y1, x2, y2 = box - w, h = x2 - x1, y2 - y1 - if w <= 0 or h <= 0: return False - return (ASPECT_RATIO_MIN < (h / w) < ASPECT_RATIO_MAX) and ((w * h) > AREA_MIN_CALIDAD) - -def preprocess_onnx(roi): - img = cv2.resize(roi, (128, 256)) - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - img = img.transpose(2, 0, 1).astype(np.float32) / 255.0 - img = np.expand_dims(img, axis=0) - img = (img - MEAN) / STD - return img - -def extraer_color_zonas(img): - h_roi = img.shape[0] - t1, t2 = int(h_roi * 0.15), int(h_roi * 0.55) - zonas = [img[:t1, :], img[t1:t2, :], img[t2:, :]] - - def hist_zona(z): - if z.size == 0: return np.zeros(16 * 8) - hsv = cv2.cvtColor(z, cv2.COLOR_BGR2HSV) - hist = cv2.calcHist([hsv], [0, 1], None, [16, 8], [0, 180, 0, 256]) - cv2.normalize(hist, hist) - return hist.flatten() - return np.concatenate([hist_zona(z) for z in zonas]) - -def extraer_textura_rapida(roi): - if roi.size == 0: return np.zeros(16) - gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) - gray_eq = cv2.equalizeHist(gray) - gx = cv2.Sobel(gray_eq, cv2.CV_32F, 1, 0, ksize=3) - gy = cv2.Sobel(gray_eq, cv2.CV_32F, 0, 1, ksize=3) - mag, _ = cv2.cartToPolar(gx, gy) - hist = cv2.calcHist([mag], [0], None, [16], [0, 256]) - cv2.normalize(hist, hist) - return hist.flatten() - -def extraer_firma_hibrida(frame, box): - try: - x1, y1, x2, y2 = map(int, box) - fh, fw = frame.shape[:2] - x1_c, y1_c = max(0, x1), max(0, y1) - x2_c, y2_c = min(fw, x2), min(fh, y2) - - roi = frame[y1_c:y2_c, x1_c:x2_c] - if roi.size == 0 or roi.shape[0] < 20 or roi.shape[1] < 10: return None - - calidad_area = (x2_c - x1_c) * (y2_c - y1_c) - - blob = preprocess_onnx(roi) - blob_16 = np.zeros((16, 3, 256, 128), dtype=np.float32) - blob_16[0] = blob[0] - deep_feat = ort_session.run(None, {input_name: blob_16})[0][0].flatten() - norma = np.linalg.norm(deep_feat) - if norma > 0: deep_feat = deep_feat / norma - - color_feat = extraer_color_zonas(roi) - textura_feat = extraer_textura_rapida(roi) - - return {'deep': deep_feat, 'color': color_feat, 'textura': textura_feat, 'calidad': calidad_area} - except Exception: - return None - -# ⚡ EL SECRETO: 100% IA entre cámaras. Textura solo en la misma cámara. -def similitud_hibrida(f1, f2, cross_cam=False): - if f1 is None or f2 is None: return 0.0 - - sim_deep = max(0.0, 1.0 - cosine(f1['deep'], f2['deep'])) - - if cross_cam: - # Si saltó de cámara, la luz cambia. Ignoramos color y textura. Confiamos 100% en OSNet. - return sim_deep - - # Si está en la misma cámara, usamos color y textura para separar a los vestidos de negro. - if f1['color'].shape == f2['color'].shape and f1['color'].size > 1: - L = len(f1['color']) // 3 - sim_head = max(0.0, float(cv2.compareHist(f1['color'][:L].astype(np.float32), f2['color'][:L].astype(np.float32), cv2.HISTCMP_CORREL))) - sim_torso = max(0.0, float(cv2.compareHist(f1['color'][L:2*L].astype(np.float32), f2['color'][L:2*L].astype(np.float32), cv2.HISTCMP_CORREL))) - sim_legs = max(0.0, float(cv2.compareHist(f1['color'][2*L:].astype(np.float32), f2['color'][2*L:].astype(np.float32), cv2.HISTCMP_CORREL))) - sim_color = (0.10 * sim_head) + (0.60 * sim_torso) + (0.30 * sim_legs) - else: sim_color = 0.0 - - if 'textura' in f1 and 'textura' in f2 and f1['textura'].size > 1: - sim_textura = max(0.0, float(cv2.compareHist(f1['textura'].astype(np.float32), f2['textura'].astype(np.float32), cv2.HISTCMP_CORREL))) - else: sim_textura = 0.0 - - return (sim_deep * 0.80) + (sim_color * 0.10) + (sim_textura * 0.10) - -# ────────────────────────────────────────────────────────────────────────────── -# 2. KALMAN TRACKER -# ────────────────────────────────────────────────────────────────────────────── -class KalmanTrack: - _count = 0 - def __init__(self, box, now): - self.kf = cv2.KalmanFilter(7, 4) - self.kf.measurementMatrix = np.array([[1,0,0,0,0,0,0], [0,1,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0]], np.float32) - self.kf.transitionMatrix = np.eye(7, dtype=np.float32) - self.kf.transitionMatrix[0,4] = 1; self.kf.transitionMatrix[1,5] = 1; self.kf.transitionMatrix[2,6] = 1 - self.kf.processNoiseCov *= 0.03 - self.kf.statePost = np.zeros((7, 1), np.float32) - self.kf.statePost[:4] = self._convert_bbox_to_z(box) - self.local_id = KalmanTrack._count - KalmanTrack._count += 1 - self.gid = None - self.origen_global = False - self.aprendiendo = False - self.box = list(box) - self.ts_creacion = now - self.ts_ultima_deteccion = now - self.time_since_update = 0 - self.en_grupo = False - self.frames_buena_calidad = 0 - self.listo_para_id = False - self.area_referencia = 0.0 - - def _convert_bbox_to_z(self, bbox): - w = bbox[2] - bbox[0]; h = bbox[3] - bbox[1]; x = bbox[0] + w/2.; y = bbox[1] + h/2. - return np.array([[x],[y],[w*h],[w/float(h+1e-6)]]).astype(np.float32) - - def _convert_x_to_bbox(self, x): - cx, cy, s, r = float(x[0].item()), float(x[1].item()), float(x[2].item()), float(x[3].item()) - w = np.sqrt(s * r); h = s / (w + 1e-6) - return [cx-w/2., cy-h/2., cx+w/2., cy+h/2.] - - def predict(self, turno_activo=True): - if (self.kf.statePost[6] + self.kf.statePost[2]) <= 0: self.kf.statePost[6] *= 0.0 - self.kf.predict() - if turno_activo: self.time_since_update += 1 - self.aprendiendo = False - self.box = self._convert_x_to_bbox(self.kf.statePre) - return self.box - - def update(self, box, en_grupo, now): - self.ts_ultima_deteccion = now - self.time_since_update = 0 - self.box = list(box) - self.en_grupo = en_grupo - self.kf.correct(self._convert_bbox_to_z(box)) - - if analizar_calidad(box) and not en_grupo: - self.frames_buena_calidad += 1 - if self.frames_buena_calidad >= FRAMES_CALIDAD: - self.listo_para_id = True - elif self.gid is None: - self.frames_buena_calidad = max(0, self.frames_buena_calidad - 1) - -# ────────────────────────────────────────────────────────────────────────────── -# 3. MEMORIA GLOBAL (Anti-Robos y Físicas de Tiempo) -# ────────────────────────────────────────────────────────────────────────────── -class GlobalMemory: - def __init__(self): - self.db = {} - self.next_gid = 100 - self.lock = threading.Lock() - - def _es_transito_posible(self, data, cam_destino, now): - ultima_cam = str(data['last_cam']) - cam_destino = str(cam_destino) - dt = now - data['ts'] - - if ultima_cam == cam_destino: return True - vecinos = VECINOS.get(ultima_cam, []) - # Permite teletransportación mínima (-0.5s) para que no te fragmente en los pasillos conectados - if cam_destino in vecinos: return dt >= -0.5 - return dt >= 4.0 - - def _sim_robusta(self, firma_nueva, firmas_guardadas, cross_cam=False): - if not firmas_guardadas: return 0.0 - sims = sorted([similitud_hibrida(firma_nueva, f, cross_cam) for f in firmas_guardadas], reverse=True) - if len(sims) == 1: return sims[0] - elif len(sims) <= 4: return (sims[0] * 0.6) + (sims[1] * 0.4) - else: return (sims[0] * 0.50) + (sims[1] * 0.30) + (sims[2] * 0.20) - - # ⚡ SE AGREGÓ 'en_borde' A LOS PARÁMETROS - def identificar_candidato(self, firma_hibrida, cam_id, now, active_gids, en_borde=True): - with self.lock: - candidatos = [] - vecinos = VECINOS.get(str(cam_id), []) - - for gid, data in self.db.items(): - if gid in active_gids: continue - dt = now - data['ts'] - if dt > TIEMPO_MAX_AUSENCIA or not self._es_transito_posible(data, cam_id, now): continue - if not data['firmas']: continue - - misma_cam = (str(data['last_cam']) == str(cam_id)) - es_cross_cam = not misma_cam - es_vecino = str(data['last_cam']) in vecinos - - # ⚡ FÍSICA DE PUERTAS: Si "nació" en el centro de la pantalla, NO viene caminando del pasillo adyacente. - if es_vecino and not en_borde: - es_vecino = False - - sim = self._sim_robusta(firma_hibrida, data['firmas'], cross_cam=es_cross_cam) - - if misma_cam: umbral = UMBRAL_REID_MISMA_CAM - elif es_vecino: umbral = UMBRAL_REID_VECINO - else: umbral = UMBRAL_REID_NO_VECINO - - # 🛡️ PROTECCIÓN VIP: Si este ID ya tiene un nombre real asignado por ArcFace, - # nos volvemos súper estrictos (+0.08) para que un desconocido no se lo robe. - if data.get('nombre') is not None: - umbral += 0.08 - - if sim > umbral: - candidatos.append((sim, gid)) - - if not candidatos: - nid = self.next_gid; self.next_gid += 1 - self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) - return nid, False - - candidatos.sort(reverse=True) - best_sim, best_gid = candidatos[0] - - if len(candidatos) >= 2: - segunda_sim, segundo_gid = candidatos[1] - margen = best_sim - segunda_sim - if margen <= 0.02 and best_sim < 0.75: - print(f"\n[⚠️ ALERTA ROPA SIMILAR] Empate técnico entre ID {best_gid} ({best_sim:.2f}) y ID {segundo_gid} ({segunda_sim:.2f}). Se asigna ID temporal nuevo.") - nid = self.next_gid; self.next_gid += 1 - self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) - return nid, False - - self._actualizar_sin_lock(best_gid, firma_hibrida, cam_id, now) - return best_gid, True - - def _actualizar_sin_lock(self, gid, firma_dict, cam_id, now): - if gid not in self.db: self.db[gid] = {'firmas': [], 'last_cam': cam_id, 'ts': now} - if firma_dict is not None: - firmas_list = self.db[gid]['firmas'] - if not firmas_list: - firmas_list.append(firma_dict) - else: - if firma_dict['calidad'] > (firmas_list[0]['calidad'] * 1.50): - vieja_ancla = firmas_list[0]; firmas_list[0] = firma_dict; firma_dict = vieja_ancla - if len(firmas_list) >= MAX_FIRMAS_MEMORIA: - max_sim_interna = -1.0; idx_redundante = 1 - for i in range(1, len(firmas_list)): - sims_con_otras = [similitud_hibrida(firmas_list[i], firmas_list[j]) for j in range(1, len(firmas_list)) if j != i] - sim_promedio = np.mean(sims_con_otras) if sims_con_otras else 0.0 - if sim_promedio > max_sim_interna: max_sim_interna = sim_promedio; idx_redundante = i - firmas_list[idx_redundante] = firma_dict - else: - firmas_list.append(firma_dict) - self.db[gid]['last_cam'] = cam_id - self.db[gid]['ts'] = now - - def actualizar(self, gid, firma, cam_id, now): - with self.lock: self._actualizar_sin_lock(gid, firma, cam_id, now) - -# ────────────────────────────────────────────────────────────────────────────── -# 4. GESTOR LOCAL (Kalman Elasticity & Ghost Killer) -# ────────────────────────────────────────────────────────────────────────────── -def iou_overlap(boxA, boxB): - xA, yA, xB, yB = max(boxA[0], boxB[0]), max(boxA[1], boxB[1]), min(boxA[2], boxB[2]), min(boxA[3], boxB[3]) - inter = max(0, xB-xA) * max(0, yB-yA) - areaA = (boxA[2]-boxA[0]) * (boxA[3]-boxA[1]); areaB = (boxB[2]-boxB[0]) * (boxB[3]-boxB[1]) - return inter / (areaA + areaB - inter + 1e-6) - -class CamManager: - def __init__(self, cam_id, global_mem): - self.cam_id, self.global_mem, self.trackers = cam_id, global_mem, [] - - def update(self, boxes, frame, now, turno_activo): - for trk in self.trackers: trk.predict(turno_activo=turno_activo) - if not turno_activo: return self.trackers - - matched, unmatched_dets, unmatched_trks = self._asignar(boxes, now) - - for t_idx, d_idx in matched: - trk = self.trackers[t_idx]; box = boxes[d_idx] - en_grupo = any(other is not trk and iou_overlap(box, other.box) > 0.10 for other in self.trackers) - trk.update(box, en_grupo, now) - - active_gids = {t.gid for t in self.trackers if t.gid is not None} - area_actual = (box[2] - box[0]) * (box[3] - box[1]) - - # IGNORAMOS VECTORES MUTANTES DE GRUPOS - if trk.gid is None and trk.listo_para_id and not trk.en_grupo: - firma = extraer_firma_hibrida(frame, box) - if firma is not None: - # ⚡ DETECCIÓN DE ZONA DE NACIMIENTO - fh, fw = frame.shape[:2] - bx1, by1, bx2, by2 = map(int, box) - # Si nace a menos de 40 píxeles del margen, entró por el pasillo - nace_en_borde = (bx1 < 80 or by1 < 80 or bx2 > fw - 80 or by2 > fh - 80) - - # Mandamos esa información al identificador - gid, es_reid = self.global_mem.identificar_candidato(firma, self.cam_id, now, active_gids, en_borde=nace_en_borde) - trk.gid, trk.origen_global, trk.area_referencia = gid, es_reid, area_actual - - elif trk.gid is not None and not trk.en_grupo: - tiempo_ultima_firma = getattr(trk, 'ultimo_aprendizaje', 0) - - # ⚡ APRENDIZAJE RÁPIDO: Bajamos de 1.5s a 0.5s para que llene la memoria volando - if (now - tiempo_ultima_firma) > 0.5 and analizar_calidad(box): - fh, fw = frame.shape[:2] - x1, y1, x2, y2 = map(int, box) - en_borde = (x1 < 15 or y1 < 15 or x2 > fw - 15 or y2 > fh - 15) - - if not en_borde: - firma_nueva = extraer_firma_hibrida(frame, box) - if firma_nueva is not None: - with self.global_mem.lock: - if trk.gid in self.global_mem.db and self.global_mem.db[trk.gid]['firmas']: - - # ⚡ APRENDIZAJE EN CADENA: Comparamos contra la ÚLTIMA foto (-1), no contra la primera. - # Esto permite que el sistema "entienda" cuando te estás dando la vuelta o mostrando la mochila. - firma_reciente = self.global_mem.db[trk.gid]['firmas'][-1] - sim_coherencia = similitud_hibrida(firma_nueva, firma_reciente) - - # Tolerancia relajada a 0.50 para permitir la transición de la espalda - if sim_coherencia > 0.50: - es_coherente = True - for otro_gid, otro_data in self.global_mem.db.items(): - if otro_gid == trk.gid or not otro_data['firmas']: continue - sim_intruso = similitud_hibrida(firma_nueva, otro_data['firmas'][0]) - if sim_intruso > sim_coherencia: - es_coherente = False - break - if es_coherente: - self.global_mem._actualizar_sin_lock(trk.gid, firma_nueva, self.cam_id, now) - trk.ultimo_aprendizaje = now - trk.aprendiendo = True - - for d_idx in unmatched_dets: self.trackers.append(KalmanTrack(boxes[d_idx], now)) - - vivos = [] - fh, fw = frame.shape[:2] - for t in self.trackers: - x1, y1, x2, y2 = t.box - toca_borde = (x1 < 15 or y1 < 15 or x2 > fw - 15 or y2 > fh - 15) - tiempo_oculto = now - t.ts_ultima_deteccion - - # ⚡ MUERTE DE FANTASMAS: Si toca el borde muere en 1s. Evita robo de IDs. - limite_vida = 1.0 if toca_borde else 10.0 - if tiempo_oculto < limite_vida: - vivos.append(t) - - self.trackers = vivos - return self.trackers - - def _asignar(self, boxes, now): - n_trk = len(self.trackers); n_det = len(boxes) - if n_trk == 0: return [], list(range(n_det)), [] - if n_det == 0: return [], [], list(range(n_trk)) - - cost_mat = np.zeros((n_trk, n_det), dtype=np.float32) - TIEMPO_TURNO_ROTATIVO = len(SECUENCIA) * 0.035 - - for t, trk in enumerate(self.trackers): - for d, det in enumerate(boxes): - iou = iou_overlap(trk.box, det) - cx_t, cy_t = (trk.box[0]+trk.box[2])/2, (trk.box[1]+trk.box[3])/2 - cx_d, cy_d = (det[0]+det[2])/2, (det[1]+det[3])/2 - dist_norm = np.sqrt((cx_t-cx_d)**2 + (cy_t-cy_d)**2) / 550.0 - - area_trk = (trk.box[2] - trk.box[0]) * (trk.box[3] - trk.box[1]) - area_det = (det[2] - det[0]) * (det[3] - det[1]) - ratio_area = max(area_trk, area_det) / (min(area_trk, area_det) + 1e-6) - castigo_tam = (ratio_area - 1.0) * 0.7 - - tiempo_oculto = now - trk.ts_ultima_deteccion - if tiempo_oculto > (TIEMPO_TURNO_ROTATIVO * 2) and iou < 0.10: - fantasma_penalty = 5.0 - else: fantasma_penalty = 0.0 - - if iou >= 0.05 or dist_norm < 0.80: - cost_mat[t, d] = (1.0 - iou) + (dist_norm * 2.0) + fantasma_penalty + castigo_tam - else: cost_mat[t, d] = 100.0 - - row_ind, col_ind = linear_sum_assignment(cost_mat) - matched, unmatched_dets, unmatched_trks = [], [], [] - - for r, c in zip(row_ind, col_ind): - # ⚡ CAJAS PEGAJOSAS: 6.0 evita que suelte el ID si te mueves rápido - if cost_mat[r, c] > 7.0: - unmatched_trks.append(r); unmatched_dets.append(c) - else: matched.append((r, c)) - - for t in range(n_trk): - if t not in [m[0] for m in matched]: unmatched_trks.append(t) - for d in range(n_det): - if d not in [m[1] for m in matched]: unmatched_dets.append(d) - - return matched, unmatched_dets, unmatched_trks - -# ────────────────────────────────────────────────────────────────────────────── -# 5. STREAM Y MAIN LOOP (Standalone) -# ────────────────────────────────────────────────────────────────────────────── -class CamStream: - def __init__(self, url): - self.url, self.cap = url, cv2.VideoCapture(url) - self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1); self.frame = None - threading.Thread(target=self._run, daemon=True).start() - - def _run(self): - while True: - ret, f = self.cap.read() - if ret: - self.frame = f; time.sleep(0.01) - else: - time.sleep(2); self.cap.open(self.url) - -def dibujar_track(frame_show, trk): - try: x1, y1, x2, y2 = map(int, trk.box) - except Exception: return - - if trk.gid is None: color, label = C_CANDIDATO, f"?{trk.local_id}" - elif trk.en_grupo: color, label = C_GRUPO, f"ID:{trk.gid} [grp]" - elif trk.aprendiendo: color, label = C_APRENDIZAJE, f"ID:{trk.gid} [++]" - elif trk.origen_global: color, label = C_GLOBAL, f"ID:{trk.gid} [re-id]" - else: color, label = C_LOCAL, f"ID:{trk.gid}" - - cv2.rectangle(frame_show, (x1, y1), (x2, y2), color, 2) - (tw, th), _ = cv2.getTextSize(label, FUENTE, 0.55, 1) - cv2.rectangle(frame_show, (x1, y1-th-6), (x1+tw+2, y1), color, -1) - cv2.putText(frame_show, label, (x1+1, y1-4), FUENTE, 0.55, (0,0,0), 1) - -def main(): - print("Iniciando Sistema V-PRO — Tracker Resiliente (Código Unificado Maestro)") - model = YOLO("yolov8n.pt") - global_mem = GlobalMemory() - managers = {str(c): CamManager(c, global_mem) for c in SECUENCIA} - cams = [CamStream(u) for u in URLS] - cv2.namedWindow("SmartSoft", cv2.WINDOW_AUTOSIZE) - - idx = 0 - while True: - now = time.time() - tiles = [] - cam_ia = idx % len(cams) - for i, cam_obj in enumerate(cams): - frame = cam_obj.frame; cid = str(SECUENCIA[i]) - if frame is None: tiles.append(np.zeros((270, 480, 3), np.uint8)); continue - frame_show = cv2.resize(frame.copy(), (480, 270)); boxes = []; turno_activo = (i == cam_ia) - if turno_activo: - res = model.predict(frame_show, conf=0.50, iou=0.40, classes=[0], verbose=False, imgsz=480, device='cpu') - if res[0].boxes: boxes = res[0].boxes.xyxy.cpu().numpy().tolist() - tracks = managers[cid].update(boxes, frame_show, now, turno_activo) - for trk in tracks: - if trk.time_since_update <= 1: dibujar_track(frame_show, trk) - if turno_activo: cv2.circle(frame_show, (460, 20), 6, (0, 0, 255), -1) - con_id = sum(1 for t in tracks if t.gid and t.time_since_update==0) - cv2.putText(frame_show, f"CAM {cid} [{con_id} ID]", (10, 28), FUENTE, 0.7, (255, 255, 255), 2) - tiles.append(frame_show) - - if len(tiles) == 6: cv2.imshow("SmartSoft", np.vstack([np.hstack(tiles[0:3]), np.hstack(tiles[3:6])])) - idx += 1 - if cv2.waitKey(1) == ord('q'): break - cv2.destroyAllWindows() - -if __name__ == "__main__": - main() - - - - - - - - - - -############################################################### fusion.py -import os -os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' -os.environ['CUDA_VISIBLE_DEVICES'] = '-1' -os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp|stimeout;3000000" -import cv2 -import numpy as np -import time -import threading -from queue import Queue -from deepface import DeepFace -from ultralytics import YOLO -import warnings - -warnings.filterwarnings("ignore") - -# ────────────────────────────────────────────────────────────────────────────── -# 1. IMPORTAMOS NUESTROS MÓDULOS -# ────────────────────────────────────────────────────────────────────────────── -# Del motor matemático y tracking -from seguimiento2 import GlobalMemory, CamManager, SECUENCIA, URLS, FUENTE, similitud_hibrida - -# Del motor de reconocimiento facial y audio -from reconocimiento2 import ( - gestionar_vectores, - detectar_rostros_yunet, - buscar_mejor_match, - hilo_bienvenida, - UMBRAL_SIM, - COOLDOWN_TIME -) - -# ────────────────────────────────────────────────────────────────────────────── -# 2. PROTECCIONES MULTIHILO E INICIALIZACIÓN -# ────────────────────────────────────────────────────────────────────────────── -COLA_ROSTROS = Queue(maxsize=4) -YUNET_LOCK = threading.Lock() -IA_LOCK = threading.Lock() - -# Inicializamos la base de datos usando tu función importada -print("\nIniciando carga de base de datos...") -BASE_DATOS_ROSTROS = gestionar_vectores(actualizar=True) - -# ────────────────────────────────────────────────────────────────────────────── -# 3. MOTOR ASÍNCRONO -# ────────────────────────────────────────────────────────────────────────────── -def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): - """ Toma el recorte del tracker, escala a Alta Definición, usa YuNet y hace la Fusión Mágica """ - try: - if not BASE_DATOS_ROSTROS: return - - # ────────────────────────────────────────────────────────── - # 1. VALIDACIÓN DEL FRAME HD Y ESCALADO MATEMÁTICO - # ────────────────────────────────────────────────────────── - h_real, w_real = frame_hd.shape[:2] - - # ⚡ TRAMPA ANTI-BUGS: Si esto salta, corrige la llamada en tu main_fusion.py - if w_real <= 480: - print(f"[❌ ERROR CAM {cam_id}] Le estás pasando el frame_show (480x270) a ArcFace, no el HD.") - - escala_x = w_real / 480.0 - escala_y = h_real / 270.0 - - x_min, y_min, x_max, y_max = box_480 - h_box = y_max - y_min - - y_min_expandido = max(0, y_min - (h_box * 0.15)) - y_max_cabeza = min(270, y_min + (h_box * 0.40)) # Límite máximo en la escala de 270 - - x1_hd = int(max(0, x_min) * escala_x) - y1_hd = int(y_min_expandido * escala_y) - x2_hd = int(min(480, x_max) * escala_x) - y2_hd = int(y_max_cabeza * escala_y) - - roi_cabeza = frame_hd[y1_hd:y2_hd, x1_hd:x2_hd] - - # Si la cabeza HD mide menos de 60x60, está demasiado lejos incluso en HD - if roi_cabeza.size == 0 or roi_cabeza.shape[0] < 60 or roi_cabeza.shape[1] < 60: - return - - h_roi, w_roi = roi_cabeza.shape[:2] - - # ────────────────────────────────────────────────────────── - # 2. DETECCIÓN DE ROSTRO CON YUNET (Ahora operando en HD) - # ────────────────────────────────────────────────────────── - faces = detectar_rostros_yunet(roi_cabeza, lock=YUNET_LOCK) - - for (rx, ry, rw, rh, score) in faces: - rx, ry = max(0, rx), max(0, ry) - rw, rh = min(w_roi - rx, rw), min(h_roi - ry, rh) - - area_rostro_actual = rw * rh - - with global_mem.lock: - data = global_mem.db.get(gid, {}) - nombre_actual = data.get('nombre') - area_ref = data.get('area_rostro_ref', 0) - - necesita_saludo = False - if str(cam_id) == "7": - if not hasattr(global_mem, 'ultimos_saludos'): - global_mem.ultimos_saludos = {} - ultimo = global_mem.ultimos_saludos.get(nombre_actual if nombre_actual else "", 0) - if (time.time() - ultimo) > COOLDOWN_TIME: - necesita_saludo = True - - if nombre_actual is None or area_rostro_actual >= (area_ref * 1.5) or necesita_saludo: - - # ⚡ MÁRGENES MÁS AMPLIOS: ArcFace necesita ver frente y barbilla (25%) - m_x = int(rw * 0.25) - m_y = int(rh * 0.25) - - roi_rostro = roi_cabeza[max(0, ry-m_y):min(h_roi, ry+rh+m_y), - max(0, rx-m_x):min(w_roi, rx+rw+m_x)] - - if roi_rostro.size == 0 or roi_rostro.shape[0] < 60 or roi_rostro.shape[1] < 60: - continue - - # ⚡ Laplaciano ajustado para imágenes HD (30.0 es más justo) - gray_roi = cv2.cvtColor(roi_rostro, cv2.COLOR_BGR2GRAY) - nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() - if nitidez < 15.0: - continue - - # ────────────────────────────────────────────────────────── - # 3. RECONOCIMIENTO FACIAL ARCFACE - # ────────────────────────────────────────────────────────── - with IA_LOCK: - try: - # ⚡ CAMBIO DRÁSTICO: Usamos RetinaFace para alinear la cabeza obligatoriamente. - # Si RetinaFace no logra enderezar la cara (ej. estás totalmente de perfil), - # lanzará una excepción y abortará, evitando falsos positivos. - # Así DEBE estar en main_fusion.py para que sea compatible con tu nueva DB - res = DeepFace.represent( - img_path=roi_cabeza, - model_name="ArcFace", - detector_backend="retinaface", # Obligatorio - align=True, # Obligatorio - enforce_detection=True # Obligatorio - ) - emb = np.array(res[0]["embedding"], dtype=np.float32) - mejor_match, max_sim = buscar_mejor_match(emb, BASE_DATOS_ROSTROS) - except Exception: - # Si falla la alineación o estás muy borroso, lo ignoramos en silencio. - continue - - print(f"[DEBUG CAM {cam_id}] ArcFace: {mejor_match} al {max_sim:.2f} (Umbral: {UMBRAL_SIM})") - - if max_sim >= UMBRAL_SIM and mejor_match: - nombre_limpio = mejor_match.split('_')[0] - - with global_mem.lock: - global_mem.db[gid]['nombre'] = nombre_limpio - global_mem.db[gid]['area_rostro_ref'] = area_rostro_actual - global_mem.db[gid]['ts'] = time.time() - - ids_a_borrar = [] - firma_actual = global_mem.db[gid]['firmas'][0] if global_mem.db[gid]['firmas'] else None - - for otro_gid, datos_otro in list(global_mem.db.items()): - if otro_gid == gid: continue - - if datos_otro.get('nombre') == nombre_limpio: - ids_a_borrar.append(otro_gid) - - elif datos_otro.get('nombre') is None and firma_actual and datos_otro['firmas']: - sim_huerfano = similitud_hibrida(firma_actual, datos_otro['firmas'][0]) - if sim_huerfano > 0.75: - ids_a_borrar.append(otro_gid) - - for id_basura in ids_a_borrar: - del global_mem.db[id_basura] - print(f"[🧹 LIMPIEZA] ID huérfano/clon {id_basura} eliminado tras reconocer a {nombre_limpio}.") - - if str(cam_id) == "7" and necesita_saludo: - global_mem.ultimos_saludos[nombre_limpio] = time.time() - try: - with IA_LOCK: - analisis = DeepFace.analyze(roi_rostro, actions=['gender'], enforce_detection=False)[0] - genero = analisis.get('dominant_gender', 'Man') - except Exception: - genero = "Man" - - threading.Thread(target=hilo_bienvenida, args=(nombre_limpio, genero), daemon=True).start() - break - except Exception as e: - pass - finally: - trk.procesando_rostro = False - -def worker_rostros(global_mem): - """ Consumidor de la cola multihilo """ - while True: - frame, box, gid, cam_id, trk = COLA_ROSTROS.get() - procesar_rostro_async(frame, box, gid, cam_id, global_mem, trk) - COLA_ROSTROS.task_done() - -# ────────────────────────────────────────────────────────────────────────────── -# 4. LOOP PRINCIPAL DE FUSIÓN -# ────────────────────────────────────────────────────────────────────────────── -class CamStream: - def __init__(self, url): - self.url = url - self.cap = cv2.VideoCapture(url) - self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) - self.frame = None - threading.Thread(target=self._run, daemon=True).start() - - def _run(self): - while True: - ret, f = self.cap.read() - if ret: - self.frame = f - time.sleep(0.01) - else: - time.sleep(2) - self.cap.open(self.url) - -def dibujar_track_fusion(frame_show, trk, global_mem): - try: x1, y1, x2, y2 = map(int, trk.box) - except Exception: return - - nombre_str = "" - if trk.gid is not None: - with global_mem.lock: - nombre = global_mem.db.get(trk.gid, {}).get('nombre') - if nombre: nombre_str = f" [{nombre}]" - - if trk.gid is None: color, label = (150, 150, 150), f"?{trk.local_id}" - elif nombre_str: color, label = (255, 0, 255), f"ID:{trk.gid}{nombre_str}" - elif trk.en_grupo: color, label = (0, 0, 255), f"ID:{trk.gid} [grp]" - elif trk.aprendiendo: color, label = (255, 255, 0), f"ID:{trk.gid} [++]" - elif trk.origen_global: color, label = (0, 165, 255), f"ID:{trk.gid} [re-id]" - else: color, label = (0, 255, 0), f"ID:{trk.gid}" - - cv2.rectangle(frame_show, (x1, y1), (x2, y2), color, 2) - (tw, th), _ = cv2.getTextSize(label, FUENTE, 0.55, 1) - cv2.rectangle(frame_show, (x1, y1-th-6), (x1+tw+2, y1), color, -1) - cv2.putText(frame_show, label, (x1+1, y1-4), FUENTE, 0.55, (0,0,0), 1) - -def main(): - print("\nIniciando Sistema") - model = YOLO("yolov8n.pt") - global_mem = GlobalMemory() - managers = {str(c): CamManager(c, global_mem) for c in SECUENCIA} - cams = [CamStream(u) for u in URLS] - - for _ in range(2): - threading.Thread(target=worker_rostros, args=(global_mem,), daemon=True).start() - - cv2.namedWindow("SmartSoft", cv2.WINDOW_AUTOSIZE) - idx = 0 - - while True: - now = time.time() - tiles = [] - cam_ia = idx % len(cams) - - for i, cam_obj in enumerate(cams): - frame = cam_obj.frame; cid = str(SECUENCIA[i]) - if frame is None: - tiles.append(np.zeros((270, 480, 3), np.uint8)) - continue - - frame_show = cv2.resize(frame.copy(), (480, 270)) - boxes = [] - turno_activo = (i == cam_ia) - - if turno_activo: - res = model.predict(frame_show, conf=0.50, iou=0.50, classes=[0], verbose=False, imgsz=480) - if res[0].boxes: - boxes = res[0].boxes.xyxy.cpu().numpy().tolist() - - tracks = managers[cid].update(boxes, frame_show, now, turno_activo) - - for trk in tracks: - if trk.time_since_update <= 1: - dibujar_track_fusion(frame_show, trk, global_mem) - - if turno_activo and trk.gid is not None and not getattr(trk, 'procesando_rostro', False): - if not COLA_ROSTROS.full(): - trk.procesando_rostro = True - COLA_ROSTROS.put((frame.copy(), trk.box, trk.gid, cid, trk)) - - if turno_activo: cv2.circle(frame_show, (460, 20), 6, (0, 0, 255), -1) - - con_id = sum(1 for t in tracks if t.gid and t.time_since_update==0) - cv2.putText(frame_show, f"CAM {cid} [{con_id} ID]", (10, 28), FUENTE, 0.7, (255, 255, 255), 2) - tiles.append(frame_show) - - if len(tiles) == 6: - cv2.imshow("SmartSoft Fusion", np.vstack([np.hstack(tiles[0:3]), np.hstack(tiles[3:6])])) - - idx += 1 - if cv2.waitKey(1) == ord('q'): - break - - cv2.destroyAllWindows() - -if __name__ == "__main__": - main() - - - - - - - - - - - - - - - - - - - -################################################################### reconocimeito2.py - -import os -os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' -os.environ['CUDA_VISIBLE_DEVICES'] = '-1' - -import cv2 -import numpy as np -from deepface import DeepFace -import pickle -import time -import threading -import asyncio -import edge_tts -import subprocess -from datetime import datetime -import warnings -import urllib.request - -warnings.filterwarnings("ignore") - -# ────────────────────────────────────────────────────────────────────────────── -# CONFIGURACIÓN -# ────────────────────────────────────────────────────────────────────────────── -DB_PATH = "db_institucion" -CACHE_PATH = "cache_nombres" -VECTORS_FILE = "base_datos_rostros.pkl" -TIMESTAMPS_FILE = "representaciones_timestamps.pkl" -UMBRAL_SIM = 0.45 # Por encima → identificado. Por debajo → desconocido. -COOLDOWN_TIME = 15 # Segundos entre saludos - -USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.65" -RTSP_URL = f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/702" - -for path in [DB_PATH, CACHE_PATH]: - os.makedirs(path, exist_ok=True) - -# ────────────────────────────────────────────────────────────────────────────── -# YUNET — Detector facial rápido en CPU -# ────────────────────────────────────────────────────────────────────────────── -YUNET_MODEL_PATH = "face_detection_yunet_2023mar.onnx" - -if not os.path.exists(YUNET_MODEL_PATH): - print(f"Descargando YuNet ({YUNET_MODEL_PATH})...") - url = ("https://github.com/opencv/opencv_zoo/raw/main/models/" - "face_detection_yunet/face_detection_yunet_2023mar.onnx") - urllib.request.urlretrieve(url, YUNET_MODEL_PATH) - print("YuNet descargado.") - -# Detector estricto para ROIs grandes (persona cerca) -detector_yunet = cv2.FaceDetectorYN.create( - model=YUNET_MODEL_PATH, config="", - input_size=(320, 320), - score_threshold=0.70, - nms_threshold=0.3, - top_k=5000 -) - -# Detector permisivo para ROIs pequeños (persona lejos) -detector_yunet_lejano = cv2.FaceDetectorYN.create( - model=YUNET_MODEL_PATH, config="", - input_size=(320, 320), - score_threshold=0.45, - nms_threshold=0.3, - top_k=5000 -) - -def detectar_rostros_yunet(roi, lock=None): - """ - Elige automáticamente el detector según el tamaño del ROI. - """ - h_roi, w_roi = roi.shape[:2] - area = w_roi * h_roi - det = detector_yunet if area > 8000 else detector_yunet_lejano - - try: - if lock: - with lock: - det.setInputSize((w_roi, h_roi)) - _, faces = det.detect(roi) - else: - det.setInputSize((w_roi, h_roi)) - _, faces = det.detect(roi) - except Exception: - return [] - - if faces is None: - return [] - - resultado = [] - for face in faces: - try: - fx, fy, fw, fh = map(int, face[:4]) - score = float(face[14]) if len(face) > 14 else 1.0 - resultado.append((fx, fy, fw, fh, score)) - except (ValueError, OverflowError, TypeError): - continue - return resultado - - -# ────────────────────────────────────────────────────────────────────────────── -# SISTEMA DE AUDIO -# ────────────────────────────────────────────────────────────────────────────── -def obtener_audios_humanos(genero): - hora = datetime.now().hour - es_mujer = genero.lower() == 'woman' - suffix = "_m.mp3" if es_mujer else "_h.mp3" - if 5 <= hora < 12: - intro = "dias.mp3" - elif 12 <= hora < 19: - intro = "tarde.mp3" - else: - intro = "noches.mp3" - cierre = ("fin_noche" if (hora >= 19 or hora < 5) else "fin_dia") + suffix - return intro, cierre - - -async def sintetizar_nombre(nombre, ruta): - nombre_limpio = nombre.replace('_', ' ') - try: - comunicador = edge_tts.Communicate(nombre_limpio, "es-MX-DaliaNeural", rate="+10%") - await comunicador.save(ruta) - except Exception: - pass - - -def reproducir(archivo): - if os.path.exists(archivo): - subprocess.Popen( - ["mpv", "--no-video", "--volume=100", archivo], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - - -def hilo_bienvenida(nombre, genero): - archivo_nombre = os.path.join(CACHE_PATH, f"nombre_{nombre}.mp3") - - if not os.path.exists(archivo_nombre): - try: - asyncio.run(sintetizar_nombre(nombre, archivo_nombre)) - except Exception: - pass - - intro, cierre = obtener_audios_humanos(genero) - - archivos = [f for f in [intro, archivo_nombre, cierre] if os.path.exists(f)] - if archivos: - subprocess.Popen( - ["mpv", "--no-video", "--volume=100"] + archivos, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - - -# ────────────────────────────────────────────────────────────────────────────── -# GESTIÓN DE BASE DE DATOS (AHORA CON RETINAFACE Y ALINEACIÓN) -# ────────────────────────────────────────────────────────────────────────────── -def gestionar_vectores(actualizar=False): - vectores_actuales = {} - - if os.path.exists(VECTORS_FILE): - try: - with open(VECTORS_FILE, 'rb') as f: - vectores_actuales = pickle.load(f) - except Exception: - vectores_actuales = {} - - if not actualizar: - return vectores_actuales - - timestamps = {} - if os.path.exists(TIMESTAMPS_FILE): - try: - with open(TIMESTAMPS_FILE, 'rb') as f: - timestamps = pickle.load(f) - except Exception: - timestamps = {} - - print("\nACTUALIZANDO BASE DE DATOS (Alineación con RetinaFace)...") - imagenes = [f for f in os.listdir(DB_PATH) if f.lower().endswith(('.jpg', '.png'))] - nombres_en_disco = set() - hubo_cambios = False - - for archivo in imagenes: - nombre_archivo = os.path.splitext(archivo)[0] - ruta_img = os.path.join(DB_PATH, archivo) - nombres_en_disco.add(nombre_archivo) - - ts_actual = os.path.getmtime(ruta_img) - ts_guardado = timestamps.get(nombre_archivo, 0) - - if nombre_archivo in vectores_actuales and ts_actual == ts_guardado: - continue - - try: - # ⚡ MAGIA 1: RetinaFace alinea matemáticamente los rostros de la base de datos - res = DeepFace.represent( - img_path=ruta_img, - model_name="ArcFace", - detector_backend="retinaface", # Localiza ojos/nariz - align=True, # Rota la imagen para alinear - enforce_detection=True # Obliga a que haya cara válida - ) - emb = np.array(res[0]["embedding"], dtype=np.float32) - - # ⚡ MAGIA 2: Normalización L2 al guardar (Elimina el "Efecto Rosa María") - norma = np.linalg.norm(emb) - if norma > 0: - emb = emb / norma - - vectores_actuales[nombre_archivo] = emb - timestamps[nombre_archivo] = ts_actual - hubo_cambios = True - print(f" ✅ Procesado y alineado: {nombre_archivo}") - - except Exception as e: - print(f" ❌ Rostro no válido en '{archivo}', omitido. Error: {e}") - - for nombre in list(vectores_actuales.keys()): - if nombre not in nombres_en_disco: - del vectores_actuales[nombre] - timestamps.pop(nombre, None) - hubo_cambios = True - print(f" 🗑️ Eliminado (sin foto): {nombre}") - - if hubo_cambios: - with open(VECTORS_FILE, 'wb') as f: - pickle.dump(vectores_actuales, f) - with open(TIMESTAMPS_FILE, 'wb') as f: - pickle.dump(timestamps, f) - print(" Sincronización terminada.\n") - else: - print(" Sin cambios. Base de datos al día.\n") - - return vectores_actuales - -# ────────────────────────────────────────────────────────────────────────────── -# BÚSQUEDA BLINDADA (Similitud Coseno estricta) -# ────────────────────────────────────────────────────────────────────────────── -def buscar_mejor_match(emb_consulta, base_datos): - # ⚡ MAGIA 3: Normalización L2 del vector entrante - norma = np.linalg.norm(emb_consulta) - if norma > 0: - emb_consulta = emb_consulta / norma - - mejor_match, max_sim = None, -1.0 - for nombre, vec in base_datos.items(): - # Como ambos están normalizados, esto es Similitud Coseno pura (-1.0 a 1.0) - sim = float(np.dot(emb_consulta, vec)) - if sim > max_sim: - max_sim = sim - mejor_match = nombre - - return mejor_match, max_sim - -# ────────────────────────────────────────────────────────────────────────────── -# LOOP DE PRUEBA Y REGISTRO -# ────────────────────────────────────────────────────────────────────────────── -def sistema_interactivo(): - base_datos = gestionar_vectores(actualizar=False) - cap = cv2.VideoCapture(RTSP_URL) - ultimo_saludo = 0 - persona_actual = None - confirmaciones = 0 - - print("\n" + "=" * 50) - print(" MÓDULO DE REGISTRO Y DEPURACIÓN") - print(" [R] Registrar nuevo rostro | [Q] Salir") - print("=" * 50 + "\n") - - faces_ultimo_frame = [] - - while True: - ret, frame = cap.read() - if not ret: - time.sleep(2) - cap.open(RTSP_URL) - continue - - h, w = frame.shape[:2] - display_frame = frame.copy() - tiempo_actual = time.time() - - faces_raw = detectar_rostros_yunet(frame) - faces_ultimo_frame = faces_raw - - for (fx, fy, fw, fh, score_yunet) in faces_raw: - fx = max(0, fx); fy = max(0, fy) - fw = min(w - fx, fw); fh = min(h - fy, fh) - if fw <= 0 or fh <= 0: - continue - - cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (255, 200, 0), 2) - cv2.putText(display_frame, f"YN:{score_yunet:.2f}", - (fx, fy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 200, 0), 1) - - if (tiempo_actual - ultimo_saludo) <= COOLDOWN_TIME: - continue - - m = int(fw * 0.15) - roi = frame[max(0, fy-m): min(h, fy+fh+m), - max(0, fx-m): min(w, fx+fw+m)] - - if roi.size == 0 or roi.shape[0] < 40 or roi.shape[1] < 40: - cv2.putText(display_frame, "muy pequeño", - (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 100, 255), 1) - continue - - gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) - nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() - if nitidez < 50.0: - cv2.putText(display_frame, f"blur({nitidez:.0f})", - (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 165, 255), 1) - continue - - try: - # ⚡ En el modo de prueba interactivo usamos las reglas viejas - # para que sea rápido y puedas registrar fotos fácilmente. - res = DeepFace.represent( - img_path=roi, model_name="ArcFace", enforce_detection=False - ) - emb = np.array(res[0]["embedding"], dtype=np.float32) - mejor_match, max_sim = buscar_mejor_match(emb, base_datos) - - except Exception as e: - print(f"[ERROR ArcFace]: {e}") - continue - - estado = " IDENTIFICADO" if max_sim > UMBRAL_SIM else "DESCONOCIDO" - nombre_d = mejor_match.split('_')[0] if mejor_match else "nadie" - n_bloques = int(max_sim * 20) - barra = "█" * n_bloques + "░" * (20 - n_bloques) - print(f"[REGISTRO] {estado} | {nombre_d:<14} | {barra} | " - f"{max_sim*100:.1f}% (umbral: {UMBRAL_SIM*100:.0f}%)") - - if max_sim > UMBRAL_SIM and mejor_match: - color = (0, 255, 0) - texto = f"{mejor_match.split('_')[0]} ({max_sim:.2f})" - - if mejor_match == persona_actual: - confirmaciones += 1 - else: - persona_actual, confirmaciones = mejor_match, 1 - - if confirmaciones >= 2: - cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 3) - try: - analisis = DeepFace.analyze( - roi, actions=['gender'], enforce_detection=False - )[0] - genero = analisis['dominant_gender'] - except Exception: - genero = "Man" - - threading.Thread( - target=hilo_bienvenida, - args=(mejor_match, genero), - daemon=True - ).start() - ultimo_saludo = tiempo_actual - confirmaciones = 0 - - else: - color = (0, 0, 255) - texto = f"? ({max_sim:.2f})" - confirmaciones = max(0, confirmaciones - 1) - - cv2.putText(display_frame, texto, - (fx, fy - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) - - cv2.imshow("Módulo de Registro", display_frame) - key = cv2.waitKey(1) & 0xFF - - if key == ord('q'): - break - - elif key == ord('r'): - if faces_ultimo_frame: - areas = [fw * fh for (fx, fy, fw, fh, _) in faces_ultimo_frame] - fx, fy, fw, fh, _ = faces_ultimo_frame[np.argmax(areas)] - - # Le damos más margen al registro (30%) para que RetinaFace no falle - # cuando procese la foto en la carpeta. - m_x = int(fw * 0.30) - m_y = int(fh * 0.30) - face_roi = frame[max(0, fy-m_y): min(h, fy+fh+m_y), - max(0, fx-m_x): min(w, fx+fw+m_x)] - - if face_roi.size > 0: - nom = input("\nNombre de la persona: ").strip() - if nom: - foto_path = os.path.join(DB_PATH, f"{nom}.jpg") - cv2.imwrite(foto_path, face_roi) - print(f"[OK] Rostro de '{nom}' guardado. Sincronizando...") - # ⚡ Al sincronizar, RetinaFace alineará esta foto guardada. - base_datos = gestionar_vectores(actualizar=True) - else: - print("[!] Registro cancelado.") - else: - print("[!] Recorte vacío. Intenta de nuevo.") - else: - print("\n[!] No se detectó rostro. Acércate más o mira a la lente.") - - cap.release() - cv2.destroyAllWindows() - -if __name__ == "__main__": - sistema_interactivo() +############################################################ seguimiento2.py +import cv2 +import numpy as np +import time +import threading +from scipy.optimize import linear_sum_assignment +from scipy.spatial.distance import cosine +from ultralytics import YOLO +import onnxruntime as ort +import os + +# ────────────────────────────────────────────────────────────────────────────── +# CONFIGURACIÓN DEL SISTEMA +# ────────────────────────────────────────────────────────────────────────────── +USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.65" +SECUENCIA = [1, 7, 5, 8, 3, 6] +# 🛡️ RED ESTABILIZADA (Timeout de 3s para evitar congelamientos de FFmpeg) +os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp|stimeout;3000000" +URLS = [f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/{i}02" for i in SECUENCIA] +ONNX_MODEL_PATH = "osnet_x0_25_msmt17.onnx" + +VECINOS = { + "1": ["7"], "7": ["1", "5"], "5": ["7", "8"], + "8": ["5", "3"], "3": ["8", "6"], "6": ["3"] +} + +ASPECT_RATIO_MIN = 0.5 +ASPECT_RATIO_MAX = 4.0 +AREA_MIN_CALIDAD = 1200 +FRAMES_CALIDAD = 2 +TIEMPO_MAX_AUSENCIA = 800.0 + +# ⚡ UMBRALES MAESTROS: Tolerancia altísima entre cámaras vecinas para ignorar cambios de luz +UMBRAL_REID_MISMA_CAM = 0.62 +UMBRAL_REID_VECINO = 0.53 +UMBRAL_REID_NO_VECINO = 0.72 +MAX_FIRMAS_MEMORIA = 15 + +C_CANDIDATO = (150, 150, 150) +C_LOCAL = (0, 255, 0) +C_GLOBAL = (0, 165, 255) +C_GRUPO = (0, 0, 255) +C_APRENDIZAJE = (255, 255, 0) +FUENTE = cv2.FONT_HERSHEY_SIMPLEX + +# ────────────────────────────────────────────────────────────────────────────── +# INICIALIZACIÓN OSNET +# ────────────────────────────────────────────────────────────────────────────── +print("Cargando cerebro de Re-Identificación (OSNet)...") +try: + ort_session = ort.InferenceSession(ONNX_MODEL_PATH, providers=['CPUExecutionProvider']) + input_name = ort_session.get_inputs()[0].name + print("Modelo OSNet cargado exitosamente.") +except Exception as e: + print(f"ERROR FATAL: No se pudo cargar {ONNX_MODEL_PATH}.") + exit() + +MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32).reshape(1, 3, 1, 1) +STD = np.array([0.229, 0.224, 0.225], dtype=np.float32).reshape(1, 3, 1, 1) + +# ────────────────────────────────────────────────────────────────────────────── +# 1. EXTRACCIÓN DE FIRMAS (Deep + Color + Textura) +# ────────────────────────────────────────────────────────────────────────────── +def analizar_calidad(box): + x1, y1, x2, y2 = box + w, h = x2 - x1, y2 - y1 + if w <= 0 or h <= 0: return False + return (ASPECT_RATIO_MIN < (h / w) < ASPECT_RATIO_MAX) and ((w * h) > AREA_MIN_CALIDAD) + +def preprocess_onnx(roi): + img = cv2.resize(roi, (128, 256)) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = img.transpose(2, 0, 1).astype(np.float32) / 255.0 + img = np.expand_dims(img, axis=0) + img = (img - MEAN) / STD + return img + +def extraer_color_zonas(img): + h_roi = img.shape[0] + t1, t2 = int(h_roi * 0.15), int(h_roi * 0.55) + zonas = [img[:t1, :], img[t1:t2, :], img[t2:, :]] + + def hist_zona(z): + if z.size == 0: return np.zeros(16 * 8) + hsv = cv2.cvtColor(z, cv2.COLOR_BGR2HSV) + hist = cv2.calcHist([hsv], [0, 1], None, [16, 8], [0, 180, 0, 256]) + cv2.normalize(hist, hist) + return hist.flatten() + return np.concatenate([hist_zona(z) for z in zonas]) + +def extraer_textura_rapida(roi): + if roi.size == 0: return np.zeros(16) + gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) + gray_eq = cv2.equalizeHist(gray) + gx = cv2.Sobel(gray_eq, cv2.CV_32F, 1, 0, ksize=3) + gy = cv2.Sobel(gray_eq, cv2.CV_32F, 0, 1, ksize=3) + mag, _ = cv2.cartToPolar(gx, gy) + hist = cv2.calcHist([mag], [0], None, [16], [0, 256]) + cv2.normalize(hist, hist) + return hist.flatten() + +def extraer_firma_hibrida(frame, box): + try: + x1, y1, x2, y2 = map(int, box) + fh, fw = frame.shape[:2] + x1_c, y1_c = max(0, x1), max(0, y1) + x2_c, y2_c = min(fw, x2), min(fh, y2) + + roi = frame[y1_c:y2_c, x1_c:x2_c] + if roi.size == 0 or roi.shape[0] < 20 or roi.shape[1] < 10: return None + + calidad_area = (x2_c - x1_c) * (y2_c - y1_c) + + blob = preprocess_onnx(roi) + blob_16 = np.zeros((16, 3, 256, 128), dtype=np.float32) + blob_16[0] = blob[0] + deep_feat = ort_session.run(None, {input_name: blob_16})[0][0].flatten() + norma = np.linalg.norm(deep_feat) + if norma > 0: deep_feat = deep_feat / norma + + color_feat = extraer_color_zonas(roi) + textura_feat = extraer_textura_rapida(roi) + + return {'deep': deep_feat, 'color': color_feat, 'textura': textura_feat, 'calidad': calidad_area} + except Exception: + return None + +# ⚡ EL SECRETO: 100% IA entre cámaras. Textura solo en la misma cámara. +def similitud_hibrida(f1, f2, cross_cam=False): + if f1 is None or f2 is None: return 0.0 + + sim_deep = max(0.0, 1.0 - cosine(f1['deep'], f2['deep'])) + + if cross_cam: + # Si saltó de cámara, la luz cambia. Ignoramos color y textura. Confiamos 100% en OSNet. + return sim_deep + + # Si está en la misma cámara, usamos color y textura para separar a los vestidos de negro. + if f1['color'].shape == f2['color'].shape and f1['color'].size > 1: + L = len(f1['color']) // 3 + sim_head = max(0.0, float(cv2.compareHist(f1['color'][:L].astype(np.float32), f2['color'][:L].astype(np.float32), cv2.HISTCMP_CORREL))) + sim_torso = max(0.0, float(cv2.compareHist(f1['color'][L:2*L].astype(np.float32), f2['color'][L:2*L].astype(np.float32), cv2.HISTCMP_CORREL))) + sim_legs = max(0.0, float(cv2.compareHist(f1['color'][2*L:].astype(np.float32), f2['color'][2*L:].astype(np.float32), cv2.HISTCMP_CORREL))) + sim_color = (0.10 * sim_head) + (0.60 * sim_torso) + (0.30 * sim_legs) + else: sim_color = 0.0 + + if 'textura' in f1 and 'textura' in f2 and f1['textura'].size > 1: + sim_textura = max(0.0, float(cv2.compareHist(f1['textura'].astype(np.float32), f2['textura'].astype(np.float32), cv2.HISTCMP_CORREL))) + else: sim_textura = 0.0 + + return (sim_deep * 0.80) + (sim_color * 0.10) + (sim_textura * 0.10) + +# ────────────────────────────────────────────────────────────────────────────── +# 2. KALMAN TRACKER +# ────────────────────────────────────────────────────────────────────────────── +class KalmanTrack: + _count = 0 + def __init__(self, box, now): + self.kf = cv2.KalmanFilter(7, 4) + self.kf.measurementMatrix = np.array([[1,0,0,0,0,0,0], [0,1,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0]], np.float32) + self.kf.transitionMatrix = np.eye(7, dtype=np.float32) + self.kf.transitionMatrix[0,4] = 1; self.kf.transitionMatrix[1,5] = 1; self.kf.transitionMatrix[2,6] = 1 + self.kf.processNoiseCov *= 0.03 + self.kf.statePost = np.zeros((7, 1), np.float32) + self.kf.statePost[:4] = self._convert_bbox_to_z(box) + self.local_id = KalmanTrack._count + KalmanTrack._count += 1 + self.gid = None + self.origen_global = False + self.aprendiendo = False + self.box = list(box) + self.ts_creacion = now + self.ts_ultima_deteccion = now + self.time_since_update = 0 + self.en_grupo = False + self.frames_buena_calidad = 0 + self.listo_para_id = False + self.area_referencia = 0.0 + + def _convert_bbox_to_z(self, bbox): + w = bbox[2] - bbox[0]; h = bbox[3] - bbox[1]; x = bbox[0] + w/2.; y = bbox[1] + h/2. + return np.array([[x],[y],[w*h],[w/float(h+1e-6)]]).astype(np.float32) + + def _convert_x_to_bbox(self, x): + cx, cy, s, r = float(x[0].item()), float(x[1].item()), float(x[2].item()), float(x[3].item()) + w = np.sqrt(s * r); h = s / (w + 1e-6) + return [cx-w/2., cy-h/2., cx+w/2., cy+h/2.] + + def predict(self, turno_activo=True): + if (self.kf.statePost[6] + self.kf.statePost[2]) <= 0: self.kf.statePost[6] *= 0.0 + self.kf.predict() + if turno_activo: self.time_since_update += 1 + self.aprendiendo = False + self.box = self._convert_x_to_bbox(self.kf.statePre) + return self.box + + def update(self, box, en_grupo, now): + self.ts_ultima_deteccion = now + self.time_since_update = 0 + self.box = list(box) + self.en_grupo = en_grupo + self.kf.correct(self._convert_bbox_to_z(box)) + + if analizar_calidad(box) and not en_grupo: + self.frames_buena_calidad += 1 + if self.frames_buena_calidad >= FRAMES_CALIDAD: + self.listo_para_id = True + elif self.gid is None: + self.frames_buena_calidad = max(0, self.frames_buena_calidad - 1) + +# ────────────────────────────────────────────────────────────────────────────── +# 3. MEMORIA GLOBAL (Anti-Robos y Físicas de Tiempo) +# ────────────────────────────────────────────────────────────────────────────── +class GlobalMemory: + def __init__(self): + self.db = {} + self.next_gid = 100 + self.lock = threading.Lock() + + def _es_transito_posible(self, data, cam_destino, now): + ultima_cam = str(data['last_cam']) + cam_destino = str(cam_destino) + dt = now - data['ts'] + + if ultima_cam == cam_destino: return True + vecinos = VECINOS.get(ultima_cam, []) + # Permite teletransportación mínima (-0.5s) para que no te fragmente en los pasillos conectados + if cam_destino in vecinos: return dt >= -0.5 + return dt >= 4.0 + + def _sim_robusta(self, firma_nueva, firmas_guardadas, cross_cam=False): + if not firmas_guardadas: return 0.0 + sims = sorted([similitud_hibrida(firma_nueva, f, cross_cam) for f in firmas_guardadas], reverse=True) + if len(sims) == 1: return sims[0] + elif len(sims) <= 4: return (sims[0] * 0.6) + (sims[1] * 0.4) + else: return (sims[0] * 0.50) + (sims[1] * 0.30) + (sims[2] * 0.20) + + # ⚡ SE AGREGÓ 'en_borde' A LOS PARÁMETROS + def identificar_candidato(self, firma_hibrida, cam_id, now, active_gids, en_borde=True): + with self.lock: + candidatos = [] + vecinos = VECINOS.get(str(cam_id), []) + + for gid, data in self.db.items(): + if gid in active_gids: continue + dt = now - data['ts'] + if dt > TIEMPO_MAX_AUSENCIA or not self._es_transito_posible(data, cam_id, now): continue + if not data['firmas']: continue + + misma_cam = (str(data['last_cam']) == str(cam_id)) + es_cross_cam = not misma_cam + es_vecino = str(data['last_cam']) in vecinos + + # ⚡ FÍSICA DE PUERTAS: Si "nació" en el centro de la pantalla, NO viene caminando del pasillo adyacente. + if es_vecino and not en_borde: + es_vecino = False + + sim = self._sim_robusta(firma_hibrida, data['firmas'], cross_cam=es_cross_cam) + + if misma_cam: umbral = UMBRAL_REID_MISMA_CAM + elif es_vecino: umbral = UMBRAL_REID_VECINO + else: umbral = UMBRAL_REID_NO_VECINO + + # 🛡️ PROTECCIÓN VIP: Si este ID ya tiene un nombre real asignado por ArcFace, + # nos volvemos súper estrictos (+0.08) para que un desconocido no se lo robe. + if data.get('nombre') is not None: + umbral += 0.08 + + if sim > umbral: + candidatos.append((sim, gid)) + + if not candidatos: + nid = self.next_gid; self.next_gid += 1 + self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) + return nid, False + + candidatos.sort(reverse=True) + best_sim, best_gid = candidatos[0] + + if len(candidatos) >= 2: + segunda_sim, segundo_gid = candidatos[1] + margen = best_sim - segunda_sim + if margen <= 0.02 and best_sim < 0.75: + print(f"\n[⚠️ ALERTA ROPA SIMILAR] Empate técnico entre ID {best_gid} ({best_sim:.2f}) y ID {segundo_gid} ({segunda_sim:.2f}). Se asigna ID temporal nuevo.") + nid = self.next_gid; self.next_gid += 1 + self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) + return nid, False + + self._actualizar_sin_lock(best_gid, firma_hibrida, cam_id, now) + return best_gid, True + + def _actualizar_sin_lock(self, gid, firma_dict, cam_id, now): + if gid not in self.db: self.db[gid] = {'firmas': [], 'last_cam': cam_id, 'ts': now} + if firma_dict is not None: + firmas_list = self.db[gid]['firmas'] + if not firmas_list: + firmas_list.append(firma_dict) + else: + if firma_dict['calidad'] > (firmas_list[0]['calidad'] * 1.50): + vieja_ancla = firmas_list[0]; firmas_list[0] = firma_dict; firma_dict = vieja_ancla + if len(firmas_list) >= MAX_FIRMAS_MEMORIA: + max_sim_interna = -1.0; idx_redundante = 1 + for i in range(1, len(firmas_list)): + sims_con_otras = [similitud_hibrida(firmas_list[i], firmas_list[j]) for j in range(1, len(firmas_list)) if j != i] + sim_promedio = np.mean(sims_con_otras) if sims_con_otras else 0.0 + if sim_promedio > max_sim_interna: max_sim_interna = sim_promedio; idx_redundante = i + firmas_list[idx_redundante] = firma_dict + else: + firmas_list.append(firma_dict) + self.db[gid]['last_cam'] = cam_id + self.db[gid]['ts'] = now + + def actualizar(self, gid, firma, cam_id, now): + with self.lock: self._actualizar_sin_lock(gid, firma, cam_id, now) + +# ────────────────────────────────────────────────────────────────────────────── +# 4. GESTOR LOCAL (Kalman Elasticity & Ghost Killer) +# ────────────────────────────────────────────────────────────────────────────── +def iou_overlap(boxA, boxB): + xA, yA, xB, yB = max(boxA[0], boxB[0]), max(boxA[1], boxB[1]), min(boxA[2], boxB[2]), min(boxA[3], boxB[3]) + inter = max(0, xB-xA) * max(0, yB-yA) + areaA = (boxA[2]-boxA[0]) * (boxA[3]-boxA[1]); areaB = (boxB[2]-boxB[0]) * (boxB[3]-boxB[1]) + return inter / (areaA + areaB - inter + 1e-6) + +class CamManager: + def __init__(self, cam_id, global_mem): + self.cam_id, self.global_mem, self.trackers = cam_id, global_mem, [] + + def update(self, boxes, frame, now, turno_activo): + for trk in self.trackers: trk.predict(turno_activo=turno_activo) + if not turno_activo: return self.trackers + + matched, unmatched_dets, unmatched_trks = self._asignar(boxes, now) + + for t_idx, d_idx in matched: + trk = self.trackers[t_idx]; box = boxes[d_idx] + en_grupo = any(other is not trk and iou_overlap(box, other.box) > 0.10 for other in self.trackers) + trk.update(box, en_grupo, now) + + active_gids = {t.gid for t in self.trackers if t.gid is not None} + area_actual = (box[2] - box[0]) * (box[3] - box[1]) + + # IGNORAMOS VECTORES MUTANTES DE GRUPOS + if trk.gid is None and trk.listo_para_id and not trk.en_grupo: + firma = extraer_firma_hibrida(frame, box) + if firma is not None: + # ⚡ DETECCIÓN DE ZONA DE NACIMIENTO + fh, fw = frame.shape[:2] + bx1, by1, bx2, by2 = map(int, box) + # Si nace a menos de 40 píxeles del margen, entró por el pasillo + nace_en_borde = (bx1 < 80 or by1 < 80 or bx2 > fw - 80 or by2 > fh - 80) + + # Mandamos esa información al identificador + gid, es_reid = self.global_mem.identificar_candidato(firma, self.cam_id, now, active_gids, en_borde=nace_en_borde) + trk.gid, trk.origen_global, trk.area_referencia = gid, es_reid, area_actual + + elif trk.gid is not None and not trk.en_grupo: + tiempo_ultima_firma = getattr(trk, 'ultimo_aprendizaje', 0) + + # ⚡ APRENDIZAJE RÁPIDO: Bajamos de 1.5s a 0.5s para que llene la memoria volando + if (now - tiempo_ultima_firma) > 0.5 and analizar_calidad(box): + fh, fw = frame.shape[:2] + x1, y1, x2, y2 = map(int, box) + en_borde = (x1 < 15 or y1 < 15 or x2 > fw - 15 or y2 > fh - 15) + + if not en_borde: + firma_nueva = extraer_firma_hibrida(frame, box) + if firma_nueva is not None: + with self.global_mem.lock: + if trk.gid in self.global_mem.db and self.global_mem.db[trk.gid]['firmas']: + + # ⚡ APRENDIZAJE EN CADENA: Comparamos contra la ÚLTIMA foto (-1), no contra la primera. + # Esto permite que el sistema "entienda" cuando te estás dando la vuelta o mostrando la mochila. + firma_reciente = self.global_mem.db[trk.gid]['firmas'][-1] + sim_coherencia = similitud_hibrida(firma_nueva, firma_reciente) + + # Tolerancia relajada a 0.50 para permitir la transición de la espalda + if sim_coherencia > 0.50: + es_coherente = True + for otro_gid, otro_data in self.global_mem.db.items(): + if otro_gid == trk.gid or not otro_data['firmas']: continue + sim_intruso = similitud_hibrida(firma_nueva, otro_data['firmas'][0]) + if sim_intruso > sim_coherencia: + es_coherente = False + break + if es_coherente: + self.global_mem._actualizar_sin_lock(trk.gid, firma_nueva, self.cam_id, now) + trk.ultimo_aprendizaje = now + trk.aprendiendo = True + + for d_idx in unmatched_dets: self.trackers.append(KalmanTrack(boxes[d_idx], now)) + + vivos = [] + fh, fw = frame.shape[:2] + for t in self.trackers: + x1, y1, x2, y2 = t.box + toca_borde = (x1 < 15 or y1 < 15 or x2 > fw - 15 or y2 > fh - 15) + tiempo_oculto = now - t.ts_ultima_deteccion + + # ⚡ MUERTE DE FANTASMAS: Si toca el borde muere en 1s. Evita robo de IDs. + limite_vida = 1.0 if toca_borde else 10.0 + if tiempo_oculto < limite_vida: + vivos.append(t) + + self.trackers = vivos + return self.trackers + + def _asignar(self, boxes, now): + n_trk = len(self.trackers); n_det = len(boxes) + if n_trk == 0: return [], list(range(n_det)), [] + if n_det == 0: return [], [], list(range(n_trk)) + + cost_mat = np.zeros((n_trk, n_det), dtype=np.float32) + TIEMPO_TURNO_ROTATIVO = len(SECUENCIA) * 0.035 + + for t, trk in enumerate(self.trackers): + for d, det in enumerate(boxes): + iou = iou_overlap(trk.box, det) + cx_t, cy_t = (trk.box[0]+trk.box[2])/2, (trk.box[1]+trk.box[3])/2 + cx_d, cy_d = (det[0]+det[2])/2, (det[1]+det[3])/2 + dist_norm = np.sqrt((cx_t-cx_d)**2 + (cy_t-cy_d)**2) / 550.0 + + area_trk = (trk.box[2] - trk.box[0]) * (trk.box[3] - trk.box[1]) + area_det = (det[2] - det[0]) * (det[3] - det[1]) + ratio_area = max(area_trk, area_det) / (min(area_trk, area_det) + 1e-6) + castigo_tam = (ratio_area - 1.0) * 0.7 + + tiempo_oculto = now - trk.ts_ultima_deteccion + if tiempo_oculto > (TIEMPO_TURNO_ROTATIVO * 2) and iou < 0.10: + fantasma_penalty = 5.0 + else: fantasma_penalty = 0.0 + + if iou >= 0.05 or dist_norm < 0.80: + cost_mat[t, d] = (1.0 - iou) + (dist_norm * 2.0) + fantasma_penalty + castigo_tam + else: cost_mat[t, d] = 100.0 + + row_ind, col_ind = linear_sum_assignment(cost_mat) + matched, unmatched_dets, unmatched_trks = [], [], [] + + for r, c in zip(row_ind, col_ind): + # ⚡ CAJAS PEGAJOSAS: 6.0 evita que suelte el ID si te mueves rápido + if cost_mat[r, c] > 7.0: + unmatched_trks.append(r); unmatched_dets.append(c) + else: matched.append((r, c)) + + for t in range(n_trk): + if t not in [m[0] for m in matched]: unmatched_trks.append(t) + for d in range(n_det): + if d not in [m[1] for m in matched]: unmatched_dets.append(d) + + return matched, unmatched_dets, unmatched_trks + +# ────────────────────────────────────────────────────────────────────────────── +# 5. STREAM Y MAIN LOOP (Standalone) +# ────────────────────────────────────────────────────────────────────────────── +class CamStream: + def __init__(self, url): + self.url, self.cap = url, cv2.VideoCapture(url) + self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1); self.frame = None + threading.Thread(target=self._run, daemon=True).start() + + def _run(self): + while True: + ret, f = self.cap.read() + if ret: + self.frame = f; time.sleep(0.01) + else: + time.sleep(2); self.cap.open(self.url) + +def dibujar_track(frame_show, trk): + try: x1, y1, x2, y2 = map(int, trk.box) + except Exception: return + + if trk.gid is None: color, label = C_CANDIDATO, f"?{trk.local_id}" + elif trk.en_grupo: color, label = C_GRUPO, f"ID:{trk.gid} [grp]" + elif trk.aprendiendo: color, label = C_APRENDIZAJE, f"ID:{trk.gid} [++]" + elif trk.origen_global: color, label = C_GLOBAL, f"ID:{trk.gid} [re-id]" + else: color, label = C_LOCAL, f"ID:{trk.gid}" + + cv2.rectangle(frame_show, (x1, y1), (x2, y2), color, 2) + (tw, th), _ = cv2.getTextSize(label, FUENTE, 0.55, 1) + cv2.rectangle(frame_show, (x1, y1-th-6), (x1+tw+2, y1), color, -1) + cv2.putText(frame_show, label, (x1+1, y1-4), FUENTE, 0.55, (0,0,0), 1) + +def main(): + print("Iniciando Sistema V-PRO — Tracker Resiliente (Código Unificado Maestro)") + model = YOLO("yolov8n.pt") + global_mem = GlobalMemory() + managers = {str(c): CamManager(c, global_mem) for c in SECUENCIA} + cams = [CamStream(u) for u in URLS] + cv2.namedWindow("SmartSoft", cv2.WINDOW_AUTOSIZE) + + idx = 0 + while True: + now = time.time() + tiles = [] + cam_ia = idx % len(cams) + for i, cam_obj in enumerate(cams): + frame = cam_obj.frame; cid = str(SECUENCIA[i]) + if frame is None: tiles.append(np.zeros((270, 480, 3), np.uint8)); continue + frame_show = cv2.resize(frame.copy(), (480, 270)); boxes = []; turno_activo = (i == cam_ia) + if turno_activo: + res = model.predict(frame_show, conf=0.50, iou=0.40, classes=[0], verbose=False, imgsz=480, device='cpu') + if res[0].boxes: boxes = res[0].boxes.xyxy.cpu().numpy().tolist() + tracks = managers[cid].update(boxes, frame_show, now, turno_activo) + for trk in tracks: + if trk.time_since_update <= 1: dibujar_track(frame_show, trk) + if turno_activo: cv2.circle(frame_show, (460, 20), 6, (0, 0, 255), -1) + con_id = sum(1 for t in tracks if t.gid and t.time_since_update==0) + cv2.putText(frame_show, f"CAM {cid} [{con_id} ID]", (10, 28), FUENTE, 0.7, (255, 255, 255), 2) + tiles.append(frame_show) + + if len(tiles) == 6: cv2.imshow("SmartSoft", np.vstack([np.hstack(tiles[0:3]), np.hstack(tiles[3:6])])) + idx += 1 + if cv2.waitKey(1) == ord('q'): break + cv2.destroyAllWindows() + +if __name__ == "__main__": + main() + + + + + + + + + + +############################################################### fusion.py +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' +os.environ['CUDA_VISIBLE_DEVICES'] = '-1' +os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp|stimeout;3000000" +import cv2 +import numpy as np +import time +import threading +from queue import Queue +from deepface import DeepFace +from ultralytics import YOLO +import warnings + +warnings.filterwarnings("ignore") + +# ────────────────────────────────────────────────────────────────────────────── +# 1. IMPORTAMOS NUESTROS MÓDULOS +# ────────────────────────────────────────────────────────────────────────────── +# Del motor matemático y tracking +from seguimiento2 import GlobalMemory, CamManager, SECUENCIA, URLS, FUENTE, similitud_hibrida + +# Del motor de reconocimiento facial y audio +from reconocimiento2 import ( + gestionar_vectores, + detectar_rostros_yunet, + buscar_mejor_match, + hilo_bienvenida, + UMBRAL_SIM, + COOLDOWN_TIME +) + +# ────────────────────────────────────────────────────────────────────────────── +# 2. PROTECCIONES MULTIHILO E INICIALIZACIÓN +# ────────────────────────────────────────────────────────────────────────────── +COLA_ROSTROS = Queue(maxsize=4) +YUNET_LOCK = threading.Lock() +IA_LOCK = threading.Lock() + +# Inicializamos la base de datos usando tu función importada +print("\nIniciando carga de base de datos...") +BASE_DATOS_ROSTROS = gestionar_vectores(actualizar=True) + +# ────────────────────────────────────────────────────────────────────────────── +# 3. MOTOR ASÍNCRONO +# ────────────────────────────────────────────────────────────────────────────── +def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): + """ Toma el recorte del tracker, escala a Alta Definición, usa YuNet y hace la Fusión Mágica """ + try: + if not BASE_DATOS_ROSTROS: return + + # ────────────────────────────────────────────────────────── + # 1. VALIDACIÓN DEL FRAME HD Y ESCALADO MATEMÁTICO + # ────────────────────────────────────────────────────────── + h_real, w_real = frame_hd.shape[:2] + + # ⚡ TRAMPA ANTI-BUGS: Si esto salta, corrige la llamada en tu main_fusion.py + if w_real <= 480: + print(f"[❌ ERROR CAM {cam_id}] Le estás pasando el frame_show (480x270) a ArcFace, no el HD.") + + escala_x = w_real / 480.0 + escala_y = h_real / 270.0 + + x_min, y_min, x_max, y_max = box_480 + h_box = y_max - y_min + + y_min_expandido = max(0, y_min - (h_box * 0.15)) + y_max_cabeza = min(270, y_min + (h_box * 0.40)) # Límite máximo en la escala de 270 + + x1_hd = int(max(0, x_min) * escala_x) + y1_hd = int(y_min_expandido * escala_y) + x2_hd = int(min(480, x_max) * escala_x) + y2_hd = int(y_max_cabeza * escala_y) + + roi_cabeza = frame_hd[y1_hd:y2_hd, x1_hd:x2_hd] + + # Si la cabeza HD mide menos de 60x60, está demasiado lejos incluso en HD + if roi_cabeza.size == 0 or roi_cabeza.shape[0] < 60 or roi_cabeza.shape[1] < 60: + return + + h_roi, w_roi = roi_cabeza.shape[:2] + + # ────────────────────────────────────────────────────────── + # 2. DETECCIÓN DE ROSTRO CON YUNET (Ahora operando en HD) + # ────────────────────────────────────────────────────────── + faces = detectar_rostros_yunet(roi_cabeza, lock=YUNET_LOCK) + + for (rx, ry, rw, rh, score) in faces: + rx, ry = max(0, rx), max(0, ry) + rw, rh = min(w_roi - rx, rw), min(h_roi - ry, rh) + + area_rostro_actual = rw * rh + + with global_mem.lock: + data = global_mem.db.get(gid, {}) + nombre_actual = data.get('nombre') + area_ref = data.get('area_rostro_ref', 0) + + necesita_saludo = False + if str(cam_id) == "7": + if not hasattr(global_mem, 'ultimos_saludos'): + global_mem.ultimos_saludos = {} + ultimo = global_mem.ultimos_saludos.get(nombre_actual if nombre_actual else "", 0) + if (time.time() - ultimo) > COOLDOWN_TIME: + necesita_saludo = True + + if nombre_actual is None or area_rostro_actual >= (area_ref * 1.5) or necesita_saludo: + + # ⚡ MÁRGENES MÁS AMPLIOS: ArcFace necesita ver frente y barbilla (25%) + m_x = int(rw * 0.25) + m_y = int(rh * 0.25) + + roi_rostro = roi_cabeza[max(0, ry-m_y):min(h_roi, ry+rh+m_y), + max(0, rx-m_x):min(w_roi, rx+rw+m_x)] + + if roi_rostro.size == 0 or roi_rostro.shape[0] < 60 or roi_rostro.shape[1] < 60: + continue + + # ⚡ Laplaciano ajustado para imágenes HD (30.0 es más justo) + gray_roi = cv2.cvtColor(roi_rostro, cv2.COLOR_BGR2GRAY) + nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() + if nitidez < 15.0: + continue + + # ────────────────────────────────────────────────────────── + # 3. RECONOCIMIENTO FACIAL ARCFACE + # ────────────────────────────────────────────────────────── + with IA_LOCK: + try: + # ⚡ CAMBIO DRÁSTICO: Usamos RetinaFace para alinear la cabeza obligatoriamente. + # Si RetinaFace no logra enderezar la cara (ej. estás totalmente de perfil), + # lanzará una excepción y abortará, evitando falsos positivos. + # Así DEBE estar en main_fusion.py para que sea compatible con tu nueva DB + res = DeepFace.represent( + img_path=roi_cabeza, + model_name="ArcFace", + detector_backend="retinaface", # Obligatorio + align=True, # Obligatorio + enforce_detection=True # Obligatorio + ) + emb = np.array(res[0]["embedding"], dtype=np.float32) + mejor_match, max_sim = buscar_mejor_match(emb, BASE_DATOS_ROSTROS) + except Exception: + # Si falla la alineación o estás muy borroso, lo ignoramos en silencio. + continue + + print(f"[DEBUG CAM {cam_id}] ArcFace: {mejor_match} al {max_sim:.2f} (Umbral: {UMBRAL_SIM})") + + if max_sim >= UMBRAL_SIM and mejor_match: + nombre_limpio = mejor_match.split('_')[0] + + with global_mem.lock: + global_mem.db[gid]['nombre'] = nombre_limpio + global_mem.db[gid]['area_rostro_ref'] = area_rostro_actual + global_mem.db[gid]['ts'] = time.time() + + ids_a_borrar = [] + firma_actual = global_mem.db[gid]['firmas'][0] if global_mem.db[gid]['firmas'] else None + + for otro_gid, datos_otro in list(global_mem.db.items()): + if otro_gid == gid: continue + + if datos_otro.get('nombre') == nombre_limpio: + ids_a_borrar.append(otro_gid) + + elif datos_otro.get('nombre') is None and firma_actual and datos_otro['firmas']: + sim_huerfano = similitud_hibrida(firma_actual, datos_otro['firmas'][0]) + if sim_huerfano > 0.75: + ids_a_borrar.append(otro_gid) + + for id_basura in ids_a_borrar: + del global_mem.db[id_basura] + print(f"[🧹 LIMPIEZA] ID huérfano/clon {id_basura} eliminado tras reconocer a {nombre_limpio}.") + + if str(cam_id) == "7" and necesita_saludo: + global_mem.ultimos_saludos[nombre_limpio] = time.time() + try: + with IA_LOCK: + analisis = DeepFace.analyze(roi_rostro, actions=['gender'], enforce_detection=False)[0] + genero = analisis.get('dominant_gender', 'Man') + except Exception: + genero = "Man" + + threading.Thread(target=hilo_bienvenida, args=(nombre_limpio, genero), daemon=True).start() + break + except Exception as e: + pass + finally: + trk.procesando_rostro = False + +def worker_rostros(global_mem): + """ Consumidor de la cola multihilo """ + while True: + frame, box, gid, cam_id, trk = COLA_ROSTROS.get() + procesar_rostro_async(frame, box, gid, cam_id, global_mem, trk) + COLA_ROSTROS.task_done() + +# ────────────────────────────────────────────────────────────────────────────── +# 4. LOOP PRINCIPAL DE FUSIÓN +# ────────────────────────────────────────────────────────────────────────────── +class CamStream: + def __init__(self, url): + self.url = url + self.cap = cv2.VideoCapture(url) + self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) + self.frame = None + threading.Thread(target=self._run, daemon=True).start() + + def _run(self): + while True: + ret, f = self.cap.read() + if ret: + self.frame = f + time.sleep(0.01) + else: + time.sleep(2) + self.cap.open(self.url) + +def dibujar_track_fusion(frame_show, trk, global_mem): + try: x1, y1, x2, y2 = map(int, trk.box) + except Exception: return + + nombre_str = "" + if trk.gid is not None: + with global_mem.lock: + nombre = global_mem.db.get(trk.gid, {}).get('nombre') + if nombre: nombre_str = f" [{nombre}]" + + if trk.gid is None: color, label = (150, 150, 150), f"?{trk.local_id}" + elif nombre_str: color, label = (255, 0, 255), f"ID:{trk.gid}{nombre_str}" + elif trk.en_grupo: color, label = (0, 0, 255), f"ID:{trk.gid} [grp]" + elif trk.aprendiendo: color, label = (255, 255, 0), f"ID:{trk.gid} [++]" + elif trk.origen_global: color, label = (0, 165, 255), f"ID:{trk.gid} [re-id]" + else: color, label = (0, 255, 0), f"ID:{trk.gid}" + + cv2.rectangle(frame_show, (x1, y1), (x2, y2), color, 2) + (tw, th), _ = cv2.getTextSize(label, FUENTE, 0.55, 1) + cv2.rectangle(frame_show, (x1, y1-th-6), (x1+tw+2, y1), color, -1) + cv2.putText(frame_show, label, (x1+1, y1-4), FUENTE, 0.55, (0,0,0), 1) + +def main(): + print("\nIniciando Sistema") + model = YOLO("yolov8n.pt") + global_mem = GlobalMemory() + managers = {str(c): CamManager(c, global_mem) for c in SECUENCIA} + cams = [CamStream(u) for u in URLS] + + for _ in range(2): + threading.Thread(target=worker_rostros, args=(global_mem,), daemon=True).start() + + cv2.namedWindow("SmartSoft", cv2.WINDOW_AUTOSIZE) + idx = 0 + + while True: + now = time.time() + tiles = [] + cam_ia = idx % len(cams) + + for i, cam_obj in enumerate(cams): + frame = cam_obj.frame; cid = str(SECUENCIA[i]) + if frame is None: + tiles.append(np.zeros((270, 480, 3), np.uint8)) + continue + + frame_show = cv2.resize(frame.copy(), (480, 270)) + boxes = [] + turno_activo = (i == cam_ia) + + if turno_activo: + res = model.predict(frame_show, conf=0.50, iou=0.50, classes=[0], verbose=False, imgsz=480) + if res[0].boxes: + boxes = res[0].boxes.xyxy.cpu().numpy().tolist() + + tracks = managers[cid].update(boxes, frame_show, now, turno_activo) + + for trk in tracks: + if trk.time_since_update <= 1: + dibujar_track_fusion(frame_show, trk, global_mem) + + if turno_activo and trk.gid is not None and not getattr(trk, 'procesando_rostro', False): + if not COLA_ROSTROS.full(): + trk.procesando_rostro = True + COLA_ROSTROS.put((frame.copy(), trk.box, trk.gid, cid, trk)) + + if turno_activo: cv2.circle(frame_show, (460, 20), 6, (0, 0, 255), -1) + + con_id = sum(1 for t in tracks if t.gid and t.time_since_update==0) + cv2.putText(frame_show, f"CAM {cid} [{con_id} ID]", (10, 28), FUENTE, 0.7, (255, 255, 255), 2) + tiles.append(frame_show) + + if len(tiles) == 6: + cv2.imshow("SmartSoft Fusion", np.vstack([np.hstack(tiles[0:3]), np.hstack(tiles[3:6])])) + + idx += 1 + if cv2.waitKey(1) == ord('q'): + break + + cv2.destroyAllWindows() + +if __name__ == "__main__": + main() + + + + + + + + + + + + + + + + + + + +################################################################### reconocimeito2.py + +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' +os.environ['CUDA_VISIBLE_DEVICES'] = '-1' + +import cv2 +import numpy as np +from deepface import DeepFace +import pickle +import time +import threading +import asyncio +import edge_tts +import subprocess +from datetime import datetime +import warnings +import urllib.request + +warnings.filterwarnings("ignore") + +# ────────────────────────────────────────────────────────────────────────────── +# CONFIGURACIÓN +# ────────────────────────────────────────────────────────────────────────────── +DB_PATH = "db_institucion" +CACHE_PATH = "cache_nombres" +VECTORS_FILE = "base_datos_rostros.pkl" +TIMESTAMPS_FILE = "representaciones_timestamps.pkl" +UMBRAL_SIM = 0.45 # Por encima → identificado. Por debajo → desconocido. +COOLDOWN_TIME = 15 # Segundos entre saludos + +USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.65" +RTSP_URL = f"rtsp://{USUARIO}:{PASSWORD}@{IP_DVR}:554/Streaming/Channels/702" + +for path in [DB_PATH, CACHE_PATH]: + os.makedirs(path, exist_ok=True) + +# ────────────────────────────────────────────────────────────────────────────── +# YUNET — Detector facial rápido en CPU +# ────────────────────────────────────────────────────────────────────────────── +YUNET_MODEL_PATH = "face_detection_yunet_2023mar.onnx" + +if not os.path.exists(YUNET_MODEL_PATH): + print(f"Descargando YuNet ({YUNET_MODEL_PATH})...") + url = ("https://github.com/opencv/opencv_zoo/raw/main/models/" + "face_detection_yunet/face_detection_yunet_2023mar.onnx") + urllib.request.urlretrieve(url, YUNET_MODEL_PATH) + print("YuNet descargado.") + +# Detector estricto para ROIs grandes (persona cerca) +detector_yunet = cv2.FaceDetectorYN.create( + model=YUNET_MODEL_PATH, config="", + input_size=(320, 320), + score_threshold=0.70, + nms_threshold=0.3, + top_k=5000 +) + +# Detector permisivo para ROIs pequeños (persona lejos) +detector_yunet_lejano = cv2.FaceDetectorYN.create( + model=YUNET_MODEL_PATH, config="", + input_size=(320, 320), + score_threshold=0.45, + nms_threshold=0.3, + top_k=5000 +) + +def detectar_rostros_yunet(roi, lock=None): + """ + Elige automáticamente el detector según el tamaño del ROI. + """ + h_roi, w_roi = roi.shape[:2] + area = w_roi * h_roi + det = detector_yunet if area > 8000 else detector_yunet_lejano + + try: + if lock: + with lock: + det.setInputSize((w_roi, h_roi)) + _, faces = det.detect(roi) + else: + det.setInputSize((w_roi, h_roi)) + _, faces = det.detect(roi) + except Exception: + return [] + + if faces is None: + return [] + + resultado = [] + for face in faces: + try: + fx, fy, fw, fh = map(int, face[:4]) + score = float(face[14]) if len(face) > 14 else 1.0 + resultado.append((fx, fy, fw, fh, score)) + except (ValueError, OverflowError, TypeError): + continue + return resultado + + +# ────────────────────────────────────────────────────────────────────────────── +# SISTEMA DE AUDIO +# ────────────────────────────────────────────────────────────────────────────── +def obtener_audios_humanos(genero): + hora = datetime.now().hour + es_mujer = genero.lower() == 'woman' + suffix = "_m.mp3" if es_mujer else "_h.mp3" + if 5 <= hora < 12: + intro = "dias.mp3" + elif 12 <= hora < 19: + intro = "tarde.mp3" + else: + intro = "noches.mp3" + cierre = ("fin_noche" if (hora >= 19 or hora < 5) else "fin_dia") + suffix + return intro, cierre + + +async def sintetizar_nombre(nombre, ruta): + nombre_limpio = nombre.replace('_', ' ') + try: + comunicador = edge_tts.Communicate(nombre_limpio, "es-MX-DaliaNeural", rate="+10%") + await comunicador.save(ruta) + except Exception: + pass + + +def reproducir(archivo): + if os.path.exists(archivo): + subprocess.Popen( + ["mpv", "--no-video", "--volume=100", archivo], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + +def hilo_bienvenida(nombre, genero): + archivo_nombre = os.path.join(CACHE_PATH, f"nombre_{nombre}.mp3") + + if not os.path.exists(archivo_nombre): + try: + asyncio.run(sintetizar_nombre(nombre, archivo_nombre)) + except Exception: + pass + + intro, cierre = obtener_audios_humanos(genero) + + archivos = [f for f in [intro, archivo_nombre, cierre] if os.path.exists(f)] + if archivos: + subprocess.Popen( + ["mpv", "--no-video", "--volume=100"] + archivos, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + +# ────────────────────────────────────────────────────────────────────────────── +# GESTIÓN DE BASE DE DATOS (AHORA CON RETINAFACE Y ALINEACIÓN) +# ────────────────────────────────────────────────────────────────────────────── +def gestionar_vectores(actualizar=False): + vectores_actuales = {} + + if os.path.exists(VECTORS_FILE): + try: + with open(VECTORS_FILE, 'rb') as f: + vectores_actuales = pickle.load(f) + except Exception: + vectores_actuales = {} + + if not actualizar: + return vectores_actuales + + timestamps = {} + if os.path.exists(TIMESTAMPS_FILE): + try: + with open(TIMESTAMPS_FILE, 'rb') as f: + timestamps = pickle.load(f) + except Exception: + timestamps = {} + + print("\nACTUALIZANDO BASE DE DATOS (Alineación con RetinaFace)...") + imagenes = [f for f in os.listdir(DB_PATH) if f.lower().endswith(('.jpg', '.png'))] + nombres_en_disco = set() + hubo_cambios = False + + for archivo in imagenes: + nombre_archivo = os.path.splitext(archivo)[0] + ruta_img = os.path.join(DB_PATH, archivo) + nombres_en_disco.add(nombre_archivo) + + ts_actual = os.path.getmtime(ruta_img) + ts_guardado = timestamps.get(nombre_archivo, 0) + + if nombre_archivo in vectores_actuales and ts_actual == ts_guardado: + continue + + try: + # ⚡ MAGIA 1: RetinaFace alinea matemáticamente los rostros de la base de datos + res = DeepFace.represent( + img_path=ruta_img, + model_name="ArcFace", + detector_backend="retinaface", # Localiza ojos/nariz + align=True, # Rota la imagen para alinear + enforce_detection=True # Obliga a que haya cara válida + ) + emb = np.array(res[0]["embedding"], dtype=np.float32) + + # ⚡ MAGIA 2: Normalización L2 al guardar (Elimina el "Efecto Rosa María") + norma = np.linalg.norm(emb) + if norma > 0: + emb = emb / norma + + vectores_actuales[nombre_archivo] = emb + timestamps[nombre_archivo] = ts_actual + hubo_cambios = True + print(f" ✅ Procesado y alineado: {nombre_archivo}") + + except Exception as e: + print(f" ❌ Rostro no válido en '{archivo}', omitido. Error: {e}") + + for nombre in list(vectores_actuales.keys()): + if nombre not in nombres_en_disco: + del vectores_actuales[nombre] + timestamps.pop(nombre, None) + hubo_cambios = True + print(f" 🗑️ Eliminado (sin foto): {nombre}") + + if hubo_cambios: + with open(VECTORS_FILE, 'wb') as f: + pickle.dump(vectores_actuales, f) + with open(TIMESTAMPS_FILE, 'wb') as f: + pickle.dump(timestamps, f) + print(" Sincronización terminada.\n") + else: + print(" Sin cambios. Base de datos al día.\n") + + return vectores_actuales + +# ────────────────────────────────────────────────────────────────────────────── +# BÚSQUEDA BLINDADA (Similitud Coseno estricta) +# ────────────────────────────────────────────────────────────────────────────── +def buscar_mejor_match(emb_consulta, base_datos): + # ⚡ MAGIA 3: Normalización L2 del vector entrante + norma = np.linalg.norm(emb_consulta) + if norma > 0: + emb_consulta = emb_consulta / norma + + mejor_match, max_sim = None, -1.0 + for nombre, vec in base_datos.items(): + # Como ambos están normalizados, esto es Similitud Coseno pura (-1.0 a 1.0) + sim = float(np.dot(emb_consulta, vec)) + if sim > max_sim: + max_sim = sim + mejor_match = nombre + + return mejor_match, max_sim + +# ────────────────────────────────────────────────────────────────────────────── +# LOOP DE PRUEBA Y REGISTRO +# ────────────────────────────────────────────────────────────────────────────── +def sistema_interactivo(): + base_datos = gestionar_vectores(actualizar=False) + cap = cv2.VideoCapture(RTSP_URL) + ultimo_saludo = 0 + persona_actual = None + confirmaciones = 0 + + print("\n" + "=" * 50) + print(" MÓDULO DE REGISTRO Y DEPURACIÓN") + print(" [R] Registrar nuevo rostro | [Q] Salir") + print("=" * 50 + "\n") + + faces_ultimo_frame = [] + + while True: + ret, frame = cap.read() + if not ret: + time.sleep(2) + cap.open(RTSP_URL) + continue + + h, w = frame.shape[:2] + display_frame = frame.copy() + tiempo_actual = time.time() + + faces_raw = detectar_rostros_yunet(frame) + faces_ultimo_frame = faces_raw + + for (fx, fy, fw, fh, score_yunet) in faces_raw: + fx = max(0, fx); fy = max(0, fy) + fw = min(w - fx, fw); fh = min(h - fy, fh) + if fw <= 0 or fh <= 0: + continue + + cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (255, 200, 0), 2) + cv2.putText(display_frame, f"YN:{score_yunet:.2f}", + (fx, fy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 200, 0), 1) + + if (tiempo_actual - ultimo_saludo) <= COOLDOWN_TIME: + continue + + m = int(fw * 0.15) + roi = frame[max(0, fy-m): min(h, fy+fh+m), + max(0, fx-m): min(w, fx+fw+m)] + + if roi.size == 0 or roi.shape[0] < 40 or roi.shape[1] < 40: + cv2.putText(display_frame, "muy pequeño", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 100, 255), 1) + continue + + gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) + nitidez = cv2.Laplacian(gray_roi, cv2.CV_64F).var() + if nitidez < 50.0: + cv2.putText(display_frame, f"blur({nitidez:.0f})", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 165, 255), 1) + continue + + try: + # ⚡ En el modo de prueba interactivo usamos las reglas viejas + # para que sea rápido y puedas registrar fotos fácilmente. + res = DeepFace.represent( + img_path=roi, model_name="ArcFace", enforce_detection=False + ) + emb = np.array(res[0]["embedding"], dtype=np.float32) + mejor_match, max_sim = buscar_mejor_match(emb, base_datos) + + except Exception as e: + print(f"[ERROR ArcFace]: {e}") + continue + + estado = " IDENTIFICADO" if max_sim > UMBRAL_SIM else "DESCONOCIDO" + nombre_d = mejor_match.split('_')[0] if mejor_match else "nadie" + n_bloques = int(max_sim * 20) + barra = "█" * n_bloques + "░" * (20 - n_bloques) + print(f"[REGISTRO] {estado} | {nombre_d:<14} | {barra} | " + f"{max_sim*100:.1f}% (umbral: {UMBRAL_SIM*100:.0f}%)") + + if max_sim > UMBRAL_SIM and mejor_match: + color = (0, 255, 0) + texto = f"{mejor_match.split('_')[0]} ({max_sim:.2f})" + + if mejor_match == persona_actual: + confirmaciones += 1 + else: + persona_actual, confirmaciones = mejor_match, 1 + + if confirmaciones >= 2: + cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 3) + try: + analisis = DeepFace.analyze( + roi, actions=['gender'], enforce_detection=False + )[0] + genero = analisis['dominant_gender'] + except Exception: + genero = "Man" + + threading.Thread( + target=hilo_bienvenida, + args=(mejor_match, genero), + daemon=True + ).start() + ultimo_saludo = tiempo_actual + confirmaciones = 0 + + else: + color = (0, 0, 255) + texto = f"? ({max_sim:.2f})" + confirmaciones = max(0, confirmaciones - 1) + + cv2.putText(display_frame, texto, + (fx, fy - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) + + cv2.imshow("Módulo de Registro", display_frame) + key = cv2.waitKey(1) & 0xFF + + if key == ord('q'): + break + + elif key == ord('r'): + if faces_ultimo_frame: + areas = [fw * fh for (fx, fy, fw, fh, _) in faces_ultimo_frame] + fx, fy, fw, fh, _ = faces_ultimo_frame[np.argmax(areas)] + + # Le damos más margen al registro (30%) para que RetinaFace no falle + # cuando procese la foto en la carpeta. + m_x = int(fw * 0.30) + m_y = int(fh * 0.30) + face_roi = frame[max(0, fy-m_y): min(h, fy+fh+m_y), + max(0, fx-m_x): min(w, fx+fw+m_x)] + + if face_roi.size > 0: + nom = input("\nNombre de la persona: ").strip() + if nom: + foto_path = os.path.join(DB_PATH, f"{nom}.jpg") + cv2.imwrite(foto_path, face_roi) + print(f"[OK] Rostro de '{nom}' guardado. Sincronizando...") + # ⚡ Al sincronizar, RetinaFace alineará esta foto guardada. + base_datos = gestionar_vectores(actualizar=True) + else: + print("[!] Registro cancelado.") + else: + print("[!] Recorte vacío. Intenta de nuevo.") + else: + print("\n[!] No se detectó rostro. Acércate más o mira a la lente.") + + cap.release() + cv2.destroyAllWindows() + +if __name__ == "__main__": + sistema_interactivo()