Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
poppy-kine:gmmriemannian [2018/11/29 14:48] m16devan [Code] |
poppy-kine:gmmriemannian [2018/11/29 15:00] m16devan [Code] |
||
---|---|---|---|
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> |