/// \fn public void UpdateHMMFromSerializedValues() /// /// \brief Deserialize All gestures values into their origin format /// /// \author Khoubaeib Klai | [email protected] /// \date 24/04/2014 public void UpdateHMMFromSerializedValues() { List <AKN_HiddenMarkovModel <int> > l_hmms = new List <AKN_HiddenMarkovModel <int> >(); for (int i = 0; i < nb_states.Count; i++) { if (nb_states[i] != 0 && nb_observations[i] != 0) { AKN_HiddenMarkovModel <int> hmm = new AKN_HiddenMarkovModel <int>(nb_states[i], nb_observations[i], m_gesturesName[i]); int indexPreviousStates = 0; for (int j = 0; j < i; j++) { indexPreviousStates += nb_states[j]; } int indexPreviousObservations = 0; for (int j = 0; j < i; j++) { indexPreviousObservations += nb_states[j]; } hmm.MSetStates( statesProbabilities.GetRange(indexPreviousStates, nb_states[i]).ToArray(), statesNames.GetRange(indexPreviousStates, nb_states[i]).ToArray()); int indexPreviousTransitions = 0; for (int j = 0; j < i; j++) { indexPreviousTransitions += (nb_states[j] * nb_states[j]); } float[] trs = transitions.GetRange(indexPreviousTransitions, (nb_states[i] * nb_states[i])).ToArray(); for (int j = 0; j < nb_states[i]; j++) { for (int k = 0; k < nb_states[i]; k++) { hmm.MSetTransition(j, k, trs[(j * nb_states[i]) + k]); } } hmm.MSetObservations(observations.GetRange(indexPreviousObservations, nb_observations[i]).ToArray()); int indexPreviousEmissions = 0; for (int j = 0; j < i; j++) { indexPreviousEmissions += (nb_states[j] * nb_observations[j]); } float[] ems = emissions.GetRange(indexPreviousEmissions, (nb_states[i] * nb_observations[i])).ToArray(); for (int j = 0; j < nb_states[i] * nb_observations[i]; j++) { hmm.MSetEmissionByIndex(j, ems[j]); } l_hmms.Add(hmm); } else { l_hmms.Add(null); } } m_HMMs = l_hmms; }
/// \fn private AKN_HiddenMarkovModel<int> _MSetTransitions(AKN_HiddenMarkovModel<int> _gestureHmm) /// /// \brief Update constructed Hmm with new transitions values. /// /// \author Khoubaeib Klai | [email protected] /// \date 24/04/2014 /// /// \param _gestureHmm HMM to update. /// /// \return new HMM with updated values. private AKN_HiddenMarkovModel <int> _MSetTransitions(AKN_HiddenMarkovModel <int> _gestureHmm) { for (int j = 0; j < _gestureHmm.m_StatesCount; j++) { _gestureHmm.MSetTransition((j * _gestureHmm.m_StatesCount) + j, 0.4F); } for (int k = 0; k < _gestureHmm.m_StatesCount - 1; k++) { _gestureHmm.MSetTransition((k * _gestureHmm.m_StatesCount) + k + 1, 0.35F); } for (int k = 0; k < _gestureHmm.m_StatesCount - 2; k++) { _gestureHmm.MSetTransition((k * _gestureHmm.m_StatesCount) + k + 2, 0.25F); } _gestureHmm.MSetTransition(((_gestureHmm.m_StatesCount - 1) * _gestureHmm.m_StatesCount) + _gestureHmm.m_StatesCount - 1, 1F); return(_gestureHmm); }
/// \fn private void _MShowTransitionsValuesAtState(int _index) /// /// \brief Show transition probabilites from a specific state. /// /// \author Khoubaeib Klai | [email protected] /// \date 24/04/2014 /// /// \param _index index of the state private void _MShowTransitionsValuesAtState(int _index) { GUILayout.BeginHorizontal(); for (int j = 0; j < m_HMM.m_StatesCount; j++) { m_HMM.MSetTransition((_index * m_HMM.m_StatesCount) + j, EditorGUILayout.FloatField(m_HMM.MGetTransition((_index * m_HMM.m_StatesCount) + j))); } GUILayout.EndHorizontal(); }