Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
poppy-kine:gmmriemannian [2018/11/29 14:48] m16devan [Code] |
poppy-kine:gmmriemannian [2020/07/03 17:25] (current) mai ↷ Page moved from gmmriemannian to poppy-kine:gmmriemannian |
||
|---|---|---|---|
| Line 106: | Line 106: | ||
| La première partie du code concerne les paramètres qui sont similaires aux parties décrites plus haut. | 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 | + | |
| + | 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> | ||