Expérience interactive de reconnaissance faciale pour JPO Data & IA. Thème : Cyberpunk / Sci-Fi / Terminal
Ce projet est une installation interactive conçue pour un stand de Journée Portes Ouvertes (JPO). Il démontre les capacités de l'Intelligence Artificielle (Computer Vision) à travers une expérience ludique et immersive.
Le système permet aux visiteurs de créer un "Passeport Numérique" via leur smartphone, puis d'être reconnus biométriquement par une caméra sur le stand.
Le projet repose sur une architecture hybride (Mobile + Serveur + Stand) :
- Mobile (Client) : Interface web pour la capture photo avec choix (Pseudo / Anonyme).
- Serveur (API) : Réception des images, vectorisation (DeepFace) et stockage sécurisé.
- Stand (Python App) : Application de vision par ordinateur qui identifie en continu de multiples utilisateurs simultanément.
- Éducation : Une page explicative détaillant le fonctionnement technique (Vecteurs, Distance Euclidienne).
JPO_PROJECT/
│
├── deploy_o2switch/ # ☁️ PARTIE SERVER (Hébergée)
│ ├── generator.py # Script d'augmentation de données (Server-side)
│ ├── passenger_wsgi.py # Point d'entrée WSGI pour O2Switch
│ ├── server_api.py # API FastAPI (Réception des photos)
│ ├── requirements.txt # Dépendances serveur
│ └── static/ # 📱 FRONT-END
│ ├── explication.html # Page pédagogique (Architecture du système)
│ ├── index.html # App mobile (Capture V2 : Pseudo/Anonyme)
│ └── qrcode_modern.min.js
│
├── station_stand/ # 🖥️ PARTIE STAND (Autonome)
│ ├── assets/ # 🖼️ Ressources graphiques
│ ├── main_stand.py # 🔥 Script Principal (Boucle OpenCV Multi-User)
│ ├── ui.py # 🎨 Gestion de l'interface (HUD, Textes)
│ ├── config.toml # ⚙️ Configuration (Couleurs, Chemins, URL)
│ ├── config.py # Chargeur de configuration
│ ├── logger.py # 🪵 Système de logs
│ ├── recognizer.py # Moteur IA (Face Recognition & Matching)
│ ├── synchronizer.py # Thread de synchro (Téléchargement des profils)
│ ├── locks.py # Gestion Thread-Safety (AI Lock)
│ ├── generator.py # Augmentation de données (Client-side)
│ ├── requirements.txt # 📦 Dépendances Stand (Exclusif)
│ ├── station_stand.log # 📝 Fichier de logs (Auto-généré)
│ └── shared_data/ # BDD Locale (Profils synchronisés)
│
├── requirements-dev.txt # 🛠️ Dépendances de développement (Racine)
└── README.md # Documentation du projet
Les fichiers doivent être hébergés sur un serveur (ex: o2switch) accessible en HTTPS.
- Placer les fichiers de
deploy_o2switch/static/danspublic_html/static/. - S'assurer que le dossier
shared_data(créé par l'API) a les permissions d'écriture.
Le script tourne sur une machine (PC/Mac) équipée d'une webcam.
Prérequis :
- Python 3.8+
- Webcam fonctionnelle
Installation :
pip install -r station_stand/requirements.txtLancement :
python station_stand/main_stand.py- Le visiteur accède à l'app web (
index.html) via un QR code générique. - Identification :
- Option A (Anonyme) : Il clique sur "RESTER ANONYME". Un ID unique (ex:
ID-A8F2) est généré. - Option B (Pseudo) : Il entre un pseudo (ex:
ROMAIN). Le système gère les doublons automatiquement en interne.
- Option A (Anonyme) : Il clique sur "RESTER ANONYME". Un ID unique (ex:
- Capture :
- Une interface "Guide" (cadre central) l'aide à positionner son visage.
- Il prend la photo -> Animation "Terminal" -> Confirmation.
- Le visiteur passe devant la caméra du stand.
- Mode Continu : Le stand détecte et identifie automatiquement tous les visages connus dans le champ de vision.
- Feedback Visuel :
- Connu : Cadre Vert + Affichage du Pseudo/ID.
- Inconnu : Cadre Rouge HUD.
- Sidebar : Liste des utilisateurs identifiés à gauche de l'écran.
L'opérateur du stand dispose de raccourcis clavier pour gérer la session :
R(Reload) : Force le rechargement immédiat de tous les profils depuis le dossier partagé (réinitialise aussi le timer de rechargement auto de 5min).E(Empty/Archive) : Archive tous les profils actuels dans un dossierarchives/YYYYMMDD_...et vide la mémoire vive pour repartir à zéro (ex: changement de groupe d'élèves).ECHAP: Quitter l'application.
- Un QR Code permanent en bas à droite de l'écran invite à comprendre la technologie.
- Il redirige vers
explication.htmlqui détaille le pipeline (Detection -> Embedding -> Matching).
L'interface utilise une palette "Cyberpunk" définie dans les variables CSS et les constantes Python.
Couleurs principales :
- 🟠 Neon Orange :
#FF7700(BGR:0, 119, 255) - Actions & Alertes - 🔵 Neon Cyan :
#00FFFF(BGR:255, 255, 0) - Données & Système - ⚫ Dark BG :
#050505(BGR:10, 10, 10) - Fond
Polices :
- Titres :
Orbitron(Google Fonts) - Data/Code :
Share Tech Mono(Google Fonts)
- L'upload reste bloqué sur l'animation : Vérifiez la connexion internet du téléphone ou les logs du serveur (
error_log). - La caméra ne s'ouvre pas (Mobile) : Vérifiez que le site est bien en HTTPS (obligatoire pour
getUserMedia). - Lag sur le stand : Réduisez la résolution de capture dans
main_stand.pyou la fréquence de détection faciale.