This is an old revision of the document!
Gaussian Mixture Model (GMM) on Riemannian manifold
Principe
Cette approche étend les modèles à mélanges Gaussien aux variétés Riemanniennes où les données de rotation comme les quaternions sont naturellement représentées. Plus d'information théorique peut être trouvé dans l'article:
- M J A Zeestraten, I Havoutis, J Silvério, S Calinon and D G Caldwell. An Approach for Imitation Learning on Riemannian Manifolds. IEEE Robotics and Automation Letters (RA-L) 2(3):1240–1247, June 2017
Dans notre cas, la variété Riemannienne étudiée est la combinaison des espaces cartésiens (position) et Riemanniens (orientation) de chaque articulation du squelette humain formant l'espace de la pose humaine. Plus d'information peut être trouvé dans l'article:
- Maxime Devanne, Sao Mai Nguyen. Multi-level Motion Analysis for Physical Exercises Assessment in Kinaesthetic Rehabilitation. IEEE-RAS International Conference on Humanoid Robots 2017, Birmingham, UK.
Code
Le code suivant est en matlab. Une version python de l'extension des GMM sur les variétés Riemannienne peut être trouvée ici: https://gitlab.martijnzeestraten.nl/martijn/riepybdlib
Il y a deux fichiers principaux, un pour l'apprentissage d'un modèle à partir de démonstrations, l'autre pour l'évaluation d'une séquence à partir d'un modèle appris.
- 1. Apprentissage
Le script 'mainEvaluation.m' permet d'apprendre un modèle à partir de démonstrations. Les premières lignes définissent les paramètres qui sont expliqués dans le code. Principalement, les paramètres qui changeront en fonction du nombre de données d'apprentissage sont:
%% Parameters nbData = 300; %Number of datapoints nbSamples =2; %Number of demonstrations trainName={'data/Assis3Maxime/'}; % folders names from where to load data nspp=2; %number of skeleton sequence per folder
nbData
est le nombre de trames à laquelle chaque séquence sera échantillonnée.
nbSamples
est le nombre de séquences qui seront chargées et utilisées pour l'apprentissage
trainName
est le nom de chaque dossier où récupérer les données
nspp=2;
est le nombre de séquence de squelette à charger dans chaque dossier. Si la valeur est 2, les séquence 1 et 2 seront chargées depuis chaque dossier.
Tout d'abord on charge les données de squelettes d'apprentissage.
%% Data processing trainName={'data/Assis3Maxime/'}; [model,xIn,uIn,xOut,uOut] = processTrainingData(model,trainName,nspp,registration,fastDP,filt,est,rem,ws,nbData); % data projected on tangent spaces of the human pose space u = [uIn; uOut{1}.data; uOut{2}.data; uOut{3}.data; uOut{4}.data; uOut{5}.data; uOut{6}.data; uOut{7}.data; uOut{8}.data; uOut{9}.data; uOut{10}.data; uOut{11}.data; uOut{12}.data; uOut{13}.data; uOut{14}.data; uOut{15}.data]; % original data x (positions 3D and quaternions) in the human pose space x = [xIn; xOut{1}.data; xOut{2}.data; xOut{3}.data; xOut{4}.data; xOut{5}.data; xOut{6}.data; xOut{7}.data; xOut{8}.data; xOut{9}.data; xOut{10}.data; xOut{11}.data; xOut{12}.data; xOut{13}.data; xOut{14}.data; xOut{15}.data]; model.x=x;