Comment la mesure fonctionne

La photopléthysmographie à distance — ce que la caméra voit réellement, pourquoi les contraintes existent, et ce qui se passe entre le navigateur et le résultat.

Le principe optique

Le sang absorbe la lumière. Pas uniformément, pas entièrement, mais assez.

À chaque battement du cœur, le volume de sang dans le lit capillaire situé juste sous la peau monte puis redescend. Comme ce sang absorbe une partie de la lumière qui tombe sur la peau, la quantité de lumière réfléchie change au même rythme. La peau devient très légèrement plus sombre lorsque l’onde de pouls arrive, et très légèrement plus claire lorsqu’elle passe.

La variation est bien trop faible pour qu’une personne la voie. Elle ne l’est pas pour qu’un capteur de caméra l’enregistre, à condition de savoir où regarder et de moyenner sur assez de pixels et assez d’images.

C’est la photopléthysmographie — « écrire le volume avec la lumière ». Menée avec un capteur au contact, c’est la technique derrière la pince au doigt d’un patient hospitalisé. Menée à distance, avec une caméra ordinaire et la lumière ambiante, c’est la photopléthysmographie à distance, ou rPPG. C’est ce que fait Saphere.

Des images à une onde

Quatre choses se produisent, dans cet ordre.

Un modèle de repères faciaux localise le visage. Non pour identifier quiconque — pour trouver la géométrie. Le modèle tourne dans le navigateur, sur chaque image, et rapporte où se trouve le visage et comment il est orienté.

Des régions de peau stables sont retenues. Pas l’image entière, ni même le visage entier. La mesure échantillonne les régions où la peau est fine, bien irriguée et relativement immobile — le front avant tout. Les yeux, la bouche et les cheveux sont exclus : ils bougent, et le mouvement est du bruit.

Ces régions sont réduites à des nombres, image par image. Chaque image contribue par un petit jeu de valeurs moyennées plutôt que par une image. C’est pourquoi une mesure transmet bien moins qu’une vidéo, et pourquoi la capture est bornée en taille quelle que soit la proximité de la personne.

La série accumulée devient une onde de pouls. Sur une trentaine de secondes, les valeurs par image tracent une courbe périodique. Sa fréquence fondamentale est la fréquence cardiaque. L’espacement entre battements donne la variabilité. Une modulation plus lente qui la chevauche donne la fréquence respiratoire. Les caractéristiques morphologiques de l’onde, combinées à ce que vous nous avez dit de la personne, alimentent les autres indicateurs.

Pourquoi les contraintes sont ce qu’elles sont

Chaque exigence de la présentation découle du paragraphe ci-dessus.

La lumière doit tomber sur le visage, pas derrière lui. Le signal est de la lumière réfléchie. Avec une fenêtre lumineuse derrière le sujet, la caméra expose pour la fenêtre ; le visage tombe dans l’ombre et la composante réfléchie dont la mesure a besoin se comprime en une poignée de valeurs sombres. Il n’y a rien à récupérer.

La lumière ne doit pas changer pendant la capture. Un nuage qui passe, un écran qui change de couleur, quelqu’un qui allume une lampe : chacun inscrit dans le signal une variation plus grande que le pouls, et que l’amplitude seule ne permet pas d’en distinguer.

La personne doit rester immobile. Quand le visage bouge, les régions échantillonnées se déplacent sur d’autres parties de la peau, sous d’autres angles par rapport à la source lumineuse, et sur d’autres parties du capteur. La variation qui en résulte est énorme devant la variation cardiaque.

Le visage doit être découvert et dans le cadre. La peau que la caméra ne voit pas ne contribue à rien. Un visage partiellement hors cadre donne moins de régions exploitables et une moyenne plus bruitée.

C'est pourquoi le widget a un avis

Saphere Scan consacre ses premiers écrans à la posture, à l’éclairage, au cadrage et à l’immobilité avant même d’ouvrir la caméra. Ces écrans ne sont pas décoratifs — ce sont le moyen le moins coûteux d’augmenter la proportion de mesures qui aboutissent. Vous pouvez en retirer n’importe lequel, mais les retirer a un coût.

La chaîne, de bout en bout

Une mesure en direct par le widget passe par cinq étapes.

1 — Le widget obtient un jeton. Au début de chaque mesure, il demande à votre application un jeton d’accès court. Votre serveur l’émet à partir de votre clé d’API. Le widget ne voit jamais la clé.

2 — La caméra s’ouvre et la personne est guidée dans le cadre. Le modèle de repères faciaux tourne localement. Rien n’a encore été transmis.

3 — La capture dure une trentaine de secondes. Les images sont réduites dans le navigateur et acheminées vers le serveur de mesure par un websocket, acquittées à mesure qu’elles arrivent. Un réseau dégradé ralentit l’envoi mais ne perd pas de données ; le widget le rapporte.

4 — Le serveur calcule. Quand la dernière image est acquittée, le widget envoie un marqueur de fin de mesure et attend. Le traitement a lieu côté serveur.

5 — Le résultat revient par la même connexion, est validé, et remis à votre gestionnaire onEvent sous la forme d’un measure:result. Il est également conservé, de sorte que vous puissiez relire la même mesure par l’API ensuite.

Pour un fichier enregistré, les quatre premières étapes se replient en un seul appel HTTP : vous envoyez la vidéo ou les images en POST, le serveur fait lui-même la réduction des images, et la réponse est la mesure aboutie.

Où vont les données

Les images sont réduites dans le navigateur avant transmission — ce qui quitte l’appareil est un signal numérique tiré des régions échantillonnées, non un enregistrement vidéo de l’utilisateur. La mesure aboutie, son signal et les userData que vous avez fournis sont conservés sur votre compte client et restent lisibles par l’API jusqu’à ce que vous les supprimiez.

Supprimer une mesure

DELETE /measures/{measureId} retire la mesure conservée ainsi que les médias qui lui appartiennent. Si votre produit promet aux utilisateurs qu’un scan ne laisse rien derrière lui, c’est cet appel qui tient la promesse.