【问题标题】:HMM using Accord.Net for gesture recognitionHMM 使用 Accord.Net 进行手势识别
【发布时间】:2014-02-05 17:09:30
【问题描述】:

我正在从事手势识别项目。我的数据集由 4 个不同的手势组成,每个手势集包含大约 70 张图像。我为每张图像提取了 4 个特征。我正在尝试使用 Accord.Net 来实现 HMM,并且我知道我将需要 4 个 HMM,每个手势一个,但我不确定如何构建用于学习/训练的特征向量序列阶段。有人知道怎么解决吗?

这是序列的简单代码:

double[][] sequences = new double[][] 
{
    new double[] { 0,1,2,3,4 }, // This is the first  sequence with label = 0 
    new double[] { 4,3,2,1,0 }, // This is the second sequence with label = 1
};

// Labels for the sequences 
int[] labels = { 0, 1 };

【问题讨论】:

    标签: c# gesture-recognition hidden-markov-models accord.net


    【解决方案1】:

    您是对的,每个手势都需要一个 HMM。但是,如果您使用 HiddenMarkovClassifier 类(它是在您尝试检测的每个类之后创建的多个 HMM 的包装器),框架已经可以为您提供这种构造。

    如果每张图像有 4 个特征,则需要假设能够对多变量特征进行建模的概率分布。一个简单的选择是假设您的特征彼此独立,并且它们中的每一个都遵循正态分布。

    因此,您可以使用以下示例代码来创建模型。它假设您的数据库只有两个训练序列,但实际上您必须有很多个。

    double[][][] sequences = new double[][][]
    {
        new double[][] // This is the first  sequence with label = 0
        { 
            new double[] { 0, 1, 2, 1 }, // <-- this is the 4-features feature vector for
            new double[] { 1, 2, 5, 2 }, //       the first image of the first sequence
            new double[] { 2, 3, 2, 5 },
            new double[] { 3, 4, 1, 1 },
            new double[] { 4, 5, 2, 2 },
        }, 
    
        new double[][] // This is the second sequence with label = 1
        {
            new double[] { 4,  3, 4, 1 }, // <-- this is the 4-features feature vector for
            new double[] { 3,  2, 2, 2 }, //       the first image of the second sequence
            new double[] { 2,  1, 1, 1 },
            new double[] { 1,  0, 2, 2 },
            new double[] { 0, -1, 1, 2 },
        }
    };
    
    // Labels for the sequences
    int[] labels = { 0, 1 };
    

    上面的代码显示了如何设置学习数据库。现在,一旦设置好了,您就可以为 4 个正态特征(假设正态分布之间的独立性)创建一个隐藏马尔可夫分类器

    // Create one base Normal distribution to be replicated accross the states
    var initialDensity = new MultivariateNormalDistribution(4); // we have 4 features
    
    // Creates a sequence classifier containing 2 hidden Markov Models with 2 states
    // and an underlying multivariate mixture of Normal distributions as density.
    var classifier = new HiddenMarkovClassifier<MultivariateNormalDistribution>(
        classes: 2, topology: new Forward(2), initial: initialDensity);
    
    // Configure the learning algorithms to train the sequence classifier
    var teacher = new HiddenMarkovClassifierLearning<MultivariateNormalDistribution>(
        classifier,
    
        // Train each model until the log-likelihood changes less than 0.0001
        modelIndex => new BaumWelchLearning<MultivariateNormalDistribution>(
            classifier.Models[modelIndex])
        {
            Tolerance = 0.0001,
            Iterations = 0,
    
            FittingOptions = new NormalOptions()
            {
                Diagonal = true,      // only diagonal covariance matrices
                Regularization = 1e-5 // avoid non-positive definite errors
            }
    
            // PS: Setting diagonal = true means the features will be
            // assumed independent of each other. This can also be
            // achieved by using an Independent<NormalDistribution>
            // instead of a diagonal multivariate Normal distribution
        }
    );
    

    最后,我们可以训练模型并在学习数据上测试其输出:

    // Train the sequence classifier using the algorithm
    double logLikelihood = teacher.Run(sequences, labels);
    
    
    // Calculate the probability that the given
    //  sequences originated from the model
    double likelihood, likelihood2;
    
    // Try to classify the 1st sequence (output should be 0)
    int c1 = classifier.Compute(sequences[0], out likelihood);
    
    // Try to classify the 2nd sequence (output should be 1)
    int c2 = classifier.Compute(sequences[1], out likelihood2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多