# Automatic Cued Speech / LfPC automatisée

<figure><img src="image_1.png" /></figure>

La réalité augmentée au service des personnes sourdes

## Livrable WP1 - L4 : Détection des mains et du visage du locuteur

### Contexte et objectifs

#### Description du corpus

CLeLfPC - Corpus de Lecture en LfPC, contient des enregistrements audio/vidéo de lecture à voix haute en codant en Langue française Parlée Complétée. Le corpus a été enregistré en août 2021 à l'occasion du stage organisé par l'ALPC (https://alpc.asso.fr).

Le corpus est constitué des enregistrements de 25 thèmes par 23 participants. Une série de 10 thèmes de lecture avait été établie, elle peut être consultée à cette adresse : https://sppas.org/LFPC/.

Chacun des 10 thèmes se compose de 4 sessions distinctes :

1. enregistrement audio/vidéo de 32 syllabes "CV" isolées (1 seule clé produite pour chaque syllabe),

2. enregistrement audio/vidéo de 32 mots ou expressions,

3. enregistrement audio/vidéo de phrases isolées,

4. enregistrement audio/vidéo d'un texte.

#### Objectif

Le corpus doit être enrichi d'annotations pour pouvoir être exploité dans le cadre de ce projet. Ce livrable concerne les **annotations de la main codeuse et du visage**. Pour chaque image de chaque vidéo, nous cherchons à déterminer les coordonnées de points spécifiques, à savoir 21 sur la main et 68 sur le visage. L'analyse de ces coordonnées permettra de modéliser la cible atteinte par la main et son inclinaison durant le codage.

Il est à noter que dans le cadre de ce projet, nous n'analyserons pas les mouvements des doigts, ni la vitesse de déplacement de la main.
# Outils et méthode d'annotation

## Généralités

Nous avons apporté des améliorations au système implémenté dans SPPAS pour générer automatiquement les annotations. Ce système fonctionne en différentes étapes pour optimiser la qualité du résultat, même si c'est au détriment de la rapidité. Sur un ordinateur de bureau, chaque vidéo d'environ 3 minutes a nécessité environ 30 minutes de temps de traitement, soit 10 fois temps réel. Ces traitements ont pour but de générer des coordonnées pour la main codeuse et pour le visage.

Voici les étapes implémentées pour détecter les points du visage :

1. utilisation d'un système existant de détection automatique de visage, ou, utilisation de plusieurs systèmes et fusion de leurs résultats,

2. assignation d'une identité aux différents visages détectés sur les images.

Voici les étapes implémentées pour détecter les points de la main codeuse :

1. utilisation d'un système existant de détection automatique du corps humain,

2. utilisation d'un système existant pour détecter la main et ses points sur les régions sélectionnées pour la main droite et pour la main gauche.

Les différents traitements automatiques sont opérés soit par la bibliothèque OpenCV, soit par bibliothèque Mediapipe.

La bibliothèque OpenCV s'est imposée comme un standard dans le domaine de la recherche parce qu'elle propose un nombre important d'outils issus de l'état de l'art en dans le domaine de la "vision par ordinateurs". En outre, il existe des modèles de visages sous licence libres disponibles sur le web pour cette bibliothèque.

Mediapipe est une bibliothèque qui permet de réaliser différentes tâches de détections automatiques, également dans le domaine de la vision. Contrairement à OpenCV, Mediapipe est une solution toute-en-un, peu paramétrable, et qui inclue les modèles des systèmes proposés.

* En savoir plus sur OpenCV ⚙️

* En savoir plus sur Mediapipe ⚙️

* Voir les démos Mediapipe ⚙️

# Détection des points du visage du locuteur

## Problématique

Dans le domaine de la *vision par ordinateur* la détection d'objets consiste à détecter la présence et la localisation précise d'un ou plusieurs objects dans une image donnée. La détection de visages humains est donc un cas particulier de la détection d'objets, mais la tâche est rendue plus difficile à cause de la forte variabilité intra-classe (couleur de peau, présence de lunettes, géométrie des visages, orientation, ...). Lorsqu'il s'agit d'une vidéo, cette détection s'effectue indépendamment sur chacune des images de la vidéo.

De nombreux problèmes surviennent si on veut suivre le visage d'une personne dans une vidéo. Dans la mesure où la détection des visages s'effectue indépendamment d'une image à l'autre, un "visage" peut apparaître ou disparaître sur une image au milieu d'une séquence. Effectivement, le système ne garantit pas de détecter uniquement le visage de la seule personne présente dans nos vidéos : sur certaines images, le visage ne sera pas détecté, sur d'autres, plusieurs résultats peuvent être proposés. Par ailleurs, rien ne relie le visage d'une personne sur une image à son visage dans l'image suivante. Ainsi, il n'y a pas de cohérence dans la taille de l'objet détecté sur des images consécutives. Enfin, contrairement
* PC-Desktop, Windows 10, processeur Intel i7-6700k : 15 secondes

Versions utilisées : SPPAS 4.18, Python 3.11, OpenCV 4.9.0.

# OpenCV + Artificial Neural Network (modèle TensorFlow)

En savoir plus...

<figure><img src="image_2.png" /></figure>

## Vidéo du résultat de détection de visage avec un réseau de neurones profond

### ▼ Voir la ligne de commande

Pour obtenir cette vidéo, il faut lancer la ligne de commande suivante :

```
.sppaspyenv~/bin/python ./sppas/bin/facedetection.py -i demo/demo.webm -r resources/faces/ opencvFace detector uint8.pb --tag=true -o demo_opencv
```

Temps d'exécution :

* MacBook Pro, Sonoma 14.2, processeur Apple M2 Max : 15 secondes

* PC-Desktop, Windows 10, processeur Intel i7-6700k : 16 secondes

Versions utilisées : SPPAS 4.18, Python 3.11, OpenCV 4.9.0.

# Détection avec Mediapipe

## Vidéo du résultat de détection de visage avec Mediapipe

### ▼ Voir la ligne de commande

Pour obtenir cette vidéo, il faut lancer la ligne de commande suivante :

```
.sppaspyenv~/bin/python ./sppas/bin/facedetection.py -i demo/demo.webm -r mediapipe --tag=true -o demo_mediapipe
```

Temps d'exécution :

* MacBook Pro, Sonoma 14.2, processeur Apple M2 Max : 11 secondes

* PC-Desktop, Windows 10, processeur Intel i7-6700k : 12 secondes

Versions utilisées : SPPAS 4.18, Python 3.11, Mediapipe 0.10.9.

# Solution apportée

## Détection des visages

Fusion des résultats de plusieurs modèles. Selon les locuteurs du corpus, nous avons activé différents modèles afin d'obtenir le meilleur résultat possible. Notamment, nous avons activé le HaarCascade lorsque les systèmes à base de réseaux de neurones ne détectaient pas suffisamment souvent le visage du locuteur.

## Vidéo du résultat de détection de visage avec SPPAS

### ▼ Voir la ligne de commande

Pour obtenir cette vidéo, il faut lancer la ligne de commande suivante :

```
.sppaspyenv~/bin/python ./sppas/bin/facedetection.py -I demo/demo.webm --model: opencvFace detector uint8.pb=true --model: haarcascade_frontalface_alt.xml=true
```
--model:res10_300x300_ssd_iter_140000FP16.caffemodel=false

--model:mediapipe=true

Temps d'exécution :

■ MacBook Pro, Sonoma 14.2, processeur Apple M2 Max : 54 secondes

■ PC-Desktop, Windows 10, processeur Intel i7-6700k : 168 secondes

Versions utilisées : SPPAS 4.18, Python 3.11, OpenCV 4.9.0, Mediapipe 0.10.9.

## Identification des personnes

Cette annotation automatique attribue une identité de personne aux visages détectés d'une vidéo. Elle prend en entrée une vidéo et un fichier annoté avec les coordonnées des visages détectés, et elle produit un fichier annoté avec les coordonnées des visages identifiés. Contrairement à la reconnaissance faciale, cette annotation ne requiert pas d'avoir appris a priori un modèle des personnes présentes. Cette annotation permet également d'effectuer un "lissage" des coordonnées du visage dans les séquences d'images de la vidéo.

Pour notre corpus, deux vidéos sont générées : la vidéo initiale avec le visage de la personne identifiée, et une vidéo au format selfie de la personne identifiée.

► Vidéo d'identification de la personne -- SPPAS (personne entière)

► Vidéo d'identification de la personne -- SPPAS (selfie)

### ▼ Voir la ligne de commande

Pour obtenir cette vidéo, il faut lancer la ligne de commande suivante :

```
./sppaspyenv~/bin/python ./sppas/bin/faceidentity
```

Temps d'exécution :

■ MacBook Pro, Sonoma 14.2, processeur Apple M2 Max : 36 secondes

■ PC-Desktop, Windows 10, processeur Intel i7-6700k : 64 secondes

Versions utilisées : SPPAS 4.18, Python 3.11, OpenCV 4.9.0, Mediapipe 0.10.9.

## Détection des points sur le visage

La détection de points sur le visage, appelée "Face Landmark", est opérée à la fois par Mediapipe et par OpenCV avec un modèle libre obtenu sur le web. Leurs résultats sont ensuite fusionnés par SPPAS pour obtenir un résultat unique.

Il est d'usage que ces méthodes déterminent 68 coordonnées de points sur le visage. En revanche, Mediapipe est un "Face Mesh", c'est-à-dire qu'il détermine 435 points que SPPAS réduit aux 68 qui nous intéressent, comme illustré dans l'image ci-après :
<figure><img src="image_3.png" /></figure>

Le résultat est visible sur la vidéo ci-dessous.

# Détection des points de la main du locuteur

## Problématique

La problématique ici et de déterminer où se trouve la main dans chacune des images de la vidéo. Comme pour la détection de visage la difficulté réside dans le fait que le système n'a pas de connaissance a priori. Il considère ainsi qu'il est possible qu'il y ait plusieurs mains dans chaque image, et il n'effectue aucun suivi d'une image à l'autre.

Pour réaliser cette tâche, nous avons utilisé l'outil de détection Hand Landmark Detection⁷, inclue également dans Mediapipe. Il permet en effet de détecter les mains, à la manière d'une détection d'objet. Nous avons cependant été contraint d'adapter cette solution afin qu'elle ne détecte que deux mains par image : une seule main droite et une seule main gauche.

<figure><img src="image_4.png" /></figure>

0. WRIST
1. THUMB_CMC
2. THUMB_MCP
3. THUMB_IP
4. THUMB_TIP
5. INDEX_FINGER_MCP
6. INDEX_FINGER_PIP
7. INDEX_FINGER_DIP
8. INDEX_FINGER_TIP
9. MIDDLE_FINGER_MCP
10. MIDDLE_FINGER_PIP

11. MIDDLE_FINGER_DIP
12. MIDDLE_FINGER_TIP
13. RING_FINGER_MCP
14. RING_FINGER_PIP
15. RING_FINGER_DIP
16. RING_FINGER_TIP
17. PINKY_MCP
18. PINKY_PIP
19. PINKY_DIP
20. PINKY_TIP

# Solution apportée

## Détection des membres

La solution que nous avons apportée dans SPPAS commence par la détection des membres. Pour se faire, nous avons utilisé l'outil "Pose Landmark Detection" proposé également par dans Mediapipe. Pour
chaque image de la vidéo, il détecte les corps entiers des personnes avec des coordonnées associées à chacun de leurs membres.

Lorsqu'il n'y a pas d'erreur de détection (une et une seule personne est détectée), nous pouvons déterminer les régions de l'image dans lesquelles se situent chacune des deux mains. Avec cette annotation, nous disposons d'ores et déjà de quatre coordonnées de points spécifiques sur chaque main.

<figure><img src="image_5.png" /></figure>

0. nose

1. leftEye_inner

2. leftEye

3. leftEye_outer

4. rightEye_inner

5. rightEye

6. rightEye_outer

7. leftEar

8. rightEar

9. mouth_left

10. mouth_right

11. leftShoulder

12. rightShoulder

13. leftElbow

14. rightElbow

15. leftWrist

16. rightWrist

17. left_pinky

18. right_pinky

19. left_index

20. right_index

21. leftThumb

22. rightThumb

23. leftHip

24. rightHip

25. leftKnee

26. rightKnee

27. leftAnkle

28. rightAnkle

29. left heel

30. right heel

31. left foot_index

32. right foot_index

## Détection des mains

À ce stade, nous avons sélectionné deux régions spécifiques de l'image d'origine afin d'effectuer la détection de chaque main. Pour chacune de ces deux régions, nous appliquons l'outil de détection de mains, de manière classique. Dans cette situation, il y a deux possibilités :

1. soit l'outil de détection a détecté une main et une seule dans la région de l'image, donc nous disposons du résultat attendu, à savoir les coordonnées de 21 points.

2. soit le système n'a pas détecté la main, et nous utilisons les quatre coordonnées déterminées par l'annotation précédente.

## Exemples du résultat obtenu

Vidéos générées automatiquement avec le logiciel SPPAS - version 4.18 :
<figure><img src="image_6.png" /><figcaption>► Transcription de la vidéo</figcaption></figure>

<caption>► Audio de la vidéo</caption>
<figure><img src="image_7.png" /></figure>

► Transcription de la vidéo

► Audio de la vidéo

# Licences

## Vidéos et annotations

Les fichiers vidéos et les annotations sont déposés sous les termes des deux licences suivantes :

- Licence Creative Commons - Attribution 4.0 International, CC-By-NC-4.0

- Licence avec obligation de partage à l'identique ODbL-1.0 : ODC Open Database License (ODbL) version 1.0, conformément à la réglementation française (loi pour une république numérique, 2016).

Ils peuvent être téléchargés à partir de la version 8 du dépôt https://www.ortolang.fr/ par tout membre d'un Etablissement Supérieur de la Recherche. Pour toute autre demande, envoyer un e-mail à brigitte.bigi[.at.]cnrs.fr.

Tout usage non prévu ne sera pas autorisé.

## Logiciels
SPPAS est déposé sous les termes de la licence publique GNU GPL ✉️, v3.

OpenCV (pour Open Computer Vision) est une bibliothèque graphique libre, initialement développée par Intel, spécialisée dans le traitement d'images en temps réel. La société de robotique Willow Garage et la société ItSeez se sont succédé au support de cette bibliothèque. Depuis 2016 et le rachat de ItSeez par Intel, le support est de nouveau assuré par Intel. Cette bibliothèque est distribuée sous les termes de la licence libre BSD ® (Berkeley Software Distribution License). Wikipédia

Mediapipe est distribué par Google sous les termes de la licence libre Apache ® version 2.0.

## Contributeurs

Annotation du corpus : Brigitte Bigi

Développement logiciel : Brigitte Bigi

## À propos

* Rédaction du document : Brigitte Bigi

* Licence du document : GNU documentation libre - FDL 1.3

* URL de ce document : https://auto-cuedspeech.org/wp1l4.html

* Dernière mise à jour : mars 2024

FIRAH

RECHERCHE
APPLIQUÉE SUR
LE HANDICAP

APPLIED
DISABILITY
RESEARCH

Projet financé par la FIRAH (2023-2026)

<figure><img src="image_8.png" /></figure>

PAROLE ET
LANGAGE

<figure><img src="image_9.png" /></figure>

<figure><img src="image_10.png" /></figure>

<figure><img src="image_11.png" /></figure>

<figure><img src="image_12.png" /></figure>

<figure><img src="image_13.png" /></figure>

Copyright © Brigitte Bigi, CNRS 2023-2024
<figure><img src="image_14.png" /></figure>