首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Accord.Net的HMM手势识别

基于Accord.Net的HMM手势识别
EN

Stack Overflow用户
提问于 2014-02-05 17:09:30
回答 1查看 1.9K关注 0票数 2

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

这是序列的简单代码:

代码语言:javascript
复制
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 };
EN

回答 1

Stack Overflow用户

发布于 2014-12-25 15:48:39

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

如果您对每幅图像有4个特征,则需要假设一个概率分布,该分布将能够建模您的多元特征。一个简单的选择是假设您的特性彼此独立,并且每个特性都遵循正态分布。

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

代码语言:javascript
复制
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个正态分布(假设正态分布之间的独立性)创建一个隐藏的马尔可夫分类器。

代码语言:javascript
复制
// 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
    }
);

最后,我们可以对该模型进行培训,并根据所获得的数据测试其输出:

代码语言:javascript
复制
// 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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21583822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档