đ§ DĂ©tection de chute Ă partir des points du squelette en 2D
SystÚme simple de détection de chute : Mediapipe, OpenCV et filtre de Kalman
Cet article fait suite Ă notre prĂ©cĂ©dent projet, DAĂO, un tableau mural connectĂ© pour la tĂ©lĂ©assistance de personnes ĂągĂ©es. Nous avons dĂ©jĂ prĂ©sentĂ© rapidement dans un premier article (lien ci-dessous) les caractĂ©ristiques de ce dispositif innovant qui permet notamment de dĂ©tecter les chutes. Ici, nous prĂ©senterons les suites de nos avancĂ©es.
Nous allons nous concentrer sur la mĂ©thode de dĂ©tection de chute que nous avons mise en place, basĂ©e sur lâanalyse des points dâun squelette en 2D.
Pourquoi le squelette en 2D ? Pourquoi pas en 3D ?
LâintĂ©rĂȘt de concevoir un algorithme capable de dĂ©tecter une chute Ă partir des coordonnĂ©es spatiales dâun squelette en 2D plutĂŽt quâen 3D rĂ©side principalement dans la simplicitĂ© de mise en Ćuvre de la dĂ©tection en 2D. En effet, au-delĂ de tous ses inconvĂ©nients, la dĂ©tection Ă partir un squelette en 2D est moins gourmande en ressources matĂ©rielles et logicielles, car on manipule moins de donnĂ©es, ce qui pourrait permettre une mise en place plus rapide et moins coĂ»teuse ; et ce qui lâa rend beaucoup plus simple Ă implĂ©menter quâavec un squelette en 3D.
Cependant, il est important de noter que certes la détection en 3D peut offrir une précision supérieure dans certaines situations, mais que le choix entre la détection en 2D et en 3D dépend des exigences spécifiques de chaque application et du contexte.
Notre méthodologie de détection de chute en 2D
Un systÚme classique de vidéosurveillance [1, 2] est composé de 3 modules :
- Le module de dĂ©tection : permet lâextraction des objets mobiles prĂ©sents sur les images de la sĂ©quence vidĂ©o en les sĂ©parant de lâarriĂšre-plan. Câest une Ă©tape de traitement de bas niveau.
- Le module de suivi : permet une estimation temporelle des trajectoires des différents objets mobiles.
- Le module de reconnaissance : permet de reconnaßtre des comportements suspects et génÚre une prise de décision appropriée à ce comportement.
Pour notre projet de dĂ©tection de chute Ă partir des points dâun squelette en 2D, nous avons construit la pipeline suivante :
En résumé, les étapes sont les suivantes :
- DĂ©tecter les points dâintĂ©rĂȘt du corps
- Suivre la position et lâaccĂ©lĂ©ration de ces points
- Reconnaitre la chute en fonction de seuils de position et dâaccĂ©lĂ©ration atteint par ces points
Ă noter que ces 3 Ă©tapes cardinales structurent cet article.
1. DĂ©tection du corps en mouvement
La dĂ©tection du mouvement constitue la premiĂšre Ă©tape dâun systĂšme de vidĂ©osurveillance, elle permet de dĂ©tecter les objets mobiles sur la scĂšne.
PlutĂŽt que quâune solution simpliste de dĂ©tection de mouvement basĂ©es sur de simples diffĂ©rences dâimages ou de soustraction de fond, pour la dĂ©tection de lâobjet nous avons choisi dâutiliser la bibliothĂšque Mediapipe pour dĂ©tecter directement le corps dâune personne dans la piĂšce.
1.1 DĂ©tection des points de squelette par Mediapipe Pose
En effet, avec MediaPipe Pose nous pouvons dĂ©tecter la pose humaine, câest-Ă -dire les principaux points dâarticulation du corps humain. Cette solution ML nous permet dâextraire 33 points dâarticulation du corps, avec leurs coordonnĂ©es dans un repĂšre 3D, Ă partir dâimages vidĂ©o RVB [4].
Pour notre projet, notre code de dĂ©tection de la posture sera stockĂ© dans le fichier PoseModule.py, dont nous explicitons les fonctionnalitĂ©s dans lâarticle suivant :
Nous nâutiliserons pas la coordonnĂ©e z des points, elle ne nous intĂ©resse plus parce que nous nous restreignons Ă la 2D. Par ailleurs, tous les points dĂ©tectĂ©s par Mediapipe ne nous intĂ©ressent pas. Oui car, en sâinspirant du travail de Zaid Mundher & Jiaofei Zhong [8] sur la dĂ©tection de chute Ă partir de la pose en 2D, parmi tous les points dĂ©tectĂ©s, ceux qui nous intĂ©ressent vraiment pour la dĂ©tection de chute sont ceux : de la tĂȘte, du centre des Ă©paules, du centre du bassin, de la cheville droite et de la cheville gauche. Ils sont marquĂ©s en jaune sur la figure ci-dessous :
DĂšs lors que ces points dâintĂ©rĂȘt sont dĂ©tectĂ©s, il va falloir les suivre.
2. Suivi du corps en mouvement
Le suivi des objets est une Ă©tape importante dans un systĂšme de vidĂ©osurveillance. Il consiste Ă faire une estimation de la position des objets mobiles dans le temps et lâespace du champ de vision afin de dĂ©terminer leur trajectoire Ă travers les images successives dâune sĂ©quence [3].
2.1 Suivi de la position par Mediapipe Pose
De fait, avec Mediapipe Pose câest non seulement la dĂ©tection, mais aussi le suivi de la pose corporelle qui sâopĂšre tout le long de la vidĂ©o.
Lâimage ci-dessus Ă Ă©tĂ© gĂ©nĂ©rĂ©e via les fonctionnalitĂ©s de mon fichier PoseModule.py auxquelles sâajoute la fonction suivante que jâai crĂ©e :
- drawLm : permettant de dessiner les points dâintĂ©rĂȘts du corps sur lâimage
GrĂące Ă Mediapipe Pose, la position des points dâintĂ©rĂȘt du corps est connue en temps rĂ©el. Ă cette mĂ©thode, on va ajouter quelque chose de couramment employĂ©e dans les processus de suivi : le filtre Kalman.
2.2 Suivi de lâaccĂ©lĂ©ration via le filtre de Kalman
Ă quoi sert le filtre de Kalman ? Pour faire simple, le filtre de Kalman est un algorithme de traitement de donnĂ©es rĂ©cursif qui estime lâĂ©tat xâ dâun systĂšme Ă lâinstant t Ă partir des Ă©tats prĂ©cĂ©dents x Ă lâinstant t-1. Ă chaque estimation, nous associons une mesure dâincertitude P (bruit gaussien) [5, 9].
Le filtre fonctionne de maniĂšre cyclique et possĂšde deux phases distinctes â la prĂ©diction et correction :
- PrĂ©diction : On utilise lâĂ©tat estimĂ© pour prĂ©dire lâĂ©tat et lâincertitude actuel.
- Correction : On utilise les observations de nos capteurs pour corriger lâĂ©tat prĂ©dit et obtenir une estimation plus prĂ©cise.
Les étapes récursives du filtre de Kalman sont illustrées ci-dessous :
Voilà à quoi ressemble notre algorithme aprÚs implémentation, celui-ci sera stocké dans le fichier KalmanFilter.py :
Ainsi, lâapplication du filtre de Kalman dans notre projet est le suivant : Ă chaque instant de la vidĂ©o, la position du point dâintĂ©rĂȘt captĂ© par Mediapipe Pose va venir nourrir un filtre de Kalman, et celui-ci va pouvoir donner une prĂ©diction de lâĂ©tat du point dâintĂ©rĂȘt Ă lâimage suivante.
On peut alors tracer la direction de lâaccĂ©lĂ©ration du point dâintĂ©rĂȘt [6] â une flĂšche allant du point prĂ©dit (x, y) au point (x+ax, y+ay) :
<gif exemple suivi point occultĂ©, mais dont lâestimation est effective>
On remarque que le filtre de Kalman permet de suivre un point en mouvement, en estimant sa position y compris en cas dâoccultations.
Pour la suite, nous appliquerons tout simplement ce processus sur les 5 points dâintĂ©rĂȘts du corps, en leur associant respectivement un filtre de Kalman.
3. Classification du corps en mouvement
La derniĂšre phase dâun systĂšme de vidĂ©osurveillance, en gĂ©nĂ©ral, concerne lâanalyse et la reconnaissance des activitĂ©s ou des comportements. Dans un cas comme dans lâautre, le problĂšme de reconnaissance peut ĂȘtre considĂ©rĂ© comme un problĂšme de classification. Il sâagit dâune opĂ©ration de classification supervisĂ©e ou non supervisĂ©e.
Plusieurs outils mathĂ©matiques sont utilisĂ©s dans la reconnaissance : comme les modĂšles de Markov cachĂ©s, les algorithmes de recalage temporel ou encore les rĂ©seaux de neurones artificiels [1, 2]. Mais pour notre projet nous avons fait le choix dâune mĂ©thode de classification beaucoup plus simple : une mĂ©thode non supervisĂ©e basĂ©e essentiellement sur une logique de seuil.
3.1 Seuils sur la position
En effet, comme dit prĂ©cĂ©demment, nous nous sommes Ă©normĂ©ment inspirĂ©s du systĂšme mobile dĂ©tecteur de chute de Zaid Mundher & Jiaofei Zhong [8] : un petit robot, reliĂ© Ă une camĂ©ra Kinect Sensor, qui peut dĂ©tecter les chutes dâune personne ĂągĂ©es. Ce qui nous intĂ©resse plus particuliĂšrement dans leur systĂšme câest que, lorsque le sol nâest pas visible ou dĂ©tectable, lâalgorithme proposĂ© dĂ©pend du systĂšme de coordonnĂ©es spatiales du squelette 2D pour dĂ©tecter les chutes ! Illustration dans la figure ci-dessous :
Ce quâil faut comprendre de lâalgorithme : si la coordonnĂ©e Y des 5 points dâintĂ©rĂȘt est infĂ©rieure Ă un seuil donnĂ©, une chute est dĂ©tectĂ©e.
Pour notre projet, il a fallu rĂ©arranger cet algorithme pour quâil corresponde plus Ă nos spĂ©cificitĂ©s : par exemple pour nous, lâaxe y est orientĂ© vers le bas, ainsi, pour quâune chute soit dĂ©tectĂ©e il faut que la coordonnĂ©e Y des points dâintĂ©rĂȘt soit supĂ©rieure (et non infĂ©rieure) Ă un seuil donnĂ©.
Voilà à quoi ressemble notre algorithme aprÚs implémentation :
Cette fonction sera appelĂ©e Ă chaque image de la vidĂ©o, et ainsi dĂ©terminera Ă tout instant sâil y a potentialitĂ© de chute ou non Ă partir de la position des points dâintĂ©rĂȘt.
Et concernant le seuil, il sera défini automatiquement comme la moitié de la hauteur de la vidéo, via les lignes de codes suivantes :
# Charger la vidéo à partir du fichier
cap = cv2.VideoCapture('video.mp4')
# Initialisation du seuil
frame = cap.read()[1]
seuil_position = frame.shape[0] // 2
Pour la suite, afin de bien mettre en Ă©vidence les rouages de notre fonction PersonFallingDown_position, nous avons crĂ©Ă© une fenĂȘtre pour dessiner la coordonnĂ©e Y des points dâintĂ©rĂȘt avec leur seuil, ainsi quâune deuxiĂšme fenĂȘtre permettant lâanalyse en temps rĂ©el des points par rapport Ă leur seuil via des bandeaux de dĂ©filement [7] :
Cependant, le fait de se baser uniquement sur la position possĂšde plusieurs limites. Par exemple, si une personne se baisse pour rĂ©cupĂ©rer un objet sur le sol ou bien se met par terre pour faire des pompes, cela pourra ĂȘtre traduit comme une potentialitĂ© de chute : cela crĂ©e des faux positifs.
DâoĂč la nĂ©cessitĂ© de trouver une nouvelle variable Ă analyser en dehors de la position. VoilĂ pourquoi nous avons ajoutĂ©, en addition avec la mĂ©thode prĂ©cĂ©dente, une deuxiĂšme mĂ©thode basĂ©e cette fois-ci sur lâaccĂ©lĂ©ration des points dâintĂ©rĂȘt, pour diminuer le nombre de faux positifs.
3.2 Seuils sur lâaccĂ©lĂ©ration
En effet, grĂące au filtre de Kalman nous avons pu estimer la trajectoire future et ainsi lâaccĂ©lĂ©ration de chaque point dâintĂ©rĂȘt. GrĂące Ă lâexistence de ces donnĂ©es, nous implĂ©mentons une mĂ©thode avec un fonctionnement similaire Ă la mĂ©thode prĂ©cĂ©dente, sauf que cette fois-ci : si la coordonnĂ©e Y de lâaccĂ©lĂ©ration de (3 points sur les) 5 points dâintĂ©rĂȘt est supĂ©rieure Ă un seuil donnĂ©, une chute est dĂ©tectĂ©e.
Voilà à quoi ressemble notre algorithme aprÚs implémentation :
Cette fonction sera appelĂ©e Ă chaque image de la vidĂ©o, et ainsi dĂ©terminera Ă tout instant sâil y a potentialitĂ© de chute ou non Ă partir de lâaccĂ©lĂ©ration des points dâintĂ©rĂȘt.
Et concernant le seuil, il sera dĂ©fini automatiquement comme lâun sixiĂšme de la hauteur de la vidĂ©o, via les lignes de codes suivantes :
# Charger la vidéo à partir du fichier
cap = cv2.VideoCapture('video.mp4')
# Initialisation du seuil
frame = cap.read()[1]
seuil_acceleration = frame.shape[0] // 6
Encore une fois, pour la suite, afin de bien mettre en Ă©vidence les rouages de notre fonction PersonFallingDown_acceleration, nous avons crĂ©e une fenĂȘtre pour dessiner la coordonnĂ©e Y des points dâintĂ©rĂȘt avec leur seuil, ainsi quâune deuxiĂšme fenĂȘtre permettant lâanalyse en temps rĂ©el des points par rapport Ă leur seuil via des bandeaux de dĂ©filement [7] :
On remarque que parfois notre fonction PersonFallingDown_acceleration, Ă elle seule, engendre certes quelque faux positif pour la dĂ©tection de chute. Cependant, associĂ©e Ă PersonFallingDown_position, cette mĂ©thode permettra de tomber sur des rĂ©sultats plus satisfaisants â comme on pourra le voir par la suite, dans la partie DĂ©monstration.
3.3 DĂ©termination de lâĂ©tat de chute
Ainsi, lâĂ©tat de chute est liĂ© Ă ce que retourne nos deux fonctions de dĂ©tection de chute. En clair, câest âlâintersectionâ entre les alertes au niveau de la position et celles au niveau de lâaccĂ©lĂ©ration, se matĂ©rialisant par lâopĂ©rateur logique AND entre bool_alarme_position et bool_alarme_acceleration.
Ă noter que dans notre systĂšme, dĂšs lors que la chute est dĂ©tectĂ© : la sĂ©quence est sauvegardĂ©e puis enregistrĂ© dans le dossier sauvegarde, puis un message SMS est envoyĂ© sur le tĂ©lĂ©phone de lâutilisateur (via lâAPI twilio) âŠ
Démonstrations de la détection de chute
Mon projet de détection de chute est disponible sur mon Github.
DAIOProject
âââ DataVideos
â âââ 50WayToFall_extract1.mp4
â âââ ...
â âââ video (27).avi
âââ sauvegarde
â âââ 2023_02_12_00_34_31.avi
â âââ ...
â âââ 2023_02_18_12_56_09.avi
âââ FallDetectionMethod.py
âââ GraphicDesigner.py
âââ KalmanFilter.py
âââ PoseModule.py
âââ TestFallDetection.py
Pour tester le code, il suffit de lancer le fichier TestFallDetection.py.
- DĂ©monstration 1 â une vidĂ©o de chute simple issu du Fall Detection Dataset :
- DĂ©monstration 2 â une vidĂ©o de chutes complexes de Kevin Parry :
- DĂ©monstration 3 â une vidĂ©o de crossfit de RaphaĂ«l Colossus :
Limites de la méthode
Bien quâil ait Ă©tĂ© plaisant de faire une dĂ©monstration de notre mĂ©thode de dĂ©tection de chute Ă partir des points du squelette en 2D, il est maintenant temps dâaborder ses limites, qui â si on les comprend â sont autant dâaxes amĂ©lioration pour la suite.
Limitations dans la détection des points
- Pour commencer, la dĂ©tection des points de squelette par Mediapipe Pose peut ĂȘtre influencĂ©e par des conditions dâĂ©clairage ou de bruit dans lâenvironnement de la personne, ce qui peut fausser la dĂ©tection.
- Ăgalement, si la personne est en parti cachĂ©e par un objet ou que la camĂ©ra est obstruĂ©e, la dĂ©tection peut ĂȘtre moins prĂ©cise, manquer de certains points de squelette, voire complĂštement fausse.
Limitations dans le suivi des points
- Dâailleurs, le suivi des points de squelette par le filtre de Kalman peut ĂȘtre difficile dans des situations complexes oĂč les mouvements sont rapides ou chaotiques, en particulier en raison de ses hypothĂšses linĂ©aires. Ainsi, dans le cas dâune chute (un phĂ©nomĂšne qui nâest pas du tout linĂ©aire), le filtre de Kalman ne sera plus en mesure dâestimer lâĂ©tat du systĂšme de maniĂšre prĂ©cise. Des approches plus avancĂ©es, telles que les filtres de Kalman Ă©tendus (EKF) ou les filtres de particules (PF), peuvent ĂȘtre utilisĂ©es pour surmonter ces limitations.
- En outre, les problĂšmes de camouflage et dâobstruction citĂ©s plus haut qui affectent la dĂ©tection peuvent aussi affecter le suivi des points de squelette. Et tout cela mĂȘme si lâon a vu que lâimplĂ©mentation du filtre de Kalman nous permet dâestimer un Ă©tat dâun point mĂȘme en cas dâoccultation, mais cela est vrai seulement si celle-ci est brusque ; en effet, plus lâoccultation est longue, moins le filtre est corrigĂ© et plus lâestimation est fausse.
Limitations dans la reconnaissance de la chute
- De fait, la reconnaissance de la chute est affectĂ©e par des erreurs de dĂ©tection ou de suivi des points dâintĂ©rĂȘt citĂ©s juste avant, ce qui entraĂźne des faux positifs.
- De plus, la reconnaissance de la chute est biaisĂ© par lâĂ©loignement ou non du corps. Par exemple, plus le corps est Ă©loignĂ©, plus le corps est petit et plus il sera succeptible de franchir les seuils de position de PersonFallingDown_position. Quoi quâil en soit, pour corriger cela, il faudrait peut-ĂȘtre que les seuils de position et dâaccĂ©lĂ©ration soient initialisĂ©es en fonction de la taille de la personne, et non plus en fonction de la taille de lâimage comme nous avons fait.
- Dâune maniĂšre similaire Ă la fonction PersonFallingDown_position, qui engendre des faux positifs si une personne sâallonge au sol pour une raison quelconque, la fonction PersonFallingDown_acceleration peut engendrer des faux positifs si une personne se baisse trop rapidement (cf. DĂ©monstration 3).
Conclusion
En somme, cet article a prĂ©sentĂ© notre mĂ©thode de dĂ©tection de chute Ă partir des points dâun squelette en 2D, pour le projet DAĂO, un tableau mural connectĂ© pour la tĂ©lĂ©assistance de personnes ĂągĂ©es.
Pour dĂ©tecter une chute, nous avons mis en place une pipeline de vidĂ©osurveillance avec trois Ă©tapes clĂ©s : la dĂ©tection des points du corps, le suivi de la position et de lâaccĂ©lĂ©ration de ces points, et la dĂ©termination de la chute en fonction de seuils de position et dâaccĂ©lĂ©ration atteint par ces points.
Cette mĂ©thode de dĂ©tection de chute Ă partir des points dâun squelette en 2D est simple et semble peu gourmande en ressources, mais elle entraĂźne des rĂ©sultats Ă peine prĂ©cis en raison de plusieurs limites : celles propres Ă la bibliothĂšque Mediapipe dans la dĂ©tection du corps, celles dues Ă lâimprĂ©cision du suivi avec filtre de Kalman simple, ou bien celles liĂ©s Ă lâimplĂ©mentation prosaĂŻque de nos fonctions de reconnaissance. Mais il faut aussi compter celles dues tout simplement Ă notre choix du travail uniquement Ă partir du squelette 2D, qui engendre par exemple de la perte dâinformations sur la profondeur et lâorientation du corps.
En fin de compte, notre mĂ©thode reste perfectible. MalgrĂ© tout cela, il faut noter quâelle sâinscrit parfaitement dans lâesprit (et uniquement lâesprit, pour lâinstant) du projet DAĂO, qui vise Ă fournir une solution rapide, simple et peu coĂ»teuse pour dĂ©tecter les chutes chez les personnes ĂągĂ©es â lĂ oĂč la dĂ©tection Ă partir dâun squelette en 3D nous semblait ĂȘtre superflue.
Mlachahe SAID SALIMO.
Références :
1. SystÚme de Vidéosurveillance et Monitoring, DAHMANE Mohamed, 2004
2. DĂ©tection des chutes par calcul homographique, MOKHTARI Djamila, 2012
3. DĂ©tection automatique de chutes de personnes, descripteurs spatio-temporels, Imen CHARFI, 2013
4. MediaPipe Pose, google.github.io
5. Introduction au filtrage de Kalman Théorie du filtre de Kalman discret & applications, JerÎme Verdun, 2006
6. Tuto#36[OpenCV] Filtre de Kalman et suivi dâobjet p.1, L42Project, 2020
7. Tuto#26 [OpenCV] Caméra de surveillance, L42Project, 2020
8. A Real-Time Fall Detection System in Elderly Care Using Mobile Robot and Kinect Sensor, Zaid Mundher & Jiaofei Zhong, 2014
9. La fusion de capteurs, Jeremy Cohen, 2018
Pour allez plus loin :
- Approaches and Principles of Fall Detection for Elderly and Patient, Xinguo Yu, 2008
- Le filtre de Kalman : intĂ©rĂȘts et limites