Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
poppy-kine:gmmriemannian [2018/11/29 14:47]
m16devan [Code]
poppy-kine:gmmriemannian [2020/07/03 17:25] (current)
mai ↷ Page moved from gmmriemannian to poppy-kine:gmmriemannian
Line 104: Line 104:
     * 3. Apprentissage des erreurs     * 3. Apprentissage des erreurs
 Le script '​learnErrorFeatures.m'​ permet d'​apprendre les erreurs possibles pour un exercice. L'​idée est d'​apprendre à partir d'​erreurs simulées la différence entre ces erreurs et le mouvement idéal. Ces différences sont apprise par un modèle SVM (Support Vector Machine) qui permet lors de l'​analyse du mouvement de classifier l'​erreur détectée comme une erreur déjà apprise. Le script '​learnErrorFeatures.m'​ permet d'​apprendre les erreurs possibles pour un exercice. L'​idée est d'​apprendre à partir d'​erreurs simulées la différence entre ces erreurs et le mouvement idéal. Ces différences sont apprise par un modèle SVM (Support Vector Machine) qui permet lors de l'​analyse du mouvement de classifier l'​erreur détectée comme une erreur déjà apprise.
 +
 +La première partie du code concerne les paramètres qui sont similaires aux parties décrites plus haut.
 +
 +Ensuite, la seconde partie permet de charger le modèle d'​exercice idéal ainsi qu'un exercice de référence:​
 +<code matlab>
 +% model
 +load modelExo3
 +exo=3;
 +
 +% data correct train 
 +dirTrain='​data/​Assis3Maxime/';​
 +fnameTrain='​SkeletonSequence1.txt';​
 +[oriMatTrain,​posMatTrain,​dataTrain] = loadData(dirTrain,​fnameTrain,​filt,​est,​rem,​ws,​nbData);​
 +cuts=[0 model.cuts 300];
 +</​code>​
 +
 +La troisième partie du code génère les caractéristiques d'​erreurs pour chaque fichier d'​erreur correspondant à la différence entre le mouvement d'​erreur et le mouvement idéal appris. Ces différences sont calculées séparément par partie du corps et par segment temporel de l'​exercice. ​
 +<code matlab>
 +% data Erreur train
 +cptErr=0;
 +for err=[1 2 3]
 +    cptErr=cptErr+1;​
 +    dirTrain=sprintf('​data/​ErreursAssis3Maxime/​erreur%i/',​err);​
 +    for nf=1:nspp
 +        fnameTrain=sprintf('​SkeletonSequence%i.txt',​nf-1);​
 +        [oriMatTrainErr{nf},​posMatTrainErr{nf},​dataTrainErr{nf}] = loadData(dirTrain,​fnameTrain,​filt,​est,​rem,​ws,​nbData);​
 +        [dataTrainErr{nf},​r,​allPoses,​poses,​motion,​distFI] = temporalAlignmentEval(model,​ dataTrain,​dataTrainErr{nf},​fastDP);​
 +    end
 +    Mtr=[];​Mte=[];​
 +    for c=1:​length(cuts)-1
 +        for bp=1:3
 +            diff1=[];​diff2=[];​
 +            for nf=1:nspp
 +                diff{nf}=[];​
 +            end
 +            for t=cuts(c)+1:​cuts(c+1)
 +                for i=(bp-1)*3+1:​(bp-1)*3+3
 +                    for nf=1:nspp
 +                        diff{nf}=[diff{nf} logmap(dataTrainErr{nf}{i}.data(:,​t),​dataTrain{i}.data(:,​t))'​];​
 +                    end
 +                end
 +                if bp<3
 +                    for i=(bp-1)*3+10:​(bp-1)*3+12
 +                        for nf=1:nspp
 +                            diff{nf}=[diff{nf} (dataTrain{i}.data(:,​t)-dataTrainErr{nf}{i}.data(:,​t))'​];​
 +                        end
 +                    end
 +                end
 +            end
 +            Mtr{c}.bodypart{bp}=[];​
 +            for nf=1:nspp
 +                Mtr{c}.bodypart{bp}=[Mtr{c}.bodypart{bp};​ diff{nf}];
 +            end
 +        end
 +    end
 +    Train{cptErr}=Mtr;​
 +end
 +</​code>​
 +Il y a principalement deux choses à modifier dans cette partie. La première et le nombre de type d'​erreurs. Dans l'​exemple il y a 3 types d'​erreurs //[1 2 3]//. La seconde variable à modifier est le chemin vers le dossier où sont stockés les exemples d'​erreur //​dirTrain//​. A l'​intérieur de ce dossier, il doit y avoir //n// dossiers appelés //​erreur#​n//​ où //#n// est remplacé par le numéro d'​erreur.
 +
 +La quatrième partie concerne l'​apprentissage du modèle SVM à partir des erreurs:
 +<code matlab>
 +% Learning SVM Modèle
 +for c=1:​length(Train{1})
 +    for bp=1:​length(Train{1}{c}.bodypart)
 +        X=[];Y=[];
 +        for err=1:​cptErr
 +            X=[X;​Train{err}{c}.bodypart{bp}];​
 +            Y=[Y;​err;​err];​
 +        end
 +        u=unique(Y);​
 +        numClasses=length(u);​
 +        for k=1:​numClasses
 +            G1vAll=(Y==u(k));​
 +            svmModelsSegmented{c}.bodypart{bp}.models{k} = fitcsvm(X,​G1vAll,'​KernelScale','​auto','​Standardize',​true);​
 +            svmModelsSegmented{c}.exercise=exo;​
 +        end
 +        G1vAll=ones(size(G1vAll));​
 +        svmModelsSegmented{c}.bodypart{bp}.errorModel = fitcsvm(X,​G1vAll,'​KernelScale','​auto','​Standardize',​true);​
 +    end
 +end
 +</​code>​
 +
 +Enfin, la dernière partie permet de sauvegarder le modèle SVM (le nom //fname// peut être modifié) :
 +<code matlab>
 +% Save
 +fname=sprintf('​errorFeatures/​errorFeaturesModelAssis3Maxime'​);​
 +save(fname,'​svmModelsSegmented'​);​
 +</​code>​
 +
  • poppy-kine/gmmriemannian.1543502822.txt.gz
  • Last modified: 2019/04/25 14:08
  • (external edit)