02-ago: [proyecto] vigilancia - reconocimiento facial (YuNet+ArcFace) y corporal (ResNet18) + registro por webcam (enroll.py) + integracion en main.py

This commit is contained in:
minguezsanzjuanjose
2026-08-02 13:31:37 +02:00
parent 75de5c613f
commit bef38fb673
4 changed files with 359 additions and 11 deletions

View File

@@ -9,10 +9,45 @@ from camara import CamaraRTSP
from detector_movimiento import DetectorMovimiento
from notificador import disparar_webhook_alexa, enviar_telegram
USAR_YOLO = False
USAR_YOLO = True
identificador = None
if USAR_YOLO:
from detector_persona import DetectorPersona
def cargar_identificador():
global identificador
if identificador is None:
try:
from reconocedor import CONOCIDOS, Reconocedor, os as _os
if _os.path.isdir(CONOCIDOS) and any(
_os.path.isdir(_os.path.join(CONOCIDOS, n))
for n in _os.listdir(CONOCIDOS)
):
identificador = Reconocedor()
print(f"Identificacion activa. Conocidos: "
f"{list(identificador.conocidos.keys())}")
else:
print("Sin conocidos registrados (ejecuta enroll.py). "
"Modo deteccion simple.")
except Exception as e:
print(f"No se pudo cargar identificador: {e}")
return identificador
def componer_alerta(resultados, cam_nombre, ts):
conocidas = sorted({r["nombre"] for r in resultados if "nombre" in r})
desconocidas = sum(1 for r in resultados if r.get("desconocido"))
if conocidas and desconocidas:
return (f"👧 {', '.join(conocidas)} | "
f"⚠️ {desconocidas} persona(s) desconocida(s) "
f"en {cam_nombre} - {ts}")
if conocidas:
return (f"👧 {', '.join(conocidas)} detectada(s) "
f"en {cam_nombre} - {ts}")
if desconocidas:
return (f"⚠️ {desconocidas} persona(s) desconocida(s) "
f"en {cam_nombre} - {ts}")
return f"🚨 Movimiento en {cam_nombre} - {ts}"
def dentro_de_franja_horaria(hora_actual=None) -> bool:
@@ -37,9 +72,11 @@ def main():
ultima_alerta = {}
for i, c in enumerate(config.CAMARAS):
detectores.append(DetectorPersona() if USAR_YOLO else DetectorMovimiento())
detectores.append(DetectorMovimiento())
ultima_alerta[i] = 0
ident = cargar_identificador()
print("Sistema de vigilancia iniciado. Franja activa: "
f"{config.HORA_INICIO}:00 - {config.HORA_FIN}:00")
@@ -54,10 +91,7 @@ def main():
continue
detector = detectores[i]
detectado = (
detector.hay_persona(frame) if USAR_YOLO
else detector.hay_movimiento(frame)
)
detectado = detector.hay_movimiento(frame)
ahora = time.time()
if detectado and (ahora - ultima_alerta[i] > config.COOLDOWN):
@@ -65,6 +99,16 @@ def main():
ruta = os.path.join(
config.SNAPSHOT_DIR, f"snapshot_{cam.nombre}_{ts}.jpg"
)
texto = f"🚨 Movimiento en {cam.nombre} - {ts}"
if ident is not None:
try:
resultados = ident.analizar_frame(frame)
if resultados:
texto = componer_alerta(resultados, cam.nombre, ts)
except Exception as e:
print(f"[{cam.nombre}] Error identificando: {e}")
cv2_ok = True
try:
cv2.imwrite(ruta, frame)
@@ -72,9 +116,6 @@ def main():
cv2_ok = False
print(f"[{cam.nombre}] Error guardando snapshot: {e}")
tipo = "persona" if USAR_YOLO else "movimiento"
texto = f"⚠️ Detección de {tipo} en {cam.nombre} - {ts}"
if cv2_ok:
enviar_telegram(ruta, texto)
disparar_webhook_alexa(texto)