示例#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> _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);
 }