FaciLock

🧠 Facilock — Backend Python (Flask + Reconnaissance Faciale)

Serveur central du systĂšme Facilock, gĂ©rant la reconnaissance faciale, les interactions matĂ©rielles (bouton, relais, digicode, Ă©cran LCD) et la communication avec l’application mobile via API REST et notifications push.


🚀 FonctionnalitĂ©s principales


⚙ Technologies utilisĂ©es

Domaine Outils / Librairies
Langage Python 3
Serveur web Flask + Flask-CORS
Vision OpenCV, face_recognition
Matériel gpiozero, pyserial
Notifications Expo Push API
Asynchrone threading
SystÚme Raspberry Pi 5 (8 Go), caméra infrarouge, relais, Arduino

đŸ§© SchĂ©ma de fonctionnement

  1. Le systĂšme dĂ©marre et affiche un Ă©cran d’accueil avec l’état du verrou.
  2. Lorsqu’un visiteur appuie sur le bouton, la camĂ©ra s’active pour une durĂ©e limitĂ©e.
  3. Le visage est comparé à la base locale tetes/ :
    • ✅ Si reconnu → ouverture + message LCD + retour Ă  l’accueil.
    • ❌ Si inconnu → enregistrement d’une vidĂ©o, notification push, affichage d’un message d’alerte.
  4. Le systĂšme se reverrouille automatiquement aprĂšs quelques secondes.

📡 API REST

Méthode Endpoint Description
POST /unlock Ouvre manuellement le verrou
GET /notifications Liste les vidéos capturées (visiteurs inconnus)
DELETE /notifications/<id> Supprime une notification vidéo
GET /authorized Liste des personnes autorisées
POST /authorized Ajout d’une personne (via images base64)
PUT /authorized/<old_name> Renommage d’un dossier de visage
DELETE /authorized/<name> Suppression d’une personne
GET /authorized/<name>/images Liste les images associées à un visage
GET /authorized/<name>/image Télécharge une image précise
DELETE /authorized/<name>/image Supprime une image
POST /authorized_capture Capture directe depuis la caméra
POST /api/register_push_token Enregistre un token Expo pour notifications
GET /stream Stream d’évĂ©nements SSE (lock_status en temps rĂ©el)

Toutes les routes nécessitent un token de sécurité :
?token=afsfr-356hytjdhiy-huy5429876njyu-y-gfdrsertgry


đŸ§± Structure du dossier

raspberrypi/
├── app.py                     # Script principal
├── icon/                      # IcĂŽnes affichĂ©es Ă  l'Ă©cran
│   ├── locked.png
│   ├── unlocked.png
│   ├── camera.png
│   ├── close.png
│   └── ...
├── tetes/                     # Dossiers des visages enregistrĂ©s
│   ├── Constant/
│   ├── Ami/
│   └── ...
├── captured_videos/           # VidĂ©os enregistrĂ©es des visiteurs inconnus
├── expo_tokens.json           # Liste des tokens de notification Expo
├── requirements.txt           # DĂ©pendances Python
└── README.md

⚙ Installation

1ïžâƒŁ Cloner le dĂ©pĂŽt

git clone https://github.com/ConstantSegretain/Facilock.git
cd backend

2ïžâƒŁ Installer les dĂ©pendances

Active ton environnement virtuel avant si tu en utilises un.

pip install -r requirements.txt

Contenu de requirements.txt :

flask
flask-cors
requests
opencv-python
face_recognition
gpiozero
pyserial
numpy

3ïžâƒŁ Lancer le backend

python app.py

📍 Le serveur Ă©coute sur http://0.0.0.0:5000.


🧠 Interaction matĂ©rielle

ÉlĂ©ment RĂŽle
Bouton poussoir Déclenche la reconnaissance faciale
Relais Commande le verrou (GPIO16)
Arduino GĂšre le digicode et l’écran LCD (UART /dev/ttyACM0)
Caméra Capture des visages et vidéos
Écran 3.5” Interface utilisateur (affichage OpenCV)

đŸ§© Commandes pour LCD (envoyĂ© Ă  Arduino)

Code Action
W Message d’accueil
R Reconnaissance en cours
U Déverrouillage réussi
A Verrouillage automatique
N Visiteur non reconnu
L Déverrouillage manuel
M Verrouillage manuel
C Code correct
I Code incorrect
B Sonnerie détectée

đŸ§Ÿ Notifications push

L’application mobile enregistre son token Expo via /api/register_push_token.
Lorsqu’un visage inconnu est dĂ©tectĂ©, le backend envoie automatiquement une notification push :

send_notification_async("Facilock", "Visiteur inconnu")

đŸ§© DĂ©tection et capture

Lorsqu’aucun visage n’est reconnu :


🧠 Auteur

Constant Segretain
🎓 Étudiant BTS SIO SISR 📅 AnnĂ©e : 2025
đŸ“« constantsegretain@gmail.com
🌐 github.com/ConstantSeg


« Un backend intelligent pour un verrou intelligent — la clĂ©, c’est vous. »