XMM - Probabilistic Models for Motion Recognition and Mapping

xmmHierarchicalHmm.hpp
Go to the documentation of this file.
1 /*
2  * hierarchical_hmm.h
3  *
4  * Hierarchical Hidden Markov Model for Continuous Recognition and Regression
5  * (Multi-class)
6  *
7  * Contact:
8  * - Jules Francoise <jules.francoise@ircam.fr>
9  *
10  * This code has been initially authored by Jules Francoise
11  * <http://julesfrancoise.com> during his PhD thesis, supervised by Frederic
12  * Bevilacqua <href="http://frederic-bevilacqua.net>, in the Sound Music
13  * Movement Interaction team <http://ismm.ircam.fr> of the
14  * STMS Lab - IRCAM, CNRS, UPMC (2011-2015).
15  *
16  * Copyright (C) 2015 UPMC, Ircam-Centre Pompidou.
17  *
18  * This File is part of XMM.
19  *
20  * XMM is free software: you can redistribute it and/or modify
21  * it under the terms of the GNU General Public License as published by
22  * the Free Software Foundation, either version 3 of the License, or
23  * (at your option) any later version.
24  *
25  * XMM is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28  * GNU General Public License for more details.
29  *
30  * You should have received a copy of the GNU General Public License
31  * along with XMM. If not, see <http://www.gnu.org/licenses/>.
32  */
33 
34 #ifndef xmm_lib_hierarchical_hmm_h
35 #define xmm_lib_hierarchical_hmm_h
36 
37 #include "../../core/model/xmmModel.hpp"
38 #include "../gmm/xmmGmm.hpp"
39 #include "xmmHmmSingleClass.hpp"
40 
41 namespace xmm {
47 class HierarchicalHMM : public Model<SingleClassHMM, HMM> {
48  public:
52  static const double DEFAULT_EXITTRANSITION() { return 0.1; }
53 
58  HierarchicalHMM(bool bimodal = false);
59 
64  HierarchicalHMM(HierarchicalHMM const& src);
65 
70  explicit HierarchicalHMM(Json::Value const& root);
71 
77 
79 
85  virtual void removeClass(std::string const& label);
86 
90  virtual void clear();
91 
93 
95 
97  void addExitPoint(int state, float proba);
98 
100 
102 
107  virtual void reset();
108 
115  virtual void filter(std::vector<float> const& observation);
116 
118 
120 
126  virtual Json::Value toJson() const;
127 
133  virtual void fromJson(Json::Value const& root);
134 
136 
137  // /**
138  // @brief Convert to bimodal HierarchicalHMM in place
139  // @param dimension_input dimension of the input modality
140  // @throws runtime_error if the model is already bimodal
141  // @throws out_of_range if the requested input dimension is too
142  // large
143  // */
144  // void makeBimodal(unsigned int dimension_input);
145  //
146  // /**
147  // @brief Convert to unimodal HierarchicalHMM in place
148  // @throws runtime_error if the model is already unimodal
149  // */
150  // void makeUnimodal();
151  //
152  // /**
153  // @brief extract a submodel with the given columns
154  // @param columns columns indices in the target order
155  // @throws runtime_error if the model is training
156  // @throws out_of_range if the number or indices of the requested
157  // columns exceeds the current dimension
158  // @return a HierarchicalHMM from the current model considering only
159  // the target columns
160  // */
161  // HierarchicalHMM extractSubmodel(std::vector<unsigned int>&
162  // columns)
163  // const;
164  //
165  // /**
166  // @brief extract the submodel of the input modality
167  // @throws runtime_error if the model is training or if it is not
168  // bimodal
169  // @return a unimodal GMM of the input modality from the current
170  // bimodal model
171  // */
172  // HierarchicalHMM extractSubmodel_input() const;
173  //
174  // /**
175  // @brief extract the submodel of the output modality
176  // @throws runtime_error if the model is training or if it is not
177  // bimodal
178  // @return a unimodal HierarchicalHMM of the output modality from
179  // the current bimodal model
180  // */
181  // HierarchicalHMM extractSubmodel_output() const;
182  //
183  // /**
184  // @brief extract the model with reversed input and output
185  // modalities
186  // @throws runtime_error if the model is training or if it is not
187  // bimodal
188  // @return a bimodal HierarchicalHMM that swaps the input and
189  // output modalities
190  // */
191  // HierarchicalHMM extract_inverse_model() const;
192 
197 
201  std::vector<double> prior;
202 
207  std::vector<double> exit_transition;
208 
212  std::vector<std::vector<double>> transition;
213 
214  protected:
220  virtual void joinTraining();
221 
227 
232  void updatePrior();
233 
238  void updateTransition();
239 
244 
245  virtual void addModelForClass(std::string const& label);
246 
250  void normalizeTransitions();
251 
264  void forward_init(std::vector<float> const& observation);
265 
278  void forward_update(std::vector<float> const& observation);
279 
288  void likelihoodAlpha(int exitNum,
289  std::vector<double>& likelihoodVector) const;
290 
294  void updateResults();
295 
300 
304  std::vector<double> frontier_v1_;
305 
309  std::vector<double> frontier_v2_;
310 };
311 }
312 
313 #endif
Results of the filtering/inference process (for a Model with multiple classes).
Definition: xmmModelResults.hpp:80
std::vector< double > prior
Prior probabilities of the models.
Definition: xmmHierarchicalHmm.hpp:201
std::vector< std::vector< double > > transition
Transition probabilities between models.
Definition: xmmHierarchicalHmm.hpp:212
static const double DEFAULT_EXITTRANSITION()
Default exit transition for the highest level.
Definition: xmmHierarchicalHmm.hpp:52
bool forward_initialized_
Defines if the forward algorithm has been initialized.
Definition: xmmHierarchicalHmm.hpp:299
std::vector< double > frontier_v2_
intermediate Forward variable (used in Frontier algorithm)
Definition: xmmHierarchicalHmm.hpp:309
void updateTransition()
ergodic learning: update high-level transition matrix
Definition: xmmHierarchicalHmm.cpp:125
void updateResults()
Update the results (Likelihoods)
Definition: xmmHierarchicalHmm.cpp:464
virtual void filter(std::vector< float > const &observation)
filters a incoming observation (performs recognition or regression)
Definition: xmmHierarchicalHmm.cpp:389
Probabilistic machine learning model for multiclass recognition and regression.
Definition: xmmModel.hpp:52
void updateTransitionParameters()
update high-level parameters when a new primitive is learned
Definition: xmmHierarchicalHmm.cpp:110
virtual Json::Value toJson() const
Write the object to a JSON Structure.
Definition: xmmHierarchicalHmm.cpp:499
Results< HMM > results
Convert to bimodal HierarchicalHMM in place.
Definition: xmmHierarchicalHmm.hpp:196
void likelihoodAlpha(int exitNum, std::vector< double > &likelihoodVector) const
get instantaneous likelihood
Definition: xmmHierarchicalHmm.cpp:328
virtual void removeClass(std::string const &label)
Remove a specific class by label.
Definition: xmmHierarchicalHmm.cpp:356
virtual void reset()
Resets the fitering process (recognition or regression)
Definition: xmmHierarchicalHmm.cpp:361
std::vector< double > exit_transition
exit probabilities of the model (probability to finish and go back to the root)
Definition: xmmHierarchicalHmm.hpp:207
std::vector< double > frontier_v1_
intermediate Forward variable (used in Frontier algorithm)
Definition: xmmHierarchicalHmm.hpp:304
void normalizeTransitions()
Normalize segment level prior and transition matrices.
Definition: xmmHierarchicalHmm.cpp:92
void updateExitProbabilities()
Update exit probabilities of each sub-model.
Definition: xmmHierarchicalHmm.cpp:135
void forward_init(std::vector< float > const &observation)
Initialization of the Forward Algorithm for the hierarchical HMM. see: Jules Francoise. Realtime Segmentation and Recognition of Gestures using Hierarchical Markov Models. Master’s Thesis, Université Pierre et Marie Curie, Ircam, 2011. [http://articles.ircam.fr/textes/Francoise11a/index.pdf].
Definition: xmmHierarchicalHmm.cpp:146
virtual void joinTraining()
Finishes the background training process by joining threads and deleting the models which training fa...
Definition: xmmHierarchicalHmm.cpp:105
virtual void clear()
Remove All models.
Definition: xmmHierarchicalHmm.cpp:78
Hierarchical Hidden Markov Model for Continuous Recognition and Regression (Multi-class) ...
Definition: xmmHierarchicalHmm.hpp:47
void forward_update(std::vector< float > const &observation)
Update of the Forward Algorithm for the hierarchical HMM. see: Jules Francoise. Realtime Segmentation...
Definition: xmmHierarchicalHmm.cpp:203
Definition: xmmAttribute.hpp:42
HierarchicalHMM & operator=(HierarchicalHMM const &src)
Assignment.
Definition: xmmHierarchicalHmm.cpp:63
void addExitPoint(int state, float proba)
Definition: xmmHierarchicalHmm.cpp:85
virtual void addModelForClass(std::string const &label)
Update training set for a specific label.
Definition: xmmHierarchicalHmm.cpp:141
HierarchicalHMM(bool bimodal=false)
Constructor.
Definition: xmmHierarchicalHmm.cpp:36
virtual void fromJson(Json::Value const &root)
Read the object from a JSON Structure.
Definition: xmmHierarchicalHmm.cpp:519
void updatePrior()
ergodic learning update high-level prior probabilities -> equal prior probs
Definition: xmmHierarchicalHmm.cpp:121