J / src /usage_example.py
Andro0s's picture
Upload 13 files
85fa7d2 verified
"""
Ejemplo de uso de Aliah-Plus
Demuestra cómo usar las funcionalidades principales del sistema
"""
import asyncio
import sys
from pathlib import Path
# Añadir el directorio padre al path
sys.path.insert(0, str(Path(__file__).parent.parent))
from src.face_processor import FaceProcessor
from src.embedding_engine import EmbeddingEngine
from src.scrapers.stealth_engine import StealthSearch
from src.ocr_extractor import OCRExtractor
from src.cross_referencer import CrossReferencer
from src.comparator import FaceComparator
import cv2
async def example_complete_search(image_path: str):
"""
Ejemplo completo de búsqueda con todas las características de Aliah-Plus.
"""
print("=" * 60)
print("ALIAH-PLUS - Búsqueda Completa")
print("=" * 60)
# 1. Inicializar componentes
print("\n[1/7] Inicializando componentes...")
face_processor = FaceProcessor()
embedding_engine = EmbeddingEngine(model="ArcFace")
stealth_search = StealthSearch(headless=True)
ocr_extractor = OCRExtractor(gpu=False) # CPU para ejemplo
cross_referencer = CrossReferencer()
comparator = FaceComparator(threshold=0.75)
# 2. Cargar y procesar imagen
print(f"\n[2/7] Cargando imagen: {image_path}")
image = cv2.imread(image_path)
if image is None:
print("❌ Error: No se pudo cargar la imagen")
return
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 3. Detectar y alinear rostro
print("\n[3/7] Detectando y alineando rostro...")
aligned_face = face_processor.align_face(image_rgb)
if aligned_face is None:
print("❌ No se detectó ningún rostro en la imagen")
return
print("✓ Rostro detectado y alineado")
# 4. Generar embedding
print("\n[4/7] Generando embedding facial...")
embedding = embedding_engine.generate_embedding(aligned_face)
if embedding is None:
print("❌ Error generando embedding")
return
print(f"✓ Embedding generado: {len(embedding)} dimensiones")
# 5. Buscar en múltiples motores
print("\n[5/7] Buscando en múltiples motores...")
print(" → Yandex Images")
print(" → Bing Images")
print(" → PimEyes (stealth)")
search_results = await stealth_search.search_all_engines(image_path)
total_results = sum(len(v) for v in search_results.values())
print(f"✓ Total de resultados encontrados: {total_results}")
for engine, results in search_results.items():
print(f" • {engine}: {len(results)} resultados")
# 6. Extraer dominios con OCR (de miniaturas de PimEyes)
print("\n[6/7] Extrayendo dominios con OCR...")
ocr_domains = []
if 'pimeyes' in search_results:
for pim_result in search_results['pimeyes'][:5]: # Solo primeros 5 para ejemplo
if pim_result.get('screenshot'):
screenshot_np = cv2.imdecode(
pim_result['screenshot'],
cv2.IMREAD_COLOR
)
extracted = ocr_extractor.extract_domain_from_thumb(screenshot_np)
ocr_domains.extend(extracted)
print(f"✓ Dominios extraídos por OCR: {len(ocr_domains)}")
if ocr_domains:
print("\n Dominios encontrados:")
for dom in ocr_domains[:5]: # Mostrar solo primeros 5
print(f" • {dom['domain']} (confianza: {dom['confidence']:.2%})")
# 7. Cross-referencing
print("\n[7/7] Correlacionando resultados (Cross-Referencing)...")
cross_referenced = cross_referencer.find_cross_references(
search_results,
ocr_domains
)
correlations = sum(1 for r in cross_referenced if r.get('cross_referenced', False))
print(f"✓ Correlaciones encontradas: {correlations}")
print(f"✓ Resultados totales procesados: {len(cross_referenced)}")
# Mostrar top 5 resultados
print("\n" + "=" * 60)
print("TOP 5 RESULTADOS")
print("=" * 60)
for idx, result in enumerate(cross_referenced[:5], 1):
print(f"\n[{idx}] {result.get('domain', 'N/A')}")
print(f" URL: {result.get('url', 'N/A')}")
print(f" Fuentes: {', '.join(result.get('sources', []))}")
print(f" Verificado por OCR: {'Sí' if result.get('ocr_verified') else 'No'}")
print(f" Confianza: {result.get('confidence', 0):.2%}")
if result.get('cross_referenced'):
print(f" ✓ Correlacionado entre múltiples fuentes")
print("\n" + "=" * 60)
print("✓ Búsqueda completada")
print("=" * 60)
async def example_ocr_only(thumbnail_path: str):
"""
Ejemplo de extracción OCR de una miniatura.
"""
print("\n" + "=" * 60)
print("ALIAH-PLUS - Extracción OCR")
print("=" * 60)
ocr = OCRExtractor(gpu=False)
print(f"\nProcesando: {thumbnail_path}")
image = cv2.imread(thumbnail_path)
if image is None:
print("❌ Error cargando imagen")
return
# Extraer dominios
domains = ocr.extract_domain_from_thumb(image)
print(f"\n✓ Dominios encontrados: {len(domains)}")
if domains:
print("\nResultados:")
for idx, dom in enumerate(domains, 1):
print(f"\n[{idx}] {dom['domain']}")
print(f" Confianza: {dom['confidence']:.2%}")
print(f" Texto original: {dom['original_text']}")
print(f" Método: #{dom['method']}")
else:
print("\n⚠ No se encontraron dominios en la imagen")
async def example_compare_faces(image1_path: str, image2_path: str):
"""
Ejemplo de comparación directa entre dos rostros.
"""
print("\n" + "=" * 60)
print("ALIAH-PLUS - Comparación de Rostros")
print("=" * 60)
face_processor = FaceProcessor()
embedding_engine = EmbeddingEngine(model="ArcFace")
comparator = FaceComparator()
# Procesar imagen 1
print(f"\nImagen 1: {image1_path}")
img1 = cv2.imread(image1_path)
img1_rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
face1 = face_processor.align_face(img1_rgb)
if face1 is None:
print("❌ No se detectó rostro en imagen 1")
return
emb1 = embedding_engine.generate_embedding(face1)
print("✓ Rostro 1 procesado")
# Procesar imagen 2
print(f"\nImagen 2: {image2_path}")
img2 = cv2.imread(image2_path)
img2_rgb = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
face2 = face_processor.align_face(img2_rgb)
if face2 is None:
print("❌ No se detectó rostro en imagen 2")
return
emb2 = embedding_engine.generate_embedding(face2)
print("✓ Rostro 2 procesado")
# Comparar
print("\nComparando...")
confidence_level, similarity = comparator.verify_identity(emb1, emb2)
print("\n" + "=" * 60)
print("RESULTADO")
print("=" * 60)
print(f"Similitud: {similarity:.2%}")
print(f"Distancia: {1-similarity:.3f}")
print(f"Veredicto: {confidence_level}")
if similarity > 0.85:
print("\n✓ Las personas son la misma (Match Seguro)")
elif similarity > 0.72:
print("\n⚠ Posible coincidencia (requiere revisión)")
else:
print("\n❌ Las personas son diferentes")
async def main():
"""Menú principal de ejemplos"""
print("""
╔══════════════════════════════════════════════════════════════╗
║ ALIAH-PLUS EXAMPLES ║
║ Sistema Avanzado de Re-Identificación ║
╚══════════════════════════════════════════════════════════════╝
Selecciona un ejemplo:
1. Búsqueda completa (Face detection + Search + OCR + Cross-ref)
2. Solo extracción OCR de miniatura
3. Comparación directa entre dos rostros
4. Salir
""")
choice = input("Opción (1-4): ").strip()
if choice == "1":
image_path = input("\nRuta de la imagen: ").strip()
await example_complete_search(image_path)
elif choice == "2":
thumbnail_path = input("\nRuta de la miniatura: ").strip()
await example_ocr_only(thumbnail_path)
elif choice == "3":
image1 = input("\nRuta imagen 1: ").strip()
image2 = input("Ruta imagen 2: ").strip()
await example_compare_faces(image1, image2)
elif choice == "4":
print("\nAdiós!")
return
else:
print("\n❌ Opción inválida")
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n\n👋 Interrumpido por el usuario")
except Exception as e:
print(f"\n❌ Error: {e}")