face_landmarks_single_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 un seul visage.
#
# 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)

# Variables de suivi.
n = None

clock = time.clock()
while True:
    clock.tick()
    img = csi0.snapshot()

    if n is None:
        # 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)

    else:
        # marks est une liste de tuples ((x, y, w, h), score, keypoints)
        marks = face_landmarks.predict([n(img)])

        # Aucun visage détecté, réinitialiser le tracker.
        if not marks:
            n = None
            continue

        # Dessiner des boîtes englobantes autour des visages détectés et des points clés.
        for r, score, keypoints in marks:
            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))

            # Centrer new_wider_rect sur le visage pour le suivi
            new_wider_rect = (r[0] + (r[2] // 2) - (wider_rect[2] // 2),
                              r[1] + (r[3] // 2) - (wider_rect[3] // 2),
                              wider_rect[2],
                              wider_rect[3])
            # Opérer uniquement sur la ROI du visage détecté
            n = Normalization(roi=new_wider_rect)

    print(clock.fps(), "fps")

results matching ""

    No results matching ""