使用Jahmm对观测进行分类

时间:2013-04-02 13:09:37

标签: machine-learning gesture-recognition hidden-markov-models

我目前正致力于手势识别应用程序,我正在使用HMM(通过Jahmm)。目前我有两个手势(上下),所以我建立了2个HMM,并提供了一些训练数据。

我使用BaumWelchLearner训练他们,我创建了一个从我的系统中获得的“样本”观察序列,我必须将其分类。

我认为我设法从我发现的小支持中完成了上述步骤。但目前我陷入了最后阶段,我正在尝试计算最符合当前序列的HMM,但我没有任何有用的输出(或者我可能无法理解它们)。这是我的示例代码,后跟输出。

    //gesture classes
    HmmUp up = new HmmUp();
    HmmDown down = new HmmDown();
    final Hmm<ObservationDiscrete<DirectionVector>> upLearnt;
    final Hmm<ObservationDiscrete<DirectionVector>> downLearnt;

    //train - should read TRAINED HMM OBJECTS in application
    BaumWelchLearner bwl = new BaumWelchLearner();
    bwl.setNbIterations(100);

    upLearnt = bwl.learn(up, up.getTrainingMaterial());
    downLearnt = bwl.learn(down, down.getTrainingMaterial());

    ArrayList<Hmm<ObservationDiscrete<DirectionVector>>> trainedHmms = new ArrayList<Hmm<ObservationDiscrete<DirectionVector>>>(){{
        add(upLearnt);
        add(downLearnt);
    }};

    ArrayList<ObservationDiscrete<DirectionVector>> currentSequence = new ArrayList<ObservationDiscrete<DirectionVector>>(){{
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.NoMovement));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Down));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Up));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Up));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Up));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Up));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Up));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.UpLeft));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Null));
        add(new ObservationDiscrete<DirectionVector>(DirectionVector.Null));
    }};

    //get the observation from the device (continuously feeding - 10 states always with nulls at the end?)
    for (Hmm<ObservationDiscrete<DirectionVector>> hmm : trainedHmms) {

        ViterbiCalculator vc = new ViterbiCalculator(currentSequence, hmm);
        for (int i = 0; i < vc.stateSequence().length; i++)
        {
            System.out.println(vc.stateSequence()[i]);
        }
        System.out.println(vc.lnProbability()); //e to the ln(x) = x

    }

这是我目前的输出,似乎是“空”状态序列和负概率?!!!

0 0 0 0 0 0 0 0 0 0 -1.7976931348623157E308

0 0 0 0 0 0 0 0 0 0 -56.294579216353064

0 个答案:

没有答案