Estimation du regard
L'estimation du regard renvoie une direction d'observation pour chaque visage d'une image. LibreYOLO la modélise comme une tâche en deux étapes : un détecteur de visages s'exécute d'abord, puis une tête de regard lit l'inclinaison et le lacet dans chaque recadrage de visage obtenu.
Définition
L'estimation du regard renvoie deux angles par visage. result.gaze est une
charge utile Gaze de forme (N, 2), avec l'inclinaison dans la colonne 0 et
le lacet dans la colonne 1, en radians. Ses lignes sont alignées avec
result.boxes, les boîtes des visages détectés. La convention est celle de
L2CS-Net : un lacet positif oriente le regard vers la gauche du sujet et une
inclinaison positive l'oriente vers le bas.
La même charge utile expose pitch_deg et yaw_deg pour les degrés, ainsi que
direction_3d, un vecteur unitaire (N, 3) dans le repère de la caméra, dont
les colonnes sont (x, y, z).
Comme la tâche comporte deux étapes, une prédiction dépend de deux modèles. Les
visages manqués par le détecteur n'ont aucune ligne de regard, et les boîtes mal
placées produisent des angles à partir d'un visage mal recadré. La clé de tâche
canonique est gaze. gaze-estimation est normalisé vers celle-ci.
Modèles
L2CS-Net est l'unique famille qui couvre cette tâche. Elle associe un tronc ResNet à deux têtes parallèles de classification par intervalles angulaires, l'une pour l'inclinaison et l'autre pour le lacet, sur des recadrages de visage de 448 x 448. L'architecture prend en charge cinq profondeurs de backbone, et l'une d'elles, ResNet-50, possède un checkpoint publié.
Les poids sont soumis à une restriction de licence. Ils ont été entraînés sur
Gaze360, dont la licence autorise uniquement la recherche et l'usage non
commercial et interdit la redistribution. LibreYOLO ne reproduit donc aucun
fichier de cette famille. Le seul checkpoint que la bibliothèque peut récupérer
automatiquement provient directement de la distribution Google Drive des
auteurs, par gdown, après affichage des conditions de licence. Lisez la page
L2CS-Net avant tout déploiement.
Ce parcours de téléchargement nécessite l'extra gaze :
pip install "libreyolo[gaze]"Sans cet extra, la bibliothèque affiche des instructions de téléchargement manuel au lieu de tenter le transfert. La prédiction ou l'exportation d'un checkpoint que vous possédez déjà ne nécessite aucun extra.
Prédire
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Sans face_detector, la prédiction revient au détecteur inclus dans# OpenCV. Rien d'autre que le checkpoint n'est donc téléchargé.model = LibreYOLO("LibreL2CSr50.pt")result = model(SAMPLE_IMAGE) gaze = result.gazeprint(gaze.pitch, gaze.yaw) # radians, une ligne par visageprint(gaze.pitch_deg, gaze.yaw_deg) # les mêmes angles en degrésprint(gaze.direction_3d) # vecteurs unitaires (N, 3)# Contrairement au parcours Python, la CLI n'a aucun repli automatique :# les modèles de regard exigent un détecteur de visages explicite, qui# doit être un détecteur LibreYOLO dont les boîtes représentent des visages.libreyolo predict model=LibreL2CSr50.pt source=photo.jpg face_detector=face-detector.pt save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreL2CSr50.pt") # Transmettez à la tête de regard les boîtes d'un détecteur déjà exécuté.result = model(SAMPLE_IMAGE, face_boxes=[[34, 12, 90, 80]]) # Ou indiquez l'un des détecteurs inclus.result = model(SAMPLE_IMAGE, face_detector="yunet")La source des visages se choisit de trois manières. face_boxes transmet des
boîtes déjà calculées et ignore la détection. face_detector accepte "auto",
"haar", "yunet", un modèle de détection LibreYOLO ou une simple fonction,
et peut être défini sur le constructeur ou à chaque appel. S'il est omis en
Python, la prédiction revient au détecteur inclus dans OpenCV. Un appel simple
fonctionne donc sans raccordement. Avec OpenCV 4, il s'agit de la cascade Haar
incluse dans la wheel, qui ne demande aucun téléchargement. Avec OpenCV 5, où
l'API Haar a été supprimée, il s'agit de YuNet, qui récupère une fois un petit
fichier de modèle depuis OpenCV Zoo.
La CLI ne partage pas ce mécanisme de repli. libreyolo predict refuse un
modèle de regard dépourvu de face_detector=. La valeur attendue est le nom
d'un détecteur LibreYOLO ou le chemin d'un checkpoint. Consultez la page
prédiction pour les sources, le streaming et la gestion des
résultats.
Entraîner
Aucune famille de cette tâche ne s'entraîne dans LibreYOLO.
LibreL2CS.train() déclenche une erreur. Entraînez le modèle dans le projet
L2CS-Net amont, puis chargez ici le dictionnaire d'état obtenu.
Valider
La validation sur des datasets de vérité terrain du regard n'entre pas dans le
périmètre et val() déclenche une erreur au lieu de renvoyer des métriques
qu'elle n'a pas calculées. Cette tâche ne possède aucun dictionnaire
metrics/. Effectuez l'évaluation dans le projet amont, sur le dataset utilisé
pour entraîner le checkpoint.
Exporter
from libreyolo import LibreYOLO model = LibreYOLO("LibreL2CSr50.pt")model.export(format="onnx")libreyolo export model=LibreL2CSr50.pt format=onnxLe contrat d'exportation du regard couvre ONNX, TorchScript, ExecuTorch,
TensorRT et OpenVINO. Seuls le tronc ResNet et les deux têtes d'intervalles
angulaires quittent la bibliothèque. Le graphe reçoit un recadrage de visage
448 x 448 prétraité et renvoie les logits bruts du lacet et de l'inclinaison.
La détection des visages, le recadrage, le softmax, l'espérance des intervalles
et la conversion en angles restent tous en Python, dans
libreyolo.models.l2cs.utils. Consultez la page exportation
pour les formats et leurs arguments.