🧪 De nouveaux tutoriels arrivent — du bras robotique au capteur
Aller au contenu

Chapitre 4 : Détection de visage ​

Acheter en boutique

Objectif de ce chapitre : faire détecter les visages à l'image par le NanoCam, tracer le cadre du visage et les points clés, puis lire les coordonnées pour un contrôle externe.

Principe ​

La détection de visage utilise la bibliothèque d'apprentissage profond ESP-DL, basée sur le modèle de détection léger MobileNet. Entrée : une image 320x240 RGB565 ; sortie : une liste de boîtes englobantes de visages (position + taille + confiance). L'inférence s'exécute sur l'ESP32-S3, sans connexion réseau.

Format des résultats de détection ​

  • Coordonnées : coin supérieur gauche (x,y) + largeur et hauteur (w,h)
  • Confiance : nombre flottant entre 0 et 1
  • En présence de plusieurs visages, plusieurs cadres sont renvoyés

Étapes ​

4.1 Changer de mode ​

Plain
ai_mode:2

Pour la liste complète des commandes, voir le Manuel du protocole série.

4.2 Observer le résultat ​

Dans le navigateur, http://<IP> affiche le cadre de détection de visage.

4.3 Obtenir les coordonnées ​

Format de sortie du port série :

Plain
I (xxxxx) detection_result: [ 0]: ( 45,  30, 180, 210)
I (xxxxx) detection_result:       left eye: ( 90,  80), right eye: (150,  80), nose: (120, 120), mouth left: ( 95, 150), mouth right: (145, 150)
  • Première ligne : [index] (x, y, w, h) — coordonnées du cadre du visage
  • Deuxième ligne : 5 points clés — œil gauche, œil droit, nez, commissure gauche des lèvres, commissure droite des lèvres

Code ​

Arduino : lire les coordonnées et piloter un servomoteur ​

C++
// Analyser le format $face:x,y,w,h#
if (nanoSerial.available()) {
    String line = nanoSerial.readStringUntil('\n');
    if (line.startsWith("$face:")) {
        int x = line.substring(6).toInt();
        int y = line.substring(line.indexOf(',')+1).toInt();
        servoX.write(map(x, 0, 320, 0, 180));
    }
}

Lecture en Python ​

Python
ser = serial.Serial("COM3", 115200)
line = ser.readline().decode()
if line.startswith("$face:"):
    parts = line[6:-1].split(",")
    x, y, w, h = map(int, parts)

Résultat ​

Un visage apparaît devant la caméra → l'image est annotée d'un cadre vert → les coordonnées sont envoyées sur le port série.

Chapitre suivant : Chapitre 5 : Détection de visage de chat