From 6bc9a5cb4438f982696af5ea7a2488e3af109729 Mon Sep 17 00:00:00 2001 From: rodrigo Date: Wed, 8 Apr 2026 10:05:57 -0600 Subject: [PATCH] Actualizacion del modelo para la deteccion del rostro, modificacion en la identificacion del genero con ello el mensaje que de recibimiento, modificacion de umbrales para el seguimineto, aplicacion de fusion de IDs similares al detectar el rostro, guardar versiones seguras --- base_datos_rostros.pkl | Bin 61190 -> 54729 bytes cache_nombres/generos.json | 2 +- cache_nombres/nombre_Adriana Lopez.mp3 | Bin 0 -> 11664 bytes cache_nombres/nombre_Ana Karen Guerrero.mp3 | Bin 0 -> 11664 bytes cache_nombres/nombre_Oscar Atriano Ponce.mp3 | Bin 0 -> 12384 bytes db_institucion/Aridai Montiel.jpg | Bin 4897 -> 0 bytes db_institucion/Diana laura.jpg | Bin 4266 -> 0 bytes db_institucion/Rodrigo C.jpg | Bin 5077 -> 0 bytes db_institucion/Rodrigo c.jpg | Bin 23601 -> 0 bytes db_institucion/Victor.jpg | Bin 0 -> 6341 bytes fision1.py | 420 +++++++++++++++ fusion.py | 10 +- reconocimiento.py | 378 +++++++++++++ reconocimiento2.py | 4 +- representaciones_timestamps.pkl | Bin 764 -> 691 bytes seguimiento2.py | 525 ++++++++++++++----- 16 files changed, 1186 insertions(+), 153 deletions(-) create mode 100644 cache_nombres/nombre_Adriana Lopez.mp3 create mode 100644 cache_nombres/nombre_Ana Karen Guerrero.mp3 create mode 100644 cache_nombres/nombre_Oscar Atriano Ponce.mp3 delete mode 100644 db_institucion/Aridai Montiel.jpg delete mode 100644 db_institucion/Diana laura.jpg delete mode 100644 db_institucion/Rodrigo C.jpg delete mode 100644 db_institucion/Rodrigo c.jpg create mode 100644 db_institucion/Victor.jpg create mode 100644 fision1.py create mode 100644 reconocimiento.py diff --git a/base_datos_rostros.pkl b/base_datos_rostros.pkl index a269f81206fde91af090421e690ae09a82fdc27b..3db050b5b2ef6637f7e2a2899046e7a68297ccbe 100644 GIT binary patch literal 54729 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 E0RvcmNB{r; diff --git a/cache_nombres/generos.json b/cache_nombres/generos.json index 6442f12..78659c4 100644 --- a/cache_nombres/generos.json +++ b/cache_nombres/generos.json @@ -1 +1 @@ -{"Emanuel Flores": "Man", "Vikicar Aldana": "Man", "Cristian Hernandez Suarez": "Man", "Oscar Atriano Ponce_1": "Man", "Carlos Eduardo Cuamatzi": "Man", "Rosa maria": "Woman", "Ximena": "Woman", "Ana Karen Guerrero": "Woman", "Diana laura": "Woman", "Diana Laura": "Woman", "Diana Laura Tecpa": "Woman", "aridai montiel zistecatl": "Woman", "Aridai montiel": "Woman", "Vikicar": "Man", "Ian Axel": "Man", "Rafael": "Man", "Rubisela Barrientos": "Woman", "ian axel": "Man", "Aridai Montiel": "Woman", "Adriana Lopez": "Man", "Oscar Atriano Ponce": "Man", "Xayli Ximena": "Man", "Victor Manuel Ocampo Mendez": "Man", "Rodrigo C": "Man", "Rodrigo Cahuantzi C": "Man", "Rodrigo c": "Man", "Yuriel": "Man", "Miguel Angel": "Man", "Omar": "Man"} \ No newline at end of file +{"Emanuel Flores": "Man", "Vikicar Aldana": "Woman", "Rodrigo Cahuantzi C": "Man", "Cristian Hernandez Suarez": "Man", "Omar": "Man", "Oscar Atriano Ponce_1": "Man", "Miguel Angel": "Man", "Carlos Eduardo Cuamatzi": "Man", "Rosa maria": "Woman", "Ximena": "Woman", "Ana Karen Guerrero": "Woman", "Yuriel": "Man", "Diana Laura": "Woman", "Diana Laura Tecpa": "Woman", "aridai montiel zistecatl": "Woman", "Aridai montiel": "Woman", "Vikicar": "Woman", "Ian Axel": "Man", "Rafael": "Man", "Rubisela Barrientos": "Woman", "ian axel": "Man", "Adriana Lopez": "Woman", "Oscar Atriano Ponce": "Man", "Xayli Ximena": "Woman", "Victor Manuel Ocampo Mendez": "Man", "Victor": "Man"} \ No newline at end of file diff --git a/cache_nombres/nombre_Adriana Lopez.mp3 b/cache_nombres/nombre_Adriana Lopez.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e15c8759e465ea378d2841613162369950debdec GIT binary patch literal 11664 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 Rzwck4zwiHtKL0QGKLC6V4oUz3 literal 0 HcmV?d00001 diff --git a/cache_nombres/nombre_Ana Karen Guerrero.mp3 b/cache_nombres/nombre_Ana Karen Guerrero.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8f54ef5f6244a71dcd22ec395dbc7a01e315aa6f GIT binary patch literal 11664 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 DXXoqH literal 0 HcmV?d00001 diff --git a/cache_nombres/nombre_Oscar Atriano Ponce.mp3 b/cache_nombres/nombre_Oscar Atriano Ponce.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..be4141f9dbfd186b32c5f0987eca5d267e1063e6 GIT binary patch literal 12384 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 a+vnf+x6i-tZ=ZkP-#-7o|Ekab&;1A2ZNEhT literal 0 HcmV?d00001 diff --git a/db_institucion/Aridai Montiel.jpg b/db_institucion/Aridai Montiel.jpg deleted file mode 100644 index 1f334a53f6f6a68ed0f1005b9e2cfa062138f819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4897 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 M?C!$iFnQ_U0iBw3DF6Tf diff --git a/db_institucion/Diana laura.jpg b/db_institucion/Diana laura.jpg deleted file mode 100644 index 33b003eecca27e988c0fbf281fa7724eac63dec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4266 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 diff --git a/db_institucion/Rodrigo c.jpg b/db_institucion/Rodrigo c.jpg deleted file mode 100644 index ccfa3b85489347aa3084c3fd63a75f6cd8d2f879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23601 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 Dw>mz` literal 0 HcmV?d00001 diff --git a/fision1.py b/fision1.py new file mode 100644 index 0000000..f99ef2b --- /dev/null +++ b/fision1.py @@ -0,0 +1,420 @@ +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" + +# ⚑ NUEVOS CANDADOS: Silenciamos la burocracia de OpenCV y Qt +os.environ['QT_LOGGING_RULES'] = '*=false' +os.environ['OPENCV_LOG_LEVEL'] = 'ERROR' +import cv2 +import numpy as np +import time +import threading +import queue +from queue import Queue +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 +from reconocimiento import ( + app, + gestionar_vectores, + buscar_mejor_match, + hilo_bienvenida, + UMBRAL_SIM, + COOLDOWN_TIME +) + +# ────────────────────────────────────────────────────────────────────────────── +# 2. PROTECCIONES MULTIHILO E INICIALIZACIΓ“N +# ────────────────────────────────────────────────────────────────────────────── +COLA_ROSTROS = Queue(maxsize=4) +IA_LOCK = threading.Lock() + +print("\nIniciando carga de base de datos...") +BASE_DATOS_ROSTROS = gestionar_vectores(actualizar=True) + +# ────────────────────────────────────────────────────────────────────────────── +# 3. MOTOR ASÍNCRONO CON INSIGHTFACE +# ────────────────────────────────────────────────────────────────────────────── +def procesar_rostro_async(roi_cabeza, gid, cam_id, global_mem, trk): + try: + if not BASE_DATOS_ROSTROS or roi_cabeza.size == 0: return + + with IA_LOCK: + faces = app.get(roi_cabeza) + + if len(faces) == 0: + return + + face = max(faces, key=lambda f: (f.bbox[2] - f.bbox[0]) * (f.bbox[3] - f.bbox[1])) + + w_rostro = face.bbox[2] - face.bbox[0] + h_rostro = face.bbox[3] - face.bbox[1] + + # ⚑ LΓ­mite bajo (20px) para reconocer desde mΓ‘s lejos + if w_rostro < 20 or h_rostro < 20 or (w_rostro / h_rostro) < 0.35: + return + + emb = np.array(face.normed_embedding, dtype=np.float32) + genero_detectado = "Man" if face.sex == "M" else "Woman" + + mejor_match, max_sim = buscar_mejor_match(emb, BASE_DATOS_ROSTROS) + print(f"[DEBUG CAM {cam_id}] InsightFace: {mejor_match} al {max_sim:.2f}") + + votos_finales = 0 + + # ────────────────────────────────────────────────────────────────── + # ⚑ LΓ“GICA DE VOTACIΓ“N PONDERADA INYECTADA + # ────────────────────────────────────────────────────────────────── + # Aceptamos rostros de CCTV desde 0.38 (ajustado segΓΊn tu cΓ³digo a 0.35) + if max_sim >= 0.35 and mejor_match: + nombre_limpio = mejor_match.split('_')[0] + + # Variable para rastrear quiΓ©n es el ID definitivo al final del proceso + id_definitivo = gid + + with global_mem.lock: + datos_id = global_mem.db.get(gid) + if not datos_id: return + + if datos_id.get('candidato_nombre') == nombre_limpio: + datos_id['votos_nombre'] = datos_id.get('votos_nombre', 0) + 1 + else: + datos_id['candidato_nombre'] = nombre_limpio + datos_id['votos_nombre'] = 1 + + # Sistema de Puntos + if max_sim >= 0.50: + datos_id['votos_nombre'] += 3 # Pase VIP por buena foto + elif max_sim >= 0.40: + datos_id['votos_nombre'] += 2 # Voto extra por foto decente + + votos_finales = datos_id['votos_nombre'] + + # ⚑ Exigimos 3 votos (segΓΊn tu condicional) + if votos_finales >= 3: + nombre_actual = datos_id.get('nombre') + + # 1. Buscamos si ese nombre ya lo tiene un veterano en la memoria + id_veterano = None + for gid_mem, data_mem in global_mem.db.items(): + if data_mem.get('nombre') == nombre_limpio and gid_mem != gid: + id_veterano = gid_mem + break + + # 2. FUSIΓ“N MÁGICA: Si ya existe, lo fusionamos + if id_veterano is not None: + print(f"[FUSIΓ“N FACIAL] ID {gid} es el clon de la espalda. Fusionando con el veterano ID {id_veterano} ({nombre_limpio}).") + + # Pasamos la memoria de ropa al veterano + global_mem.db[id_veterano]['firmas'].extend(datos_id.get('firmas', [])) + if len(global_mem.db[id_veterano]['firmas']) > 15: + global_mem.db[id_veterano]['firmas'] = global_mem.db[id_veterano]['firmas'][-15:] + + # Vaciamos al perdedor y redireccionamos + datos_id['firmas'] = [] + datos_id['fusionado_con'] = id_veterano + + # Actualizamos el tracker y el ID definitivo + trk.gid = id_veterano + id_definitivo = id_veterano + + # 3. BAUTIZO NORMAL: Si no hay clones, procedemos con tu lΓ³gica de protecciΓ³n VIP + else: + if nombre_actual is not None and nombre_actual != nombre_limpio: + # Si ya tiene nombre y quieren robΓ‘rselo, exigimos 0.56 mΓ­nimo + if max_sim < 0.56: + print(f"[RECHAZO VIP] {nombre_actual} protegido de {nombre_limpio} ({max_sim:.2f})") + return + else: + print(f" [CORRECCIΓ“N VIP] Renombrando a {nombre_limpio} ({max_sim:.2f})") + + if nombre_actual != nombre_limpio: + datos_id['nombre'] = nombre_limpio + print(f"[BAUTIZO] ID {gid} confirmado como {nombre_limpio}") + + # Actualizamos el tiempo de vida del ID ganador + global_mem.db[id_definitivo]['ts'] = time.time() + + # πŸ”Š AUDIO DE BIENVENIDA (Funciona tanto para bautizos como para fusiones) + if str(cam_id) == "7": + if not hasattr(global_mem, 'ultimos_saludos'): + global_mem.ultimos_saludos = {} + ultimo = global_mem.ultimos_saludos.get(nombre_limpio, 0) + + # AquΓ­ asumo que tienes COOLDOWN_TIME definido globalmente en tu archivo + if (time.time() - ultimo) > COOLDOWN_TIME: + global_mem.ultimos_saludos[nombre_limpio] = time.time() + threading.Thread(target=hilo_bienvenida, args=(nombre_limpio, genero_detectado), daemon=True).start() + + # Blindaje OSNet fuera del lock (Usando el id_definitivo por si hubo fusiΓ³n) + if max_sim > 0.50 and votos_finales >= 3: + global_mem.confirmar_firma_vip(id_definitivo, time.time()) + + except Exception as e: + print(f"Error en InsightFace asΓ­ncrono: {e}") + finally: + # ⚑ EL LIBERADOR (Vital para que el tracker no se quede bloqueado) + trk.procesando_rostro = False + +def worker_rostros(global_mem): + while True: + roi_cabeza, gid, cam_id, trk = COLA_ROSTROS.get() + procesar_rostro_async(roi_cabeza, 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 getattr(trk, 'en_grupo', False): color, label = (0, 0, 255), f"ID:{trk.gid} [grp]" + elif getattr(trk, 'aprendiendo', False): color, label = (255, 255, 0), f"ID:{trk.gid} [++]" + elif getattr(trk, 'origen_global', False): 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] + + 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: + # ⚑ 1. Subimos la confianza de YOLO de 0.50 a 0.60 para matar siluetas dudosas + res = model.predict(frame_show, conf=0.60, iou=0.50, classes=[0], verbose=False, imgsz=480) + + if res[0].boxes: + cajas_crudas = res[0].boxes.xyxy.cpu().numpy().tolist() + + # ⚑ 2. FILTRO BIOMECÁNICO (Anti-Sillas) + for b in cajas_crudas: + w_caja = b[2] - b[0] + h_caja = b[3] - b[1] + + # Un humano real es al menos 10% mΓ‘s alto que ancho (ratio > 1.1) + # Si la caja es muy cuadrada o ancha, la ignoramos y no se la pasamos a Kalman + if h_caja > (w_caja * 1.1): + boxes.append(b) + + # ⚑ UPDATE LIMPIO (Sin IDs Globales) + tracks = managers[cid].update(boxes, frame_show, frame, now, turno_activo) + + for trk in tracks: + if getattr(trk, 'time_since_update', 1) <= 2: + dibujar_track_fusion(frame_show, trk, global_mem) + + if turno_activo and trk.gid is not None and not getattr(trk, 'procesando_rostro', False): + + with global_mem.lock: + votos_actuales = global_mem.db.get(trk.gid, {}).get('votos_nombre', 0) + if votos_actuales >= 2: + continue + + x1, y1, x2, y2 = trk.box + h_real, w_real = frame.shape[:2] + escala_x = w_real / 480.0 + escala_y = h_real / 270.0 + h_box = y2 - y1 + + y_exp = max(0, y1 - h_box * 0.15) + y_cab = min(270, y1 + h_box * 0.50) + + roi_recortado = frame[ + int(y_exp * escala_y) : int(y_cab * escala_y), + int(max(0, x1) * escala_x) : int(min(480, x2) * escala_x) + ].copy() + + # ⚑ COMPUERTA Γ“PTICA (Filtro Anti-Tartamudeo 25x25) + if roi_recortado.size > 0 and roi_recortado.shape[0] >= 25 and roi_recortado.shape[1] >= 25: + gray = cv2.cvtColor(roi_recortado, cv2.COLOR_BGR2GRAY) + nitidez = cv2.Laplacian(gray, cv2.CV_64F).var() + + # ⚑ BAJAMOS DE 12.0 a 5.0. + # Deja pasar rostros un poco borrosos por la velocidad de caminar, + # pero sigue bloqueando espaldas lisas. + if nitidez > 8.0: + if not COLA_ROSTROS.full(): + ultimo_envio = getattr(trk, 'ultimo_rostro_enviado', 0) + + # Solo mandamos la cara si ha pasado medio segundo desde la ΓΊltima vez que lo intentamos + if (now - ultimo_envio) > 0.5: + + # Tu escudo anti-lag previo + if COLA_ROSTROS.qsize() < 2: + trk.ultimo_rostro_enviado = now # Registramos la hora del envΓ­o + trk.procesando_rostro = True # Bloqueamos el tracker + + # AquΓ­ pones TU lΓ­nea original de la cola: + COLA_ROSTROS.put((roi_recortado, trk.gid, cid, trk), block=False) + else: + trk.ultimo_intento_cara = time.time() - 0.5 + + """if nitidez > 8.0: + + if not COLA_ROSTROS.full(): + + try: + + if COLA_ROSTROS.qsize() < 2: + + COLA_ROSTROS.put((roi_recortado, trk.gid, cid, trk), block=False) + + trk.procesando_rostro = True + + trk.ultimo_intento_cara = time.time() + + except queue.Full: + + pass + + else: + + trk.ultimo_intento_cara = time.time() - 0.5""" + + 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 getattr(t, 'time_since_update', 1) == 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 + key = cv2.waitKey(1) & 0xFF + + if key == ord('q'): + break + + elif key == ord('r'): + print("\n[MODO REGISTRO] Escaneando mosaico para registrar...") + mejor_roi = None + max_area = 0 + face_metadata = None + + for i, cam_obj in enumerate(cams): + if cam_obj.frame is None: continue + + faces = app.get(cam_obj.frame) + for face in faces: + fw = face.bbox[2] - face.bbox[0] + fh = face.bbox[3] - face.bbox[1] + area = fw * fh + if area > max_area: + max_area = area + h_frame, w_frame = cam_obj.frame.shape[:2] + + m_x, m_y = int(fw * 0.30), int(fh * 0.30) + y1 = max(0, int(face.bbox[1]) - m_y) + y2 = min(h_frame, int(face.bbox[3]) + m_y) + x1 = max(0, int(face.bbox[0]) - m_x) + x2 = min(w_frame, int(face.bbox[2]) + m_x) + + mejor_roi = cam_obj.frame[y1:y2, x1:x2] + face_metadata = face + + if mejor_roi is not None and mejor_roi.size > 0: + cv2.imshow("Nueva Persona", mejor_roi) + cv2.waitKey(1) + + nom = input("Escribe el nombre de la persona: ").strip() + cv2.destroyWindow("Nueva Persona") + + if nom: + import json + genero_guardado = "Man" if face_metadata.sex == "M" else "Woman" + + ruta_generos = os.path.join("cache_nombres", "generos.json") + os.makedirs("cache_nombres", exist_ok=True) + 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) + + ruta_db = "db_institucion" + os.makedirs(ruta_db, exist_ok=True) + cv2.imwrite(os.path.join(ruta_db, f"{nom}.jpg"), mejor_roi) + + print(f"[OK] Rostro guardado (GΓ©nero autodetectado: {genero_guardado})") + print(" Sincronizando base de datos en caliente...") + + nuevos_vectores = gestionar_vectores(actualizar=True) + with IA_LOCK: + BASE_DATOS_ROSTROS.clear() + BASE_DATOS_ROSTROS.update(nuevos_vectores) + print(" Sistema listo.") + else: + print("[!] Registro cancelado.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/fusion.py b/fusion.py index d11164c..9878f7c 100644 --- a/fusion.py +++ b/fusion.py @@ -73,7 +73,7 @@ def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): roi_cabeza = frame_hd[y1_hd:y2_hd, x1_hd:x2_hd] # ⚑ Filtro fΓ­sico relajado a 40x40 - if roi_cabeza.size == 0 or roi_cabeza.shape[0] < 40 or roi_cabeza.shape[1] < 40: + if roi_cabeza.size == 0 or roi_cabeza.shape[0] < 20 or roi_cabeza.shape[1] < 20: return h_roi, w_roi = roi_cabeza.shape[:2] @@ -110,12 +110,12 @@ def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): 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] < 40 or roi_rostro.shape[1] < 40: + if roi_rostro.size == 0 or roi_rostro.shape[0] < 20 or roi_rostro.shape[1] < 20: continue # πŸ›‘οΈ FILTRO ANTI-PERFIL: Evita falsos positivos de personas viendo de lado ratio_aspecto = roi_rostro.shape[1] / float(roi_rostro.shape[0]) - if ratio_aspecto < 0.60: + if ratio_aspecto < 0.50: continue # πŸ›‘οΈ FILTRO Γ“PTICO (Movimiento) @@ -168,7 +168,7 @@ def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): datos_id['votos_nombre'] = 1 # ⚑ EL PASE VIP: Si la certeza es aplastante (>0.55), salta la burocracia - if max_sim >= 0.45: + if max_sim >= 0.50: datos_id['votos_nombre'] = max(2, datos_id['votos_nombre']) # Solo actuamos si tiene 2 votos consistentes... @@ -177,7 +177,7 @@ def procesar_rostro_async(frame_hd, box_480, gid, cam_id, global_mem, trk): # CANDADO DE BAUTIZO: Protege a los VIPs de alucinaciones borrosas if nombre_actual is not None and nombre_actual != nombre_limpio: - if max_sim < 0.55: + if max_sim < 0.59: # Si es un puntaje bajo, es una confusiΓ³n de ArcFace. Lo ignoramos. print(f" [RECHAZO] ArcFace intentΓ³ renombrar a {nombre_actual} como {nombre_limpio} con solo {max_sim:.2f}") continue diff --git a/reconocimiento.py b/reconocimiento.py new file mode 100644 index 0000000..22751e9 --- /dev/null +++ b/reconocimiento.py @@ -0,0 +1,378 @@ +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' +os.environ['CUDA_VISIBLE_DEVICES'] = '-1' + +# ⚑ NUEVOS CANDADOS: Silenciamos la burocracia de OpenCV y Qt +os.environ['QT_LOGGING_RULES'] = '*=false' +os.environ['OPENCV_LOG_LEVEL'] = 'ERROR' + +import cv2 +import numpy as np +import pickle +import time +import threading +import asyncio +import edge_tts +import subprocess +from datetime import datetime +import warnings +import json + +# ⚑ IMPORTACIΓ“N DE INSIGHTFACE +from insightface.app import FaceAnalysis + +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 # ⚑ Ajustado a la exigencia de producciΓ³n +COOLDOWN_TIME = 15 # Segundos entre saludos + +USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.200" +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) + +# ────────────────────────────────────────────────────────────────────────────── +# EL NUEVO CEREBRO: INSIGHTFACE (buffalo_l) +# ────────────────────────────────────────────────────────────────────────────── +print("Cargando motor InsightFace (buffalo_l)...") +# Carga detecciΓ³n (SCRFD), landmarks, reconocimiento (ArcFace) y atributos (gΓ©nero/edad) +app = FaceAnalysis(name='buffalo_l', providers=['CPUExecutionProvider']) +# det_size a 320x320 es un balance perfecto entre velocidad y capacidad de detectar rostros lejanos +app.prepare(ctx_id=0, det_size=(320, 320)) +print("Motor cargado exitosamente.") + +# ────────────────────────────────────────────────────────────────────────────── +# 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 INSIGHTFACE) +# ────────────────────────────────────────────────────────────────────────────── +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 = {} + + 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 (modelo 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 + + 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) + 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) + + # ⚑ INSIGHTFACE: ExtracciΓ³n primaria + faces = app.get(img_db) + + # HACK DEL LIENZO NEGRO: Si la foto estΓ‘ muy recortada y no ve la cara, + # le agregamos un borde negro gigante para engaΓ±ar al detector + if len(faces) == 0: + h_img, w_img = img_db.shape[:2] + img_pad = cv2.copyMakeBorder(img_db, h_img, h_img, w_img, w_img, cv2.BORDER_CONSTANT, value=(0,0,0)) + faces = app.get(img_pad) + + if len(faces) == 0: + print(f" [!] Rostro irrecuperable en '{archivo}'.") + continue + + face = max(faces, key=lambda f: (f.bbox[2]-f.bbox[0]) * (f.bbox[3]-f.bbox[1])) + emb = np.array(face.normed_embedding, dtype=np.float32) + + # ⚑ CORRECCIΓ“N DE GΓ‰NERO: InsightFace devuelve "M" o "F" + if falta_genero: + dic_generos[nombre_archivo] = "Man" if face.sex == "M" else "Woman" + cambio_generos = True + + vectores_actuales[nombre_archivo] = emb + timestamps[nombre_archivo] = ts_actual + hubo_cambios = True + print(f" Procesado: {nombre_archivo} | GΓ©nero: {dic_generos.get(nombre_archivo)}") + + except Exception as e: + print(f" Error procesando '{archivo}': {e}") + + 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}") + + 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) + + 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 +# ────────────────────────────────────────────────────────────────────────────── +def buscar_mejor_match(emb_consulta, base_datos): + # InsightFace devuelve normed_embedding, por lo que la magnitud ya es 1 + mejor_match, max_sim = None, -1.0 + for nombre, vec in base_datos.items(): + 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 - INSIGHTFACE (buffalo_l)") + 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() + + # ⚑ INSIGHTFACE: Hace TODO aquΓ­ (DetecciΓ³n, Landmarks, GΓ©nero, ArcFace) + faces_raw = app.get(frame) + faces_ultimo_frame = faces_raw + + for face in faces_raw: + # Las cajas de InsightFace vienen en formato [x1, y1, x2, y2] + box = face.bbox.astype(int) + fx, fy, x2, y2 = box[0], box[1], box[2], box[3] + fw, fh = x2 - fx, y2 - fy + + # Limitamos a los bordes de la pantalla + fx, fy = max(0, fx), max(0, fy) + fw, fh = min(w - fx, fw), 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"DET:{face.det_score:.2f}", + (fx, fy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 200, 0), 1) + + if (tiempo_actual - ultimo_saludo) <= COOLDOWN_TIME: + continue + + # FILTRO DE TAMAΓ‘O (Para evitar reconocer pΓ­xeles lejanos) + if fw < 20 or fh < 20: + cv2.putText(display_frame, "muy pequeno", + (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 100, 255), 1) + continue + + # SIMETRÍA MATEMÁTICA INMEDIATA + emb = np.array(face.normed_embedding, dtype=np.float32) + mejor_match, max_sim = buscar_mejor_match(emb, base_datos) + + 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) + + # ⚑ GΓ‰NERO INMEDIATO SIN SOBRECARGA DE CPU + genero = "Man" if face.sex == 1 else "Woman" + + 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: + # Tomamos la cara mΓ‘s grande detectada por InsightFace + face_registro = max(faces_ultimo_frame, key=lambda f: (f.bbox[2]-f.bbox[0]) * (f.bbox[3]-f.bbox[1])) + box = face_registro.bbox.astype(int) + fx, fy, fw, fh = box[0], box[1], box[2]-box[0], box[3]-box[1] + + # Margen estΓ©tico para guardar la foto + m_x, m_y = int(fw * 0.30), int(fh * 0.30) + y1, y2 = max(0, fy-m_y), min(h, fy+fh+m_y) + x1, x2 = max(0, fx-m_x), min(w, fx+fw+m_x) + + face_roi = frame[y1:y2, x1:x2] + + if face_roi.size > 0: + nom = input("\nNombre de la persona: ").strip() + if nom: + # Extraemos el gΓ©nero automΓ‘ticamente gracias a InsightFace + gen_str = "Man" if face_registro.sex == 1 else "Woman" + + # Actualizamos JSON directo sin preguntar + ruta_generos = os.path.join(CACHE_PATH, "generos.json") + dic_generos = {} + if os.path.exists(ruta_generos): + with open(ruta_generos, 'r') as f: + dic_generos = json.load(f) + dic_generos[nom] = gen_str + with open(ruta_generos, 'w') as f: + json.dump(dic_generos, f) + + # Guardado de imagen y sincronizaciΓ³n + foto_path = os.path.join(DB_PATH, f"{nom}.jpg") + cv2.imwrite(foto_path, face_roi) + print(f"[OK] Rostro de '{nom}' guardado como {gen_str}. 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() \ No newline at end of file diff --git a/reconocimiento2.py b/reconocimiento2.py index 968d85c..b17378c 100644 --- a/reconocimiento2.py +++ b/reconocimiento2.py @@ -24,7 +24,7 @@ DB_PATH = "db_institucion" CACHE_PATH = "cache_nombres" VECTORS_FILE = "base_datos_rostros.pkl" TIMESTAMPS_FILE = "representaciones_timestamps.pkl" -UMBRAL_SIM = 0.39 # Por encima β†’ identificado. Por debajo β†’ desconocido. +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" @@ -402,7 +402,7 @@ def sistema_interactivo(): else: persona_actual, confirmaciones = mejor_match, 1 - if confirmaciones >= 2: + if confirmaciones >= 1: cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 3) try: analisis = DeepFace.analyze( diff --git a/representaciones_timestamps.pkl b/representaciones_timestamps.pkl index fd8cb38bd2e215d8e0098ffc5253a535b6e36a26..fbcccae6a6ace5a2ebc2b53daf7c7b74a9936bbd 100644 GIT binary patch delta 111 zcmeyvx|x-wfo1B7i7fV$dzs`XI;--t_~#}TO>uX;Rk-=arW0xt)0M<|d^6KaQ*#s? z^U_muAX3w_KP67=$P#3WEG^1}33jP*X;0>0yg!+dsa%*XEHk+zA8b;|$JiaS!%Ou5 DXYDKp delta 212 zcmdnY`iGUJfo1B)i7fULlT;^8SDbhuQ;gdsGchkwAt$l4C~=Cr>))tjurR8h|vl%GYhNe1iL)N*3s)*iOV(ju7go4eGww0n4bGt)~`a}*r&(xKLFo}T?F Vv4_P!H?at;bMp<>O()b!^#I^JR$Kr8 diff --git a/seguimiento2.py b/seguimiento2.py index 3edbba1..c971722 100644 --- a/seguimiento2.py +++ b/seguimiento2.py @@ -13,7 +13,7 @@ import os # ────────────────────────────────────────────────────────────────────────────── USUARIO, PASSWORD, IP_DVR = "admin", "TCA200503", "192.168.1.244" SECUENCIA = [1, 7, 5, 8, 3, 6] -# πŸ›‘οΈ RED ESTABILIZADA (Timeout de 3s para evitar congelamientos de FFmpeg) +# 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" @@ -23,16 +23,13 @@ VECINOS = { "8": ["5", "3"], "3": ["8", "6"], "6": ["3"] } -ASPECT_RATIO_MIN = 0.5 +ASPECT_RATIO_MIN = 0.6 ASPECT_RATIO_MAX = 4.0 AREA_MIN_CALIDAD = 1200 -FRAMES_CALIDAD = 2 +FRAMES_CALIDAD = 3 TIEMPO_MAX_AUSENCIA = 800.0 -UMBRAL_REID_MISMA_CAM = 0.53 # Antes 0.65 -UMBRAL_REID_VECINO = 0.48 # Antes 0.53 -UMBRAL_REID_NO_VECINO = 0.67 # Antes 0.72 -MAX_FIRMAS_MEMORIA = 10 +MAX_FIRMAS_MEMORIA = 10 C_CANDIDATO = (150, 150, 150) C_LOCAL = (0, 255, 0) @@ -66,12 +63,23 @@ def analizar_calidad(box): 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)) + # ⚑ ESCUDO ANTI-SOMBRAS (CLAHE) + # Convertimos a LAB para ecualizar solo la luz (L) sin deformar los colores reales (A y B) + lab = cv2.cvtColor(roi, cv2.COLOR_BGR2LAB) + l, a, b = cv2.split(lab) + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) + l_eq = clahe.apply(l) + lab_eq = cv2.merge((l_eq, a, b)) + roi_eq = cv2.cvtColor(lab_eq, cv2.COLOR_LAB2BGR) + + # Preprocesamiento original para OSNet + img = cv2.resize(roi_eq, (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 + img = img.transpose(2,0,1).astype(np.float32) / 255.0 + img = (img - MEAN) / STD + + # Devolvemos el tensor correcto de 1 sola imagen + return np.expand_dims(img, axis=0) def extraer_color_zonas(img): h_roi = img.shape[0] @@ -115,10 +123,17 @@ def extraer_firma_hibrida(frame_hd, box_480): calidad_area = (x2_c - x1_c) * (y2_c - y1_c) - blob = preprocess_onnx(roi) + # ⚑ VOLVEMOS AL BATCH DE 16 PARA EVITAR EL CRASH FATAL + blob = preprocess_onnx(roi) # Esto devuelve (1, 3, 256, 128) + + # Creamos el contenedor de 16 espacios que el modelo ONNX exige 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() + blob_16[0] = blob[0] # Metemos nuestra imagen en el primer espacio + + # Ejecutamos la inferencia + outputs = ort_session.run(None, {input_name: blob_16}) + deep_feat = outputs[0][0].flatten() # Extraemos solo el primer resultado + norma = np.linalg.norm(deep_feat) if norma > 0: deep_feat = deep_feat / norma @@ -126,17 +141,15 @@ def extraer_firma_hibrida(frame_hd, box_480): textura_feat = extraer_textura_rapida(roi) return {'deep': deep_feat, 'color': color_feat, 'textura': textura_feat, 'calidad': calidad_area} - except Exception: + except Exception as e: + print(f"Error en extracciΓ³n: {e}") return None -# ⚑ EL SECRETO: 100% IA entre cΓ‘maras. Textura solo en la misma cΓ‘mara. -# ⚑ 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'])) - # 1. Calculamos SIEMPRE los histogramas de color por zonas 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))) @@ -146,14 +159,10 @@ def similitud_hibrida(f1, f2, cross_cam=False): sim_head, sim_torso, sim_legs = 0.0, 0.0, 0.0 if cross_cam: - # Si OSNet se confunde por la chamarra, revisamos las piernas. - # Una similitud < 0.25 en HISTCMP_CORREL significa colores radicalmente distintos (Ej. Negro vs Gris/Blanco). if sim_legs < 0.25: - sim_deep -= 0.15 # Castigo letal: Le tumbamos 15 puntos porcentuales a OSNet - + sim_deep -= 0.15 return max(0.0, sim_deep) - # 2. Si estΓ‘ en la misma cΓ‘mara, usamos la fΓ³rmula hΓ­brida completa sim_color = (0.10 * sim_head) + (0.60 * sim_torso) + (0.30 * sim_legs) if 'textura' in f1 and 'textura' in f2 and f1['textura'].size > 1: @@ -172,7 +181,7 @@ class KalmanTrack: 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.processNoiseCov *= 0.05 self.kf.statePost = np.zeros((7, 1), np.float32) self.kf.statePost[:4] = self._convert_bbox_to_z(box) self.local_id = KalmanTrack._count @@ -188,6 +197,9 @@ class KalmanTrack: self.frames_buena_calidad = 0 self.listo_para_id = False self.area_referencia = 0.0 + self.firma_pre_grupo = None + self.ts_salio_grupo = 0 + self.validado_post_grupo = True 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. @@ -199,12 +211,31 @@ class KalmanTrack: return [cx-w/2., cy-h/2., cx+w/2., cy+h/2.] def predict(self, turno_activo=True): + # ⚑ EL SUICIDIO DE CAJAS FANTASMAS + # Si lleva mΓ‘s de 5 frames de ceguera total (YOLO no lo ve), matamos la predicciΓ³n + if self.time_since_update > 5: + return None + + 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 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 + return self.box""" def update(self, box, en_grupo, now): self.ts_ultima_deteccion = now @@ -227,18 +258,26 @@ class GlobalMemory: def __init__(self): self.db = {} self.next_gid = 100 - self.lock = threading.Lock() + self.lock = threading.RLock() - def _es_transito_posible(self, data, cam_destino, now): - ultima_cam = str(data['last_cam']) - cam_destino = str(cam_destino) + def _es_transito_posible(self, data, cam_id, now): + cam_origen = str(data['last_cam']) + cam_destino = str(cam_id) 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 + # 1. Si es la misma cΓ‘mara, aplicamos la regla normal de tiempo mΓ‘ximo de ausencia + if cam_origen == cam_destino: + return dt < TIEMPO_MAX_AUSENCIA + + # 2. ⚑ DEDUCCIΓ“N DE TOPOLOGÍA (El sistema aprende el mapa solo) + # Si salta a otra cΓ‘mara en menos de 1.5 segundos, es fΓ­sicamente imposible + # a menos que ambas cΓ‘maras apunten al mismo lugar (estΓ‘n solapadas). + if dt < 1.5: + # Le damos vΓ­a libre inmediata porque sabemos que estΓ‘ en una intersecciΓ³n + return True + + # 3. Si tardΓ³ un tiempo normal (ej. > 1.5s), es un trΓ‘nsito de pasillo vΓ‘lido + return dt < TIEMPO_MAX_AUSENCIA def _sim_robusta(self, firma_nueva, firmas_guardadas, cross_cam=False): if not firmas_guardadas: return 0.0 @@ -247,10 +286,8 @@ class GlobalMemory: 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 + # ⚑ SE AGREGΓ“ LΓ“GICA ESPACIO-TEMPORAL DINÁMICA def identificar_candidato(self, firma_hibrida, cam_id, now, active_gids, en_borde=True): - # 1. LIMPIEZA DE MEMORIA (El Recolector de Basura) - # Esto asume que ya agregaste la funciΓ³n limpiar_fantasmas(self) a tu clase self.limpiar_fantasmas() with self.lock: @@ -260,32 +297,57 @@ class GlobalMemory: 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 + + # Bloqueo inmediato si es fΓ­sicamente imposible + 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 - 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 + # UMBRALES DINÁMICOS INTELIGENTES + if misma_cam: + if dt < 2.0: umbral = 0.60 # Para parpadeos rΓ‘pidos de YOLO + else: umbral = 0.63 # Si desapareciΓ³ un rato en la misma cΓ‘mara + elif es_vecino: + # ⚑ EL PUNTO DULCE: 0.62. + # EstΓ‘ por encima del ruido mΓ‘ximo (0.57) y por debajo de las + # caΓ­das de Omar en el cluster 7-5-8 (0.64). + umbral = 0.61 + else: + # ⚑ LEJANOS: 0.66. + # Si salta de la Cam 1 a la Cam 8, exigimos seguridad alta + # para no robarle el ID a alguien que acaba de entrar por la otra puerta. + umbral = 0.66 - # PROTECCIΓ“N VIP + + """ + if misma_cam: + if dt < 2.0: umbral = 0.55 + elif dt < 10.0: umbral = 0.60 + else: umbral = 0.60 + elif es_vecino: + # ⚑ Subimos a 0.66. Si un extraΓ±o saca 0.62, serΓ‘ rechazado y nacerΓ‘ un ID nuevo. + umbral = 0.66 + else: + # ⚑ CΓ‘maras lejanas: Exigencia casi perfecta. + umbral = 0.70""" + + # PROTECCIΓ“N VIP (Le exigimos un poquito mΓ‘s si ya tiene nombre para no mancharlo) if data.get('nombre') is not None: - if misma_cam: - umbral += 0.04 - else: - umbral += 0.03 + umbral += 0.05 if misma_cam else 0.02 + + # πŸ‘οΈ EL CHIVATO DE OSNET (Debug crucial) + # Esto imprimirΓ‘ en tu consola quΓ© similitud real de ropa detectΓ³ al cruzar de cΓ‘mara + if sim > 0.35 and not misma_cam: + print(f" [OSNet] Cam {cam_id} evaluando ID {gid} (Viene de Cam {data['last_cam']}) -> Similitud Ropa: {sim:.2f} (Umbral exigido: {umbral:.2f})") if sim > umbral: - # ⚑ MODIFICACIΓ“N: Guardamos tambiΓ©n si es de la misma cam o vecino para el desempate final candidatos.append((sim, gid, misma_cam, es_vecino)) if not candidatos: @@ -293,7 +355,6 @@ class GlobalMemory: self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) return nid, False - # Ordena por la similitud (el primer elemento de la tupla) de mayor a menor candidatos.sort(reverse=True) best_sim, best_gid, best_misma, best_vecino = candidatos[0] @@ -301,20 +362,15 @@ class GlobalMemory: segunda_sim, segundo_gid, seg_misma, seg_vecino = candidatos[1] margen = best_sim - segunda_sim - # Si las chamarras son casi idΓ©nticas... - if margen <= 0.02 and best_sim < 0.75: - - # βš–οΈ DESEMPATE GEOGRÁFICO INTELLIGENTE - # Le damos un "peso" matemΓ‘tico extra a la lΓ³gica espacial + if margen <= 0.06 and best_sim < 0.75: peso_1 = best_sim + (0.10 if (best_misma or best_vecino) else 0.0) peso_2 = segunda_sim + (0.10 if (seg_misma or seg_vecino) else 0.0) if peso_1 > peso_2: - best_gid = best_gid # Gana el primero por lΓ³gica espacial + best_gid = best_gid elif peso_2 > peso_1: - best_gid = segundo_gid # Gana el segundo por lΓ³gica espacial + best_gid = segundo_gid else: - # Si empatan en TODO (ropa y espacio), entonces sΓ­ entramos en pΓ‘nico seguro print(f"\n[ ALERTA] Empate extremo entre ID {best_gid} ({best_sim:.2f}) y ID {segundo_gid} ({segunda_sim:.2f}). Se asigna temporal.") nid = self.next_gid; self.next_gid += 1 self._actualizar_sin_lock(nid, firma_hibrida, cam_id, now) @@ -348,7 +404,6 @@ class GlobalMemory: with self.lock: self._actualizar_sin_lock(gid, firma, cam_id, now) def limpiar_fantasmas(self): - """ Aniquila los IDs temporales que llevan mΓ‘s de 15 segundos sin verse """ with self.lock: ahora = time.time() ids_a_borrar = [] @@ -356,11 +411,9 @@ class GlobalMemory: for gid, data in self.db.items(): tiempo_inactivo = ahora - data.get('ts', ahora) - # Si es un ID anΓ³nimo y lleva 15 segundos desaparecido, es basura if data.get('nombre') is None and tiempo_inactivo > 600.0: ids_a_borrar.append(gid) - # Si es un VIP (con nombre), le damos 5 minutos de memoria antes de borrarlo elif data.get('nombre') is not None and tiempo_inactivo > 900.0: ids_a_borrar.append(gid) @@ -368,19 +421,31 @@ class GlobalMemory: del self.db[gid] def confirmar_firma_vip(self, gid, ts): - """ - ArcFace confirma la identidad con alta certeza (>0.55). - Aniquila las firmas viejas y deja solo la mΓ‘s reciente como la firma VIP definitiva. - """ with self.lock: if gid in self.db and self.db[gid]['firmas']: - # Tomamos la ΓΊltima firma que el hilo principal guardΓ³ (la ropa actual) - firma_actual_pura = self.db[gid]['firmas'][-1] - - # Sobrescribimos el historial dejando solo esta firma confirmada - self.db[gid]['firmas'] = [firma_actual_pura] + firmas_actuales = self.db[gid]['firmas'] + self.db[gid]['firmas'] = firmas_actuales[-3:] self.db[gid]['ts'] = ts + def fusionar_ids(self, id_mantiene, id_elimina): + with self.lock: + if id_mantiene in self.db and id_elimina in self.db: + # 1. Le pasamos toda la memoria de ropa al ID ganador + self.db[id_mantiene]['firmas'].extend(self.db[id_elimina]['firmas']) + + # Topamos a las 15 mejores firmas para no saturar la RAM + if len(self.db[id_mantiene]['firmas']) > 15: + self.db[id_mantiene]['firmas'] = self.db[id_mantiene]['firmas'][-15:] + + self.db[id_mantiene]['ts'] = max(self.db[id_mantiene]['ts'], self.db[id_elimina]['ts']) + + # 2. Vaciamos al perdedor y le ponemos un "Redireccionamiento" + self.db[id_elimina]['firmas'] = [] + self.db[id_elimina]['fusionado_con'] = id_mantiene + print(f"🧬 [FUSIΓ“N MÁGICA] Las firmas del ID {id_elimina} fueron absorbidas por el ID {id_mantiene}.") + return True + return False + # ────────────────────────────────────────────────────────────────────────────── # 4. GESTOR LOCAL (Kalman Elasticity & Ghost Killer) # ────────────────────────────────────────────────────────────────────────────── @@ -394,92 +459,237 @@ class CamManager: def __init__(self, cam_id, global_mem): self.cam_id, self.global_mem, self.trackers = cam_id, global_mem, [] + def _detectar_grupo(self, trk, box, todos_los_tracks): + x1, y1, x2, y2 = box + w_box = x2 - x1 + h_box = y2 - y1 + cx, cy = (x1 + x2) / 2, (y1 + y2) / 2 + + estado_actual = getattr(trk, 'en_grupo', False) + # Si estΓ‘n a menos de medio cuerpo de distancia lateral, es un grupo. + factor_x = 1.0 if estado_actual else 1.0 + factor_y = 0.4 if estado_actual else 0.2 + + for other in todos_los_tracks: + if other is trk: continue + if not hasattr(other, 'box') or other.box is None: continue + + ox1, oy1, ox2, oy2 = other.box + ocx, ocy = (ox1 + ox2) / 2, (oy1 + oy2) / 2 + + dist_x = abs(cx - ocx) + dist_y = abs(cy - ocy) + + if dist_x < (w_box * factor_x) and dist_y < (h_box * factor_y): + return True + return False + + def _gestionar_aprendizaje_post_grupo(self, now, frame_hd): + CUARENTENA = 1.2 + for trk in self.trackers: + if trk.gid is None or getattr(trk, 'en_grupo', False) or getattr(trk, 'firma_pre_grupo', None) is None: + continue + + tiempo_fuera = now - getattr(trk, 'ts_salio_grupo', 0) + + if tiempo_fuera >= CUARENTENA: + firma_actual = extraer_firma_hibrida(frame_hd, trk.box) + + if firma_actual is not None: + sim = similitud_hibrida(firma_actual, trk.firma_pre_grupo) + + # ⚑ Bajamos a 0.50 como umbral de supervivencia base + if sim >= 0.50: + print(f"[GRUPO] ID {trk.gid} validado post-grupo ({sim:.2f}).") + trk.fallos_post_grupo = 0 # Reseteamos los strikes si tenΓ­a + + with self.global_mem.lock: + if trk.gid in self.global_mem.db: + self.global_mem.db[trk.gid]['firmas'] = [trk.firma_pre_grupo, firma_actual] + trk.firma_pre_grupo = None # Aprobado, limpiamos memoria + + else: + # ⚑ SISTEMA DE 3 STRIKES + trk.fallos_post_grupo = getattr(trk, 'fallos_post_grupo', 0) + 1 + + if trk.fallos_post_grupo >= 3: + print(f" [ALERTA GRUPO] ID {trk.gid} fallΓ³ 3 veces validaciΓ³n ({sim:.2f}). Reseteando ID.") + trk.gid = None + trk.firma_pre_grupo = None # Eliminado, limpiamos memoria + trk.fallos_post_grupo = 0 # Reiniciamos contador + else: + print(f" [STRIKE {trk.fallos_post_grupo}/3] ID {trk.gid} sacΓ³ {sim:.2f}. Dando otra oportunidad...") + # OJO: NO ponemos firma_pre_grupo en None aquΓ­, + # para que lo vuelva a intentar en el siguiente frame. + def update(self, boxes, frame_show, frame_hd, now, turno_activo): - for trk in self.trackers: trk.predict(turno_activo=turno_activo) + + for trk in self.trackers: + if trk.gid is not None: + with self.global_mem.lock: + if trk.gid in self.global_mem.db and 'fusionado_con' in self.global_mem.db[trk.gid]: + print(f"πŸ”— [HILO CAM {self.cam_id}] Tracker mutando de ID {trk.gid} a {self.global_mem.db[trk.gid]['fusionado_con']}") + trk.gid = self.global_mem.db[trk.gid]['fusionado_con'] + # ────────────────────────────────────────────────────────── + + # ⚑ FILTRO ANTI-FANTASMAS + vivos_predict = [] + for trk in self.trackers: + caja_predicha = trk.predict(turno_activo=turno_activo) + # Si el tracker lleva mΓ‘s de 5 frames ciego, devuelve None. Lo ignoramos. + if caja_predicha is not None: + vivos_predict.append(trk) + + self.trackers = vivos_predict # Actualizamos la lista solo con los vivos + if not turno_activo: return self.trackers + # ────────────────────────────────────────────────────────── + # AquΓ­ sigue tu cΓ³digo normal: matched, unmatched_dets, unmatched_trks = self._asignar(boxes, now) + + active_gids = {t.gid for t in self.trackers if t.gid is not None} 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) + trk = self.trackers[t_idx] + box = boxes[d_idx] - 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]) + es_grupo_ahora = self._detectar_grupo(trk, box, self.trackers) - # IGNORAMOS VECTORES MUTANTES DE GRUPOS - if trk.gid is None and trk.listo_para_id and not trk.en_grupo: - # ⚑ Usamos el frame_hd - firma = extraer_firma_hibrida(frame_hd, box) - if firma is not None: - # ⚑ DETECCIΓ“N DE ZONA DE NACIMIENTO - fh, fw = frame_hd.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 < 25 or by1 < 25 or bx2 > fw - 25 or by2 > fh - 25) - - # 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 + if not getattr(trk, 'en_grupo', False) and es_grupo_ahora: + if trk.gid is not None: + with self.global_mem.lock: + firmas = self.global_mem.db.get(trk.gid, {}).get('firmas', []) + if firmas: + trk.firma_pre_grupo = firmas[-1] + trk.validado_post_grupo = False + print(f" [GRUPO] ID {trk.gid} entrΓ³ a grupo. Protegiendo firma.") + trk.ts_salio_grupo = 0.0 + + elif getattr(trk, 'en_grupo', False) and not es_grupo_ahora: + trk.ts_salio_grupo = now + print(f" [GRUPO] ID {trk.gid} saliΓ³ de grupo. Cuarentena de 3s.") + + trk.en_grupo = es_grupo_ahora + trk.update(box, es_grupo_ahora, now) - elif trk.gid is not None and not trk.en_grupo: - tiempo_ultima_firma = getattr(trk, 'ultimo_aprendizaje', 0) + area_actual = (box[2] - box[0]) * (box[3] - box[1]) + tiempo_desde_separacion = now - getattr(trk, 'ts_salio_grupo', 0) + en_cuarentena = (tiempo_desde_separacion < 3.0) and (getattr(trk, 'ts_salio_grupo', 0) > 0) + + extracciones_hoy = 0 # ⚑ EL SALVAVIDAS: Contador para el frame actual + + if not trk.en_grupo and not en_cuarentena: - # ⚑ 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_hd.shape[:2] - x1, y1, x2, y2 = map(int, box) - en_borde = (x1 < 15 or y1 < 15 or x2 > fw - 15 or y2 > fh - 15) + # A) Bautizo de IDs Nuevos (Con Aduana Temporal) + if trk.gid is None and trk.listo_para_id: + firma = extraer_firma_hibrida(frame_hd, box) + if firma is not None: + fh, fw = frame_hd.shape[:2] + bx1, by1, bx2, by2 = map(int, box) + nace_en_borde = (bx1 < 25 or by1 < 25 or bx2 > fw - 25 or by2 > fh - 25) + + candidato_gid, es_reid = self.global_mem.identificar_candidato(firma, self.cam_id, now, active_gids, en_borde=nace_en_borde) + + if candidato_gid is not None: + # ⚑ BLOQUEO INMEDIATO: Reservamos el ID en este milisegundo + # para que ninguna otra persona en esta cΓ‘mara pueda evaluarlo. + active_gids.add(candidato_gid) + + # Si la memoria dice "Es un desconocido nuevo", lo bautizamos al instante + if not es_reid: + trk.gid, trk.origen_global, trk.area_referencia = candidato_gid, False, area_actual + + # ⚑ ADUANA TEMPORAL + else: + if getattr(trk, 'candidato_temporal', None) == candidato_gid: + trk.votos_reid = getattr(trk, 'votos_reid', 0) + 1 + else: + # Si cambia de opiniΓ³n, reiniciamos sin restar + trk.candidato_temporal = candidato_gid + trk.votos_reid = 1 + + if trk.votos_reid >= 2: + trk.gid, trk.origen_global, trk.area_referencia = candidato_gid, True, area_actual + print(f" [ADUANA] ID {candidato_gid} validado.") + + # B) Aprendizaje Continuo (Captura de Ángulos) + elif trk.gid is not None: + tiempo_ultima_firma = getattr(trk, 'ultimo_aprendizaje', 0) - if not en_borde: - firma_nueva = extraer_firma_hibrida(frame_hd, 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 + # ⚑ APRENDIZAJE ESCALONADO: + # Mantenemos tus 0.5s perfectos, pero solo 1 persona por frame puede saturar la CPU. + if (now - tiempo_ultima_firma) > 0.5 and analizar_calidad(box) and extracciones_hoy < 1: + fh, fw = frame_hd.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_hd, box) + if firma_nueva is not None: + extracciones_hoy += 1 # ⚑ Cerramos la compuerta para los demΓ‘s en este frame + + with self.global_mem.lock: + if trk.gid in self.global_mem.db and self.global_mem.db[trk.gid]['firmas']: + + firma_reciente = self.global_mem.db[trk.gid]['firmas'][-1] + firma_original = self.global_mem.db[trk.gid]['firmas'][0] + + sim_coherencia = similitud_hibrida(firma_nueva, firma_reciente) + sim_raiz = similitud_hibrida(firma_nueva, firma_original) + + # ⚑ EL BOTΓ“N DE PÁNICO (Anti ID-Switch) + # Si la ropa de la caja actual no se parece en NADA a la original (< 0.35), + # significa que Kalman le pegΓ³ el ID a la persona equivocada en un cruce. + if sim_raiz < 0.35: + print(f"[ID SWITCH] Ropa de ID {trk.gid} cambiΓ³ drΓ‘sticamente. Revocando ID.") + trk.gid = None + trk.listo_para_id = False + trk.frames_buena_calidad = 0 + continue # Rompemos el ciclo para que nazca como alguien nuevo + + ya_bautizado = self.global_mem.db[trk.gid].get('nombre') is not None + umbral_raiz = 0.52 if ya_bautizado else 0.62 + + if sim_coherencia > 0.60 and sim_raiz > umbral_raiz: + 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_raiz: + 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_show.shape[:2] # Usamos frame_show para evaluar los bordes de la caja 480 + fh, fw = frame_show.shape[:2] for t in self.trackers: x1, y1, x2, y2 = t.box toca_borde = (x1 < 20 or y1 < 20 or x2 > fw - 20 or y2 > fh - 20) tiempo_oculto = now - t.ts_ultima_deteccion - # ⚑ MUERTE JUSTA: Si es anΓ³nimo en el borde, muere rΓ‘pido. - # Si ya tiene un ID asignado, le damos al menos 3 segundos de gracia. - if t.gid is None and toca_borde: - limite_vida = 1.0 - elif t.gid is not None and toca_borde: - limite_vida = 3.0 + # ⚑ LIMPIEZA AGRESIVA PARA PROTEGER LA CPU DE MEMORY LEAKS + if t.gid is None: + # Si es un ID gris (no bautizado), lo matamos rΓ‘pido si YOLO lo pierde + limite_vida = 1.0 if toca_borde else 2.5 else: - limite_vida = 10.0 + # Si es VIP, le damos paciencia para que OSNet no se fragmente + limite_vida = 3.0 if toca_borde else 8.0 if tiempo_oculto < limite_vida: vivos.append(t) self.trackers = vivos + + self._gestionar_aprendizaje_post_grupo(now, frame_hd) + return self.trackers + def _asignar(self, boxes, now): n_trk = len(self.trackers); n_det = len(boxes) @@ -487,37 +697,62 @@ class CamManager: 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): + tiempo_oculto = now - trk.ts_ultima_deteccion + + # ⚑ 2A. Aumentamos el radio dinΓ‘mico mΓ­nimo para no perder gente rΓ‘pida + radio_dinamico = min(350.0, max(150.0, 300.0 * tiempo_oculto)) + + # La incertidumbre crece con el tiempo, pero la topamos en 0.5 + incertidumbre = min(0.5, tiempo_oculto * 0.2) + + es_fantasma = getattr(trk, 'time_since_update', 0) > 1 + 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 + + dist_pixel = np.sqrt((cx_t-cx_d)**2 + (cy_t-cy_d)**2) area_trk = (trk.box[2] - trk.box[0]) * (trk.box[3] - trk.box[1]) area_det = (det[2] - det[0]) * (det[3] - det[1]) + + if dist_pixel > radio_dinamico: + cost_mat[t, d] = 100.0 + continue + + # ⚑ 2B. REDUCIMOS CASTIGOS INJUSTOS + # Eliminamos el "castigo_secuestro" que penalizaba excesivamente a los trackers sin IOU. + # Reducimos la penalizaciΓ³n por cambio de tamaΓ±o de 0.4 a 0.2. + + dist_norm = dist_pixel / radio_dinamico 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 + # Si la caja de YOLO es mucho MÁS PEQUEΓ‘A que la predicciΓ³n de Kalman, + # penalizamos fuerte (evita que la caja encoja mΓ‘gicamente y pierda a la persona). + if area_det < area_trk: + castigo_tam = (ratio_area - 1.0) * 0.5 + else: + # Si la caja de YOLO es MÁS GRANDE (ej. persona acercΓ‘ndose/subiendo escaleras), + # somos muy permisivos para que Kalman acepte el nuevo tamaΓ±o sin soltarse. + castigo_tam = (ratio_area - 1.0) * 0.15 - 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 + # FΓ³rmula equilibrada + cost_mat[t, d] = (1.0 - iou) + (0.5 * dist_norm) + castigo_tam + incertidumbre + from scipy.optimize import linear_sum_assignment 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: + # ⚑ UMBRAL RELAJADO: De 2.5 a 3.5. + # Esto evita que rechace la caja por la latencia del procesador. + if cost_mat[r, c] > 3.5: unmatched_trks.append(r); unmatched_dets.append(c) - else: matched.append((r, 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)