face_landmarks_multi_face.py
# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2025 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Cet exemple présente le modèle MediaPipe Face Landmark Detection de Google pour plusieurs visages.
#
# REMARQUE : cet exemple nécessite une caméra OpenMV dotée d'un NPU, comme l'AE3 ou le N6, pour fonctionner en temps réel.
import csi
import time
import ml
from ml.preprocessing import Normalization
from ml.postprocessing.mediapipe import BlazeFace
from ml.postprocessing.mediapipe import FaceLandmarks
# Initialiser le capteur.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
# BlazeFace nécessite une image carrée pour de meilleurs résultats.
# FaceLandmarks fonctionne avec des images non carrées issues des recadrages de BlazeFace.
csi0.window((400, 400))
# Charger le modèle intégré de détection de visages
face_detection = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(face_detection)
# Charger le modèle intégré de points de repère du visage
face_landmarks = ml.Model("/rom/face_landmarks_192.tflite", postprocess=FaceLandmarks(threshold=0.4))
print(face_landmarks)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces est une liste de tuples ((x, y, w, h), score, keypoints)
for r, score, keypoints in face_detection.predict([img]):
# rect est (x, y, w, h) - agrandi par 2 pour le modèle de points de repère du visage
wider_rect = (r[0] - r[2] // 2, r[1] - r[3] // 2, r[2] * 2, r[3] * 2)
# Opérer uniquement sur la ROI du visage détecté
n = Normalization(roi=wider_rect)
# marks est une liste de tuples ((x, y, w, h), score, keypoints)
for r, score, keypoints in face_landmarks.predict([n(img)]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints est un ndarray de forme (468, 3) où chaque point clé est (x, y, z)
ml.utils.draw_keypoints(img, keypoints, radius=0, color=(255, 0, 0))
print(clock.fps(), "fps")