kyc-backend / setup_models.py
supraptin's picture
Fix: correct InsightFace model directory structure (root/models/name)
26d5d83
"""
Model Setup Script for KYC POC
This script downloads and sets up the required ML models:
1. AuraFace - Face recognition model from HuggingFace
2. Silent-Face-Anti-Spoofing - Liveness detection models from GitHub
Run this script before starting the application:
python setup_models.py
"""
import os
import sys
import shutil
import subprocess
from pathlib import Path
def setup_auraface():
"""Download AuraFace model from HuggingFace."""
print("=" * 50)
print("Setting up AuraFace model...")
print("=" * 50)
try:
from huggingface_hub import snapshot_download
# InsightFace expects models at {root}/models/{name}/
# So we download to insightface_models/models/auraface/
model_dir = Path("insightface_models/models/auraface")
model_dir.mkdir(parents=True, exist_ok=True)
print("Downloading AuraFace-v1 from HuggingFace...")
snapshot_download(
repo_id="fal/AuraFace-v1",
local_dir=str(model_dir),
local_dir_use_symlinks=False
)
print(f"AuraFace model downloaded to: {model_dir}")
return True
except ImportError:
print("ERROR: huggingface_hub not installed. Run: pip install huggingface-hub")
return False
except Exception as e:
print(f"ERROR downloading AuraFace: {e}")
return False
def setup_silent_face_anti_spoofing():
"""Clone Silent-Face-Anti-Spoofing repository and copy models."""
print("\n" + "=" * 50)
print("Setting up Silent-Face-Anti-Spoofing...")
print("=" * 50)
repo_dir = Path("Silent-Face-Anti-Spoofing")
models_dir = Path("models/anti_spoof")
# Clone repository if not exists or is empty
if not repo_dir.exists() or not any(repo_dir.iterdir()):
print("Cloning Silent-Face-Anti-Spoofing repository...")
# Remove empty directory if it exists
if repo_dir.exists():
shutil.rmtree(repo_dir)
try:
result = subprocess.run(
["git", "clone", "--depth", "1", "https://github.com/minivision-ai/Silent-Face-Anti-Spoofing.git"],
capture_output=True,
text=True
)
if result.returncode != 0:
print(f"ERROR cloning repository: {result.stderr}")
return False
print("Repository cloned successfully.")
except FileNotFoundError:
print("ERROR: git not found. Please install git and try again.")
return False
else:
print("Repository already exists, skipping clone.")
# Copy model files
models_dir.mkdir(parents=True, exist_ok=True)
# Copy anti_spoof_models
src_anti_spoof = repo_dir / "resources" / "anti_spoof_models"
dst_anti_spoof = models_dir / "anti_spoof_models"
if src_anti_spoof.exists():
if dst_anti_spoof.exists():
shutil.rmtree(dst_anti_spoof)
shutil.copytree(src_anti_spoof, dst_anti_spoof)
print(f"Copied anti_spoof_models to: {dst_anti_spoof}")
else:
print(f"WARNING: {src_anti_spoof} not found")
# Copy detection_model
src_detection = repo_dir / "resources" / "detection_model"
dst_detection = models_dir / "detection_model"
if src_detection.exists():
if dst_detection.exists():
shutil.rmtree(dst_detection)
shutil.copytree(src_detection, dst_detection)
print(f"Copied detection_model to: {dst_detection}")
else:
print(f"WARNING: {src_detection} not found")
return True
def verify_models():
"""Verify all required model files exist."""
print("\n" + "=" * 50)
print("Verifying model files...")
print("=" * 50)
required_files = [
# AuraFace models (InsightFace expects {root}/models/{name}/)
"insightface_models/models/auraface",
# Anti-spoofing models
"models/anti_spoof/anti_spoof_models",
"models/anti_spoof/detection_model",
]
all_exist = True
for file_path in required_files:
path = Path(file_path)
exists = path.exists()
status = "OK" if exists else "MISSING"
print(f" [{status}] {file_path}")
if not exists:
all_exist = False
return all_exist
def main():
"""Main setup function."""
print("\n" + "#" * 60)
print("# KYC POC - Model Setup")
print("#" * 60 + "\n")
# Change to script directory
script_dir = Path(__file__).parent
os.chdir(script_dir)
success = True
# Setup AuraFace
if not setup_auraface():
success = False
# Setup Silent-Face-Anti-Spoofing
if not setup_silent_face_anti_spoofing():
success = False
# Verify all models
if not verify_models():
success = False
print("\n" + "#" * 60)
if success:
print("# Setup completed successfully!")
print("# You can now run the application with: uvicorn app.main:app --reload")
else:
print("# Setup completed with errors. Please check the messages above.")
print("#" * 60 + "\n")
return 0 if success else 1
if __name__ == "__main__":
sys.exit(main())