Comment la mesure fonctionne
Comment une caméra lit un pouls, pourquoi la mesure exige ce qu’elle exige, et ce qui se passe entre le navigateur et le résultat.
Comment la lumière porte un pouls
Le sang absorbe la lumière. Pas toute, et pas uniformément, mais assez pour qu’une caméra le remarque.
À chaque battement du cœur, un peu plus de sang remplit les tout petits vaisseaux situés juste sous la peau. Ce sang absorbe une partie de la lumière qui tombe sur le visage, si bien qu’un peu moins de lumière est renvoyée. La peau s’assombrit légèrement quand l’onde du pouls arrive, et s’éclaircit quand elle passe.
Ce changement est bien trop faible pour être vu à l’œil nu. Un capteur de caméra peut l’enregistrer, à deux conditions : savoir quelles zones du visage regarder, et faire une moyenne sur beaucoup de pixels et beaucoup d’images.
Cette technique s’appelle la photopléthysmographie, ce qui signifie « écrire le volume avec la lumière ». Avec un capteur posé sur la peau, c’est ce que fait la pince au doigt d’un patient à l’hôpital. À distance, avec une caméra ordinaire et la lumière du jour, on parle de photopléthysmographie à distance, ou rPPG. C’est ce que fait Saphere.
Des images à une onde de pouls
Quatre choses se produisent, dans cet ordre.
Un modèle repère le visage. Pas pour reconnaître qui que ce soit, seulement pour savoir où le visage se trouve et comment il est tourné. Ce modèle tourne dans le navigateur, sur chaque image.
Les zones de peau les plus stables sont sélectionnées. Pas l’image entière, ni même tout le visage. La mesure utilise les endroits où la peau est fine, bien irriguée et bouge peu — le front avant tout. Les yeux, la bouche et les cheveux sont écartés, parce qu’ils bougent, et que le mouvement est du bruit.
Chaque image est recadrée et allégée. Le widget ne garde que le visage, et seulement le canal de couleur qui porte le signal du pouls. Cela représente le quart des données d’une image en couleur, et c’est pourquoi une mesure envoie bien moins qu’une vidéo. C’est pourquoi une mesure envoie beaucoup moins de données qu’une vidéo, et pourquoi la quantité envoyée ne dépend pas de la distance à laquelle la personne se tient.
Ces nombres, mis bout à bout, dessinent une onde. Sur une trentaine de secondes, ils tracent une courbe régulière. La fréquence à laquelle elle se répète donne la fréquence cardiaque. L’écart entre les battements donne la variabilité. Un mouvement plus lent porté par-dessus donne la fréquence respiratoire. La forme de l’onde, combinée à ce que vous nous avez dit de la personne, donne les autres indicateurs.
Pourquoi les exigences sont ce qu’elles sont
Chaque exigence énumérée dans ce qu’est Saphere découle directement des paragraphes ci-dessus.
La lumière doit tomber sur le visage, pas derrière lui. Le signal est de la lumière renvoyée. Si une fenêtre lumineuse se trouve derrière la personne, la caméra règle son exposition sur la fenêtre et le visage tombe dans l’ombre. Ce dont la mesure a besoin est alors comprimé dans une poignée de valeurs sombres, et rien ne peut le 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, qu’on ne peut pas en distinguer.
La personne doit rester immobile. Quand le visage bouge, les zones sélectionnées glissent sur d’autres parties de la peau, reçoivent la lumière sous un autre angle et tombent sur une autre partie du capteur. La variation ainsi produite est bien plus grande que celle du cœur.
Le visage doit être découvert et dans le cadre. La peau que la caméra ne voit pas n’apporte rien. Un visage en partie hors du cadre laisse moins de zones exploitables, et une moyenne plus bruitée.
C'est pour cela que le widget insiste
Saphere Scan consacre ses premiers écrans à la posture, à la lumière, au cadrage et à l’immobilité, avant même d’ouvrir la caméra. Ces écrans ne sont pas décoratifs. Ils sont le moyen le moins coûteux d’augmenter la part des mesures qui aboutissent. Vous pouvez en retirer n’importe lequel, mais le retirer a un coût.Le parcours complet, 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 de courte durée. Votre serveur le délivre à l’aide de votre clé d’API. Le widget ne voit jamais la clé elle-même.
2 — La caméra s’ouvre et la personne est guidée en position. Le modèle de détection de visage tourne sur l’appareil. Rien n’en est encore sorti.
3 — La capture dure une trentaine de secondes. Chaque image est réduite dans le navigateur, puis envoyée au serveur de mesure, qui accuse réception de chacune. Un réseau lent étire cette étape mais ne perd rien, et le widget vous le signale.
4 — Le serveur calcule. Une fois la dernière image acquittée, le widget signale la fin de la capture et attend. Le calcul se fait sur le serveur.
5 — Le résultat revient par la même connexion. Il est vérifié, puis remis à votre gestionnaire onEvent sous la forme measure:result. Il est aussi conservé, de sorte que vous pouvez relire la même mesure plus tard par l’api.
Pour un fichier enregistré, les quatre premières étapes se réduisent à un seul appel HTTP : vous envoyez la vidéo ou les images, le serveur fait lui-même la réduction, et sa réponse est la mesure terminée.
Où vont les données
Deux choses différentes quittent l’appareil, et il vaut la peine de savoir exactement ce qu’est chacune.
Pendant la capture, quelque neuf cents petites images sont envoyées. Chacune est recadrée sur le visage — le reste de l’image est jeté sur l’appareil — et réduite à un seul canal de couleur, celui qui porte le pouls. Cela fait un octet par pixel au lieu de quatre, ce qui explique qu’une mesure soit bien plus légère qu’une vidéo de même durée.
Une seule fois, à la moitié de la capture, une photographie complète est envoyée. C’est ce dont ont besoin les variables qui se lisent sur le visage : l’âge apparent, et l’indice de masse corporelle estimé depuis le visage. C’est une vraie image de ce que la caméra voit à cet instant.
Ensuite, la mesure terminée est conservée sous votre compte, avec le signal dont elle a été calculée et les userData que vous avez fournis. Elle reste lisible par l’api jusqu’à ce que vous la supprimiez.
Supprimer une mesure
DELETE /measures/{measureId} retire la mesure conservée et les médias qui vont avec. Si votre produit promet à ses utilisateurs qu’un scan ne laisse rien derrière lui, c’est cet appel qui tient la promesse.