/// \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> _MSetObservations(AKN_HiddenMarkovModel<int> _gestureHmm) /// /// \brief Update constructed Hmm with new observations 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> _MSetObservations(AKN_HiddenMarkovModel <int> _gestureHmm) { for (int k = 0; k < _gestureHmm.m_ObservationsCount; k++) { _gestureHmm.MSetObservation(k, k + 1); } return(_gestureHmm); }
/// \fn private AKN_HiddenMarkovModel<int> _MBuildHMMFromDirections(List<int> _directions) /// /// \brief Determine HMM praobabilities from given directions. /// /// \author Khoubaeib Klai | [email protected] /// \date 24/04/2014 /// /// \param _directions directions calculated from draw points /// /// \return Constructed HMM private AKN_HiddenMarkovModel <int> _MBuildHMMFromDirections(List <int> _directions) { _directions = _MRemoveDirectionRepetition(_directions); AKN_HiddenMarkovModel <int> gestureHmm = new AKN_HiddenMarkovModel <int>(_directions.Count, 17, m_gestureName); gestureHmm = _MSetObservations(gestureHmm); gestureHmm = _MSetStates(gestureHmm); gestureHmm = _MSetTransitions(gestureHmm); gestureHmm = _MSetEmissions(gestureHmm, _directions); return(gestureHmm); }
/// \fn private AKN_HiddenMarkovModel<int> _MSetStates(AKN_HiddenMarkovModel<int> _gestureHmm) /// /// \brief Update constructed Hmm with new states 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> _MSetStates(AKN_HiddenMarkovModel <int> _gestureHmm) { for (int j = 0; j < _gestureHmm.m_StatesCount; j++) { _gestureHmm[j].m_name = ("Etat " + j); _gestureHmm[j].m_startProbability = 0F; for (int k = 0; k < _gestureHmm.m_ObservationsCount; k++) { _gestureHmm.MSetEmissionByIndex(j, k, 0); } } _gestureHmm[0].m_startProbability = 0.5F; _gestureHmm[1].m_startProbability = 0.5F; return(_gestureHmm); }
/// \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 AKN_HiddenMarkovModel<int> _MSetEmissions(AKN_HiddenMarkovModel<int> _gestureHmm, List<int> _directions) /// /// \brief Update constructed Hmm with new emissions 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> _MSetEmissions(AKN_HiddenMarkovModel <int> _gestureHmm, List <int> _directions) { for (int j = 0; j < _gestureHmm.m_StatesCount; j++) { if (_directions[j] == 17) { _gestureHmm.MSetEmission(j, 17, 1f); } else if (_directions[j] > 0) { _gestureHmm.MSetEmission(j, _MAdjustAngle(_directions[j] + 2), 0.15F); _gestureHmm.MSetEmission(j, _MAdjustAngle(_directions[j] + 1), 0.2F); _gestureHmm.MSetEmission(j, _MAdjustAngle(_directions[j]), 0.3F); _gestureHmm.MSetEmission(j, _MAdjustAngle(_directions[j] - 1), 0.20F); _gestureHmm.MSetEmission(j, _MAdjustAngle(_directions[j] - 2), 0.15F); } } return(_gestureHmm); }