示例#1
0
        /// \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();
 }